code: function(key, func) {
        if (key == undefined || key == null || _.isNaN(key) || _.isEqual(key, {})
          || _.isEqual(key, []) || key == '')
          return;
        if (key instanceof RegExp || typeof(key) == 'function') {
          this._keywords_key.push(key);
          this._keywords_func.push(func);
        } else if (_.isArray(key)) {
          if (func === undefined) {
            _.forEach(key, function(k) {
              this.addKeyword(k.key, k.func);
            }, this);
          } else {
            _.forEach(key, function(k) {
              this.addKeyword(k, func);
            }, this);
          }
        } else if (typeof(key) == 'object') {
          _.forEach(key, function(f, k) {
            this._keywords_key.push(k);
            this._keywords_func.push(f);
          }, this);
        } else {
          key = '' + key;
          this._keywords_key.push(key);
          this._keywords_func.push(func);
        }
      }
docs: /*
  Add keyword-case to support keyword().
  
  To provide dynamic keyword functionality (supposed to be rare case),
  the following code is similar to code of addHack().
  *key* is similar to those for addHack(). However,
  *func* is a function which accepts users' input that produces the
  output and responds to client directly. It could yield a value which
  will be replied to client at once; Or yield a node-style function which
  will be transformed into a Promise if it contains asynchronized logic.
  
  handlerText() will handle keyword-cases after hack(). Those inputs that
  hit a keyword-case will be handled only in corresponding *func* and will
  not be passed to following process.