code: function of(x) {
      if (!(0, _is.isset)(x)) {
        return undefined;
      }
  
      var constructor = x.constructor;
  
      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
        args[_key - 1] = arguments[_key];
      }
  
      if (constructor.hasOwnProperty('of')) {
        return (0, _function.apply)(constructor.of, args);
      } else if ((0, _is.isUsableImmutablePrimitive)(x)) {
        return (0, _function.apply)(constructor, args);
      } else if ((0, _is.isFunction)(constructor)) {
        return _construct(constructor, args);
      }
  
      return undefined;
    }
docs: Creates a value `of` given type;  Checks for one of the following construction strategies (in order listed):
  @example
  // - If exists `(value).constructor.of` uses this.
  // - If value is of one String, Boolean, Symbol, or Number types calls it's
  //      constructor as a function (in cast form;  E.g., `constructor(...args)` )
  // - Else if constructor is a function, thus far, then calls constructor using
  //      the `new` keyword (with any passed in args).
  
  @function module:object.of
  @param x {*} - Value to derive returned value's type from.
  @param [args] {...*} - Any args to pass in to matched construction strategy.
  @returns {*|undefined} - New value of given value's type else `undefined`.