code: function initCustomComponents() {
      if (typeof projectConfig.crux.components !== 'string') {
        return false;
      }
      var componentPath = path.normalize(global['__rootdir'] + '/' + projectConfig.crux.components + '/'),
        componentList;
      try {
        componentList = util.readDirectoryRelative(componentPath, 'directory', null, true);
      } catch (e) {
        // there are no app components.
        return false;
      }
      var self = this;
      _.forEach(componentList, function(compName) {
        if (self.__components.indexOf('custom:' + compName) === -1) return;
        try {
          var CompClass = require(path.normalize(componentPath + '/' + compName + '/index.js'));
        } catch (e) {
          console.log(e);
          if (e.message.indexOf('Cannot find module') !== -1 && e.message.indexOf('index.js') !== -1) {
            log.warn('Crux.application: Custom component "%s" does not have index.js. Skipping...', compName);
            return;
          }
          e.message = "[Crux.customComponent: " + compName + "] " + e.message;
          throw e;
        }
        if (typeof CompClass !== 'function' || CompClass.prototype.__type !== 'CruxComponent') {
          throw new Error('[Crux.run()] Crux custom component "' + compName + '" does not extend Crux.Component');
        }
        var compConfig = getComponentConfiguration(compName);
        var compObj = new CompClass(compConfig, appConfig);
        if (compObj.name === 'CruxComponent') {
          compObj.name = compName;
        }
        registryObj.register(compObj);
        compObj.registry(registryObj);
      });
    }
docs: /*
  Manually initializes the custom components given by the user in the componentPath