| // 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; | 
|   } | 
| }; |