docs: function runner(Ctor, config, argv, cb) {
    var id = (module.parent && module.parent.id) || path.resolve(__dirname, '../..');
    debug('initializing <%s>, called from <%s>', __filename, id);
  
    /**
     * handle runner arguments errors
     */
    var err = validateRunnerArgs(Ctor, config, argv, cb);
    if (err) {
      cb(err);
      return;
    }
  
    /**
     * Shallow clone options
     */
  
    argv = merge({_: []}, argv);
    config = merge({cwd: process.cwd(), extensions: { '.js': null }}, config);
    config.processTitle = config.processTitle || config.name;
    config.moduleName = config.moduleName || config.name;
    config.configName = config.configName || config.name + 'file';
  
    /**
     * Set cwd (if not defined)
     *
     *   $ app --cwd="lib"
     *
     */
  
    if (typeof argv.cwd === 'undefined') {
      argv.cwd = config.cwd;
    }
  
    /**
     * Custom config file
     *
     *   $ app --verbfile="docs/foo.js"
     *
     */
  
    var customFile = argv.configfile || argv[config.configName];
    if (customFile) {
      argv.configPath = path.resolve(config.cwd, customFile);
    }
  
    /**
     * Initialize liftoff
     */
  
    var CLI = new Liftoff(config);
    utils.timestamp('starting ' + config.name);
  
    /**
     * Load environment
     */
  
    CLI.launch(argv, function(env) {
      debug('launching CLI');
  
      env.name = config.name;
      env.configName = config.configName;
      env.configFile = env.configName + '.js';
  
      var ctx = new RunnerContext(argv, config, env);
      try {
        var Base = env.modulePath ? require(env.modulePath) : Ctor;
        ctx.Base = Base;
  
        // get the instance to use
        var base = new Base();
        base.options = merge({}, base.options, merge({}, ctx.options, argv));
        base.set('cache.runnerContext', ctx);
  
        // load plugins
        runner.loadPlugins(base);
  
        // process `argv` and set on cache
        base.set('cache.argv', base.argv(argv));
        base.set('cache.config', ctx.pkgConfig);
        base.set('cache.env', ctx);
  
        // load local `[config]file.js` if one exists
        var fn = runner.resolveConfig(base, config, env);
        if (fn instanceof Base) {
          base = fn;
        }
  
        cb(null, base, ctx);
      } catch (err) {
        cb(err);
      }
    });
  }