public FileSubstitutionsProvider(string file, IFileLoader fileLoader)
        {
            Console.WriteLine($"New file substitution provider in {file} using {fileLoader} loader");
            if (!File.Exists(file))
            {
                throw new FileNotFoundException($"File does not exist: {file}");
            }
            this.fileLoader = fileLoader;
            this.file       = file;
            var fileName = Path.GetFileName(file);
            var filePath = Path.GetDirectoryName(file);

            watcher = new FileSystemWatcher(filePath, fileName);
            var changeLock = new Object();
            var lastChange = DateTime.Now;

            watcher.Changed += async(object source, FileSystemEventArgs e) =>
            {
                if (this.OnSubstitutionsUpdated != null &&
                    DateTime.Now.Subtract(lastChange).TotalMilliseconds > 1100) // Sometimes 2 events get triggered for same change
                {
                    lastChange = DateTime.Now;
                    Thread.Sleep(1000);
                    var substitutions = await fileLoader.loadFileAsync(file);
                    await OnSubstitutionsUpdated(substitutions);
                }
            };
            watcher.EnableRaisingEvents = true;
        }