internal CompilationRecord Compile(CompilerContext context, FileInfo coffeeScriptFileInfo, List<string> includedRequiredFiles)
        {
            var inputFilePath = _preScriptLoadActions.Aggregate(coffeeScriptFileInfo.FullName, (current, action) => action(context, current));

            coffeeScriptFileInfo = new FileInfo(inputFilePath);

            context = new CompilerContext(context.CompilationRecorder, _isDebug) { WorkingDirectory = coffeeScriptFileInfo.Directory.FullName };

            var javaScriptFilePath = Regex.Replace(coffeeScriptFileInfo.FullName, coffeeScriptFileInfo.Extension + "$", ".js", RegexOptions.IgnoreCase);

            javaScriptFilePath = _preScriptOutputActions.Aggregate(javaScriptFilePath, (current, action) => action(context, current));

            using (var input = new StreamReader(File.OpenRead(coffeeScriptFileInfo.FullName)))
            {
                using (var output = new StreamWriter(File.Open(javaScriptFilePath, FileMode.Create)))
                {
                    Compile(context, input, output);
                }
            }

            context.CompilationRecorder.Stop();

            return context.CompilationRecorder.GetRecord();
        }
        private void Compile(CompilerContext context, StreamReader input, StreamWriter output)
        {
            var coffeeScript = input.ReadToEnd();

            coffeeScript = _preCompilationActions.Aggregate(coffeeScript, (current, action) => action(context, current));

            string javascript;

            try {
                javascript = CompileString(coffeeScript);
            } catch(JavaScriptException ex) {
                throw new CompilerException(ex.Message, ex);
            }

            javascript = _postCompilationActions.Aggregate(javascript, (current, action) => action(context, current));

            output.Write(javascript);
        }
 internal CompilationRecord Compile(string coffeeScriptFilePath, List<string> includedRequiredFiles)
 {
     var compilationRecorder = new CompilationRecorder();
     compilationRecorder.Start();
     var coffeeScriptFileInfo = new FileInfo(coffeeScriptFilePath);
     var context = new CompilerContext(compilationRecorder, _isDebug) { WorkingDirectory = coffeeScriptFileInfo.Directory.FullName };
     return Compile(context, coffeeScriptFileInfo,  includedRequiredFiles);
 }