| // Generated by CoffeeScript 1.6.3 |
| var object, _common, |
| __hasProp = {}.hasOwnProperty; |
| |
| _common = require('./_common'); |
| |
| module.exports = object = { |
| isBareObject: _common.isBareObject.bind(_common), |
| /* |
| if object is an instance of a class |
| */ |
| |
| isInstance: function(what) { |
| return !this.isBareObject(what); |
| }, |
| /* |
| Alias to _common.typeOf |
| */ |
| |
| typeOf: _common.typeOf.bind(_common), |
| /* |
| Alias to _common.clone |
| */ |
| |
| clone: _common.clone.bind(_common), |
| /* |
| Empties an object of its properties. |
| */ |
| |
| empty: function(o) { |
| var prop; |
| for (prop in o) { |
| if (o.hasOwnProperty(prop)) { |
| delete o[prop]; |
| } |
| } |
| return o; |
| }, |
| /* |
| Empties an object. Doesn't check for hasOwnProperty, so it's a tiny |
| bit faster. Use it for plain objects. |
| */ |
| |
| fastEmpty: function(o) { |
| var property; |
| for (property in o) { |
| delete o[property]; |
| } |
| return o; |
| }, |
| /* |
| Overrides values fomr `newValues` on `base`, as long as they |
| already exist in base. |
| */ |
| |
| overrideOnto: function(base, newValues) { |
| var key, newVal, oldVal; |
| if (!this.isBareObject(newValues) || !this.isBareObject(base)) { |
| return base; |
| } |
| for (key in base) { |
| oldVal = base[key]; |
| newVal = newValues[key]; |
| if (newVal === void 0) { |
| continue; |
| } |
| if (typeof newVal !== 'object' || this.isInstance(newVal)) { |
| base[key] = this.clone(newVal); |
| } else { |
| if (typeof oldVal !== 'object' || this.isInstance(oldVal)) { |
| base[key] = this.clone(newVal); |
| } else { |
| this.overrideOnto(oldVal, newVal); |
| } |
| } |
| } |
| return base; |
| }, |
| /* |
| Takes a clone of 'base' and runs #overrideOnto on it |
| */ |
| |
| override: function(base, newValues) { |
| return this.overrideOnto(this.clone(base), newValues); |
| }, |
| append: function(base, toAppend) { |
| return this.appendOnto(this.clone(base), toAppend); |
| }, |
| appendOnto: function(base, toAppend) { |
| var key, newVal, oldVal; |
| if (!this.isBareObject(toAppend) || !this.isBareObject(base)) { |
| return base; |
| } |
| for (key in toAppend) { |
| if (!__hasProp.call(toAppend, key)) continue; |
| newVal = toAppend[key]; |
| if (newVal === void 0) { |
| continue; |
| } |
| if (typeof newVal !== 'object' || this.isInstance(newVal)) { |
| base[key] = newVal; |
| } else { |
| oldVal = base[key]; |
| if (typeof oldVal !== 'object' || this.isInstance(oldVal)) { |
| base[key] = this.clone(newVal); |
| } else { |
| this.appendOnto(oldVal, newVal); |
| } |
| } |
| } |
| return base; |
| }, |
| groupProps: function(obj, groups) { |
| var def, defs, grouped, key, name, shouldAdd, val, _i, _len; |
| grouped = {}; |
| for (name in groups) { |
| defs = groups[name]; |
| grouped[name] = {}; |
| } |
| grouped['rest'] = {}; |
| top: //; |
| for (key in obj) { |
| val = obj[key]; |
| shouldAdd = false; |
| for (name in groups) { |
| defs = groups[name]; |
| if (!Array.isArray(defs)) { |
| defs = [defs]; |
| } |
| for (_i = 0, _len = defs.length; _i < _len; _i++) { |
| def = defs[_i]; |
| if (typeof def === 'string') { |
| if (key === def) { |
| shouldAdd = true; |
| } |
| } else if (def instanceof RegExp) { |
| if (def.test(key)) { |
| shouldAdd = true; |
| } |
| } else if (def instanceof Function) { |
| if (def(key)) { |
| shouldAdd = true; |
| } |
| } else { |
| throw Error('Group definitions must either\ |
| be strings, regexes, or functions.'); |
| } |
| if (shouldAdd) { |
| grouped[name][key] = val; |
| continue top; |
| } |
| } |
| } |
| grouped['rest'][key] = val; |
| } |
| return grouped; |
| } |
| }; |