constructor: function() {
    yoUtils.Base.apply(this, arguments);

    // add usage options
    this.option('skip-message', {
      desc: 'Suppress generator messages',
      defaults: false
    });
    this.option('force-config', {
      desc: 'Force overwritting of previous config values',
      defaults: false
    });
    var uds = ['', 'route', 'controller'];
    for (var i = 0, udsLength = uds.length; i < udsLength; i++) {
      var ud = uds[i];
      this.option((ud ? ud + '-' : '') + 'use-defaults', {
        desc: 'Skip all ' + (ud ? ud + ' ' : '') + 'prompts and use defaults'
      });
    }
    for (var opt in routeCfg.options) {
      this.option(opt, routeCfg.options[opt]);
    }
    for (var opt in controllerCfg.options) {
      this.option(opt, controllerCfg.options[opt]);
    }
  },
var ExpressComponentGenerator = module.exports = yoUtils.Base.extend({

  constructor: function() {
    yoUtils.Base.apply(this, arguments);

    // add usage options
    this.option('skip-message', {
      desc: 'Suppress generator messages',
      defaults: false
    });
    this.option('force-config', {
      desc: 'Force overwritting of previous config values',
      defaults: false
    });
    var uds = ['', 'route', 'controller'];
    for (var i = 0, udsLength = uds.length; i < udsLength; i++) {
      var ud = uds[i];
      this.option((ud ? ud + '-' : '') + 'use-defaults', {
        desc: 'Skip all ' + (ud ? ud + ' ' : '') + 'prompts and use defaults'
      });
    }
    for (var opt in routeCfg.options) {
      this.option(opt, routeCfg.options[opt]);
    }
    for (var opt in controllerCfg.options) {
      this.option(opt, controllerCfg.options[opt]);
    }
  },

  initializing: function() {
    if (!this.options['skip-message']) {
      console.log(chalk.magenta('Express goodies brought to you by generator-express-component.\n'));
    }

    /* define lodash */
    _ = this._;

    /* generator defaults */
    this.defaults = {
      route: routeCfg.defaults,
      controller: controllerCfg.defaults
    }

    /* check for "use-defaults" */
    this.useDefaults = function(gen) {
      return (this.options['use-defaults'] || this.options[gen + '-use-defaults']);
    };
  },

  prompting: {

    routeCfg: function() {
      if (this.useDefaults('route')) {
        config.route = this.defaults.route;
      } else {
        var done = this.async();
        var ops = yoUtils.app.pluckOps(/^route-/, this.options);
        var prompts = routeCfg.prompts(ops, true);

        this.prompt(prompts, function(answers) {
          config.route = _.extend(ops, answers);
          done();
        });
      }
    },

    controllerCfg: function() {
      if (this.useDefaults('controller')) {
        config.controller = this.defaults.controller;
      } else {
        var done = this.async();
        var ops = yoUtils.app.pluckOps(/^controller-/, this.options);
        var prompts = controllerCfg.prompts(ops, true);

        this.prompt(prompts, function(answers) {
          config.controller = _.extend(ops, answers);
          done();
        });
      }
    }
  },

  configuring: {
    saveConfig: function() {
      if (!this.options['skip-message']) {
        console.log(chalk.magenta('Initializing yo-rc.json configuration.\n'));
      }

      if (this.options['force-config']) {
        for (var k in config) {
          this.config.set(k, config[k]);
        }
        this.config.forceSave();
      } else {
        this.config.defaults(config);
      }
    }
  }
});