(function () { "use strict"; /*global extended isExtended*/ function defineObject(extended, is, arr) { var deepEqual = is.deepEqual, isString = is.isString, isHash = is.isHash, difference = arr.difference, hasOwn = Object.prototype.hasOwnProperty, isFunction = is.isFunction; function _merge(target, source) { var name, s; for (name in source) { if (hasOwn.call(source, name)) { s = source[name]; if (!(name in target) || (target[name] !== s)) { target[name] = s; } } } return target; } function _deepMerge(target, source) { var name, s, t; for (name in source) { if (hasOwn.call(source, name)) { s = source[name]; t = target[name]; if (!deepEqual(t, s)) { if (isHash(t) && isHash(s)) { target[name] = _deepMerge(t, s); } else if (isHash(s)) { target[name] = _deepMerge({}, s); } else { target[name] = s; } } } } return target; } function merge(obj) { if (!obj) { obj = {}; } for (var i = 1, l = arguments.length; i < l; i++) { _merge(obj, arguments[i]); } return obj; // Object } function deepMerge(obj) { if (!obj) { obj = {}; } for (var i = 1, l = arguments.length; i < l; i++) { _deepMerge(obj, arguments[i]); } return obj; // Object } function extend(parent, child) { var proto = parent.prototype || parent; merge(proto, child); return parent; } function forEach(hash, iterator, scope) { if (!isHash(hash) || !isFunction(iterator)) { throw new TypeError(); } var objKeys = keys(hash), key; for (var i = 0, len = objKeys.length; i < len; ++i) { key = objKeys[i]; iterator.call(scope || hash, hash[key], key, hash); } return hash; } function filter(hash, iterator, scope) { if (!isHash(hash) || !isFunction(iterator)) { throw new TypeError(); } var objKeys = keys(hash), key, value, ret = {}; for (var i = 0, len = objKeys.length; i < len; ++i) { key = objKeys[i]; value = hash[key]; if (iterator.call(scope || hash, value, key, hash)) { ret[key] = value; } } return ret; } function values(hash) { if (!isHash(hash)) { throw new TypeError(); } var objKeys = keys(hash), ret = []; for (var i = 0, len = objKeys.length; i < len; ++i) { ret.push(hash[objKeys[i]]); } return ret; } function keys(hash) { if (!isHash(hash)) { throw new TypeError(); } var ret = []; for (var i in hash) { if (hasOwn.call(hash, i)) { ret.push(i); } } return ret; } function invert(hash) { if (!isHash(hash)) { throw new TypeError(); } var objKeys = keys(hash), key, ret = {}; for (var i = 0, len = objKeys.length; i < len; ++i) { key = objKeys[i]; ret[hash[key]] = key; } return ret; } function toArray(hash) { if (!isHash(hash)) { throw new TypeError(); } var objKeys = keys(hash), key, ret = []; for (var i = 0, len = objKeys.length; i < len; ++i) { key = objKeys[i]; ret.push([key, hash[key]]); } return ret; } function omit(hash, omitted) { if (!isHash(hash)) { throw new TypeError(); } if (isString(omitted)) { omitted = [omitted]; } var objKeys = difference(keys(hash), omitted), key, ret = {}; for (var i = 0, len = objKeys.length; i < len; ++i) { key = objKeys[i]; ret[key] = hash[key]; } return ret; } var hash = { forEach: forEach, filter: filter, invert: invert, values: values, toArray: toArray, keys: keys, omit: omit }; var obj = { extend: extend, merge: merge, deepMerge: deepMerge, omit: omit }; var ret = extended.define(is.isObject, obj).define(isHash, hash).define(is.isFunction, {extend: extend}).expose({hash: hash}).expose(obj); var orig = ret.extend; ret.extend = function __extend() { if (arguments.length === 1) { return orig.extend.apply(ret, arguments); } else { extend.apply(null, arguments); } }; return ret; } if ("undefined" !== typeof exports) { if ("undefined" !== typeof module && module.exports) { module.exports = defineObject(require("extended"), require("is-extended"), require("array-extended")); } } else if ("function" === typeof define && define.amd) { define(["extended", "is-extended", "array-extended"], function (extended, is, array) { return defineObject(extended, is, array); }); } else { this.objectExtended = defineObject(this.extended, this.isExtended, this.arrayExtended); } }).call(this);