text: var PromiseConstructor = typeof Promise === 'undefined' ? require('promise') : Promise,
      contexts = require("./contexts"),
      Parser = require('./parser/parser'),
      PluginManager = require('./plugin-manager');
  
  module.exports = function(environment, ParseTree, ImportManager) {
      var render = function (input, options, callback) {
          options = options || {};
  
          if (typeof(options) === 'function') {
              callback = options;
              options = {};
          }
  
          if (callback) {
              render.call(this, input, options)
                  .then(function(css) {
                      callback(null, css);
                  },
                  function(error) {
                      callback(error);
                  });
          } else {
              var context,
                  rootFileInfo,
                  pluginManager = new PluginManager(this);
  
              pluginManager.addPlugins(options.plugins);
              options.pluginManager = pluginManager;
  
              context = new contexts.Parse(options);
  
              if (options.rootFileInfo) {
                  rootFileInfo = options.rootFileInfo;
              } else {
                  var filename = options.filename || "input";
                  var entryPath = filename.replace(/[^\/\\]*$/, "");
                  rootFileInfo = {
                      filename: filename,
                      relativeUrls: context.relativeUrls,
                      rootpath: context.rootpath || "",
                      currentDirectory: entryPath,
                      entryPath: entryPath,
                      rootFilename: filename
                  };
              }
  
              var imports = new ImportManager(context, rootFileInfo);
              var parser = new Parser(context, imports, rootFileInfo);
  
              return new PromiseConstructor(function (resolve, reject) {
                  parser.parse(input, function (e, root) {
                      if (e) { return reject(e); }
                      try {
                          var parseTree = new ParseTree(root, imports);
                          var result = parseTree.toCSS(options);
                          resolve(result);
                      }
                      catch (err) { reject( err); }
                  }, options);
              });
          }
      };
      return render;
  };
  