code: function(msg) {
        if (!msg && msg != 0) return false;
        var handled = false;
        var res = undefined;
  
        function hit(func) {
          /*
           * Pass *self* which points to wechat itself into keyword functions
           * This is useful for those complicated keyword handler. 
           * For those asynchronize handler, a node-style function should be 
           * returned. Promise related stuff will be handled here.
           */
          res = func.call(self, msg);
          if (typeof(res) == 'function') {
            res = Q.denodeify(res)();
          }
          handled = true;
          return false;
        }
  
        _.forEach(this._keywords_key, function(key, index) {
          var func = this._keywords_func[index];
          if (typeof(key) == 'string') {
            if (msg == key) return hit(func);
          } else if (key instanceof RegExp) {
            if (key.test(msg)) return hit(func);
          } else if (typeof(key) == 'function') {
            ret = key(msg);
            if (ret === true) return hit(func);
            if (ret !== false) return hit(ret);
          }
        }, this);
        if (handled) {
          console.log('keyword %s hit.', msg);
          return res;
        } else return false;
      }
docs: /*
  Handle special keyword-cases
  
  *msg*, required, users' input
  
  Such special keyword-cases will be handled only in functions added by
  addKeyword() and will not be passed to following process.
  
  Return false if keyword not hit; Otherwise, return,
  1. A value, that will be replied to client at once,
  2. A Promise, that is transformed from a node-style function
  configured by developer.