text: var assignValue = require('./_assignValue'),
      copyObject = require('./_copyObject'),
      createAssigner = require('./_createAssigner'),
      isArrayLike = require('./isArrayLike'),
      isPrototype = require('./_isPrototype'),
      keys = require('./keys');
  
  /** Used for built-in method references. */
  var objectProto = Object.prototype;
  
  /** Used to check objects for own properties. */
  var hasOwnProperty = objectProto.hasOwnProperty;
  
  /**
   * Assigns own enumerable string keyed properties of source objects to the
   * destination object. Source objects are applied from left to right.
   * Subsequent sources overwrite property assignments of previous sources.
   *
   * **Note:** This method mutates `object` and is loosely based on
   * [`Object.assign`](https://mdn.io/Object/assign).
   *
   * @static
   * @memberOf _
   * @since 0.10.0
   * @category Object
   * @param {Object} object The destination object.
   * @param {...Object} [sources] The source objects.
   * @returns {Object} Returns `object`.
   * @see _.assignIn
   * @example
   *
   * function Foo() {
   *   this.a = 1;
   * }
   *
   * function Bar() {
   *   this.c = 3;
   * }
   *
   * Foo.prototype.b = 2;
   * Bar.prototype.d = 4;
   *
   * _.assign({ 'a': 0 }, new Foo, new Bar);
   * // => { 'a': 1, 'c': 3 }
   */
  var assign = createAssigner(function (object, source) {
      if (isPrototype(source) || isArrayLike(source)) {
          copyObject(source, keys(source), object);
          return;
      }
      for (var key in source) {
          if (hasOwnProperty.call(source, key)) {
              assignValue(object, key, source[key]);
          }
      }
  });
  
  module.exports = assign;
  