code: function createBound(func, thisArg, partialArgs, indicator) {
        var isFunc = isFunction(func),
            isPartial = !partialArgs,
            key = thisArg;
  
        // juggle arguments
        if (isPartial) {
          var rightIndicator = indicator;
          partialArgs = thisArg;
        }
        else if (!isFunc) {
          if (!indicator) {
            throw new TypeError;
          }
          thisArg = func;
        }
  
        function bound() {
          // `Function#bind` spec
          // http://es5.github.com/#x15.3.4.5
          var args = arguments,
              thisBinding = isPartial ? this : thisArg;
  
          if (!isFunc) {
            func = thisArg[key];
          }
          if (partialArgs.length) {
            args = args.length
              ? (args = nativeSlice.call(args), rightIndicator ? args.concat(partialArgs) : partialArgs.concat(args))
              : partialArgs;
          }
          if (this instanceof bound) {
            // ensure `new bound` is an instance of `func`
            noop.prototype = func.prototype;
            thisBinding = new noop;
            noop.prototype = null;
  
            // mimic the constructor's `return` behavior
            // http://es5.github.com/#x13.2.2
            var result = func.apply(thisBinding, args);
            return isObject(result) ? result : thisBinding;
          }
          return func.apply(thisBinding, args);
        }
        return bound;
      }
docs: Creates a function that, when called, invokes `func` with the `this` binding
  of `thisArg` and prepends any `partialArgs` to the arguments passed to the
  bound function.
  
  @private
  @param {Function|String} func The function to bind or the method name.
  @param {Mixed} [thisArg] The `this` binding of `func`.
  @param {Array} partialArgs An array of arguments to be partially applied.
  @param {Object} [idicator] Used to indicate binding by key or partially
  applying arguments from the right.
  @returns {Function} Returns the new bound function.