function baseCreateWrapper(data) {
      var func = data[0],
          bitmask = data[1],
          arity = data[2],
          thisArg = data[3],
          partialArgs = data[4],
          partialRightArgs = data[5],
          partialHolders = data[6],
          partialRightHolders = data[7];

      var isBind = bitmask & BIND_FLAG,
          isBindKey = bitmask & BIND_KEY_FLAG,
          isCurry = bitmask & CURRY_FLAG,
          isCurryBound = bitmask & CURRY_BOUND_FLAG,
          key = func;

      function bound() {
        var thisBinding = isBind ? thisArg : this;
        if (partialArgs) {
          var args = composeArgs(partialArgs, partialHolders, arguments);
        }
        if (partialRightArgs) {
          args = composeArgsRight(partialRightArgs, partialRightHolders, args || arguments);
        }
        if (isCurry) {
          var argsLength = arguments.length;
          if (argsLength < arity) {
            args || (args = slice(arguments));
            bitmask |= PARTIAL_FLAG;
            bitmask &= ~PARTIAL_RIGHT_FLAG
            if (!isCurryBound) {
              bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);
            }
            var newArity = nativeMax(0, arity - argsLength);
            return baseCreateWrapper([func, bitmask, newArity, thisArg, args, null, []]);
          }
        }
        args || (args = arguments);
        if (isBindKey) {
          func = thisBinding[key];
        }
        if (this instanceof bound) {
          thisBinding = baseCreate(func.prototype);
          var result = func.apply(thisBinding, args);
          return isObject(result) ? result : thisBinding;
        }
        return func.apply(thisBinding, args);
      }
      setData(bound, data);
      return bound;
    }
The base implementation of `createWrapper` that creates the wrapper and
sets its meta data.

@private
@param {Array} data The metadata array.
@returns {Function} Returns the new function.