| var path = require('path');
var fs = require('fs');
var noop = function () { };
// This is a really hacky way to get grunt to support sub project Gruntfiles
// the alternative is process forking but that was to slow.
module.exports = function (grunt) {
  grunt.registerMultiTask('subgrunt', 'Runs a grunt tasks in the same process', function () {
    var dirPath = this.data.path;
    var oldDir = process.cwd();
    var oldConfig = grunt.config();
    var gruntFilePath = path.join(dirPath, 'Gruntfile.js');
    if (!fs.lstatSync(gruntFilePath).isFile()) {
      throw new Error(gruntFilePath + ' was not found.');
    }
    grunt.log.ok('Grunt file:', path.join(dirPath, 'Gruntfile.js'));
    var gruntFile = require(path.resolve(gruntFilePath));
    var tasksToExecute = [];
    grunt.registerTask('done', 'Done', function () {
      process.chdir(oldDir);
      grunt.initConfig(oldConfig);
    });
    // Fake grunt api
    gruntFile({
      file: grunt.file,
      option: grunt.option,
      initConfig: function (config) {
        grunt.initConfig(config);
      },
      registerTask: function (task, tasks) {
        if (task === 'default') {
          tasksToExecute = tasks;
        }
      },
      task: {
        loadTasks: noop
      }
    });
    process.chdir(dirPath);
    grunt.task.run(tasksToExecute.concat(['done']));
  });
};
 |