code: function joinMethods(methods) {
    var mode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'value';
    var simpleJoinedMethod;
    var _iteratorNormalCompletion4 = true;
    var _didIteratorError4 = false;
    var _iteratorError4 = undefined;
  
    try {
      var _loop3 = function _loop3() {
        var method = _step4.value;
        var old = simpleJoinedMethod;
  
        if (old) {
          simpleJoinedMethod = function simpleJoinedMethod() {
            for (var _len4 = arguments.length, args = new Array(_len4), _key5 = 0; _key5 < _len4; _key5++) {
              args[_key5] = arguments[_key5];
            }
  
            return method.call.apply(method, [this, mode === 'value' ? old.call.apply(old, [this].concat(args)) : old].concat(args));
          };
        } else {
          simpleJoinedMethod = method;
        }
      };
  
      for (var _iterator4 = methods[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
        _loop3();
      }
    } catch (err) {
      _didIteratorError4 = true;
      _iteratorError4 = err;
    } finally {
      try {
        if (!_iteratorNormalCompletion4 && _iterator4.return != null) {
          _iterator4.return();
        }
      } finally {
        if (_didIteratorError4) {
          throw _iteratorError4;
        }
      }
    }
  
    return simpleJoinedMethod;
  }
docs: [joinMethods description]
  @param  {[Function[]]} methods        [description]
  @param  {String} [mode='value'] [value, pipeline]
  @return {[Function]}                [description]