code: function template(paths, options) {
    options = options || {};
    var callback = options.callback;
    var reader = options.reader || this.templateReader;
  
    // Deal with a list of paths in the general case.
    if (!(paths instanceof Array)) { paths = [paths]; }
  
    var input = '';
    if (!callback) {
      for (var i = 0, pathLen = paths.length; i < pathLen; i++) {
        if (options.asString) {
          input += paths[i];
        } else {
          input += '' + fs.readFileSync(paths[i]);
        }
      }
      var result = reader.create(input);
      result.paths = paths;
      return result;
  
    } else {
      // We have a callback.
      var pathLen = paths.length;
      var pathCounter = 0;
      paths.forEach(function(path, i) {
        if (options.asString) {
          var getInput = function(cb) { cb(path); };
        } else {
          var getInput = function(cb) {
            fs.readFile(path, function(err, string) {
              if (err != null) {
                log('Error reading template file:\n' + err, 'error');
                return cb('');
              }
              return cb('' + string);
            });
          };
        }
        getInput(function(fileInput) {
          pathCounter++;
          input += fileInput;
  
          if (pathCounter >= pathLen) {
            var result = reader.create(input);
            result.paths = paths;
            callback(result);
          }
        });
      });
    }
  }
docs: paths: paths to templating file (String), or to an Array of templating files. options: - reader: template reader function. - asString: use the string as a template, not as a file path. - callback: function taking a function(scope) → readableStream. If you don't want the template creation to be synchronous, use this. We return nothing from the function if `callback` is set. Returns a function(scope) → readableStream, unless `callback` is set.