function shimIsPlainObject(value) {
      var Ctor,
          support = lodash.support;

      // exit early for non `Object` objects
      if (!(value && typeof value == 'object' &&
            toString.call(value) == objectClass && !isHostObject(value)) ||
          (!hasOwnProperty.call(value, 'constructor') &&
            (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor))) ||
          (!support.argsClass && isArguments(value))) {
        return false;
      }
      // IE < 9 iterates inherited properties before own properties. If the first
      // iterated property is an object's own property then there are no inherited
      // enumerable properties.
      var result;
      if (support.ownLast) {
        baseForIn(value, function(subValue, key, object) {
          result = hasOwnProperty.call(object, key);
          return false;
        });
        return result !== false;
      }
      // In most environments an object's own properties are iterated before
      // its inherited properties. If the last iterated property is an object's
      // own property then there are no inherited enumerable properties.
      baseForIn(value, function(subValue, key) {
        result = key;
      });
      return typeof result == 'undefined' || hasOwnProperty.call(value, result);
    }
A fallback implementation of `_.isPlainObject` which checks if `value`
is an object created by the `Object` constructor or has a `[[Prototype]]`
of `null`.

@private
@param {*} value The value to check.
@returns {boolean} Returns `true` if `value` is a plain object, else `false`.