function assign( target ) {
	var source;
	var keys;
	var key;
	var len;
	var to;
	var i;
	var j;
	if ( target === void 0 || target === null ) {
		throw new TypeError( format( 'invalid argument. First argument must be a non-null object. Value: `%s`.', target ) );
	}
	to = Object( target );
	for ( i = 1; i < arguments.length; i++ ) {
		source = arguments[ i ];
		if ( source === void 0 || source === null ) {
			continue;
		}

		keys = enumerableProperties( Object( source ) );
		len = keys.length;
		for ( j = 0; j < len; j++ ) {
			key = keys[ j ];
			to[ key ] = source[ key ];
		}
	}
	return to;
}
Copies own enumerable properties from source objects to a target object.

## Notes

-   If a property key is present in multiple sources, the property from the last source that defines the key prevails.
-   The target object is mutated.

@param {Object} target - target object
@param {...Object} source - source object(s)
@throws {TypeError} first argument must not be null or undefined
@returns {Object} target object

@example
var obj1 = {
    'a': 'beep'
};
var obj2 = {
    'b': 'boop'
};

var out = assign( obj1, obj2 );
// returns { 'a': 'beep', 'b': 'boop' }