code: function extend(object, subject, ignoredKeys) {
      if (arrayOrNil(subject)) {
        for (var len = subject.length; --len >= 0;) { extend(object, subject[len], ignoredKeys); }
      } else {
        ignoredKeys = ignoredKeys || { constructor: 1, $super: 1, prototype: 1, $superp: 1 };
  
        var iClass     = classOrNil(object),
            isSubClass = classOrNil(subject),
            oPrototype = object.prototype, key, proto;
  
        // copy static properties and prototype.* to object
        if (mapOrNil(subject) || iClass) {
          for (key in subject) {
            copier(key, subject[key], ignoredKeys, object, iClass, oPrototype);
          }
        }
  
        if (isSubClass) {
          proto = subject.prototype;
          for (key in proto) {
            copier(key, proto[key], ignoredKeys, object, iClass, oPrototype);
          }
        }
  
        // prototype properties
        if (iClass && isSubClass) { extend(oPrototype, subject.prototype, ignoredKeys); }
      }
    }
docs: Extend object from subject, ignore properties in ignoredKeys
  @param object the child
  @param subject the parent
  @param ignoredKeys (optional) keys should not be copied to child