*
@method [enumerable](<obj>)
@returns Boolean
@short Enumerable methods in the Array package are also available to the Object class. They will perform their normal operations for every property in <obj>.
@extra In cases where a callback is used, instead of %element, index%, the callback will instead be passed %key, value%. Enumerable methods are also available to extended objects as instance methods.

@set
each
map
any
all
none
count
find
findAll
reduce
isEmpty
sum
average
min
max
least
most

@example

Object.any({foo:'bar'}, 'bar')            -> true
Object.extended({foo:'bar'}).any('bar')   -> true
Object.isEmpty({})                        -> true
+   Object.map({ fred: { age: 52 } }, 'age'); -> { fred: 52 }

*
function buildEnumerableMethods(names, mapping) {
    extendSimilar(object, false, false, names, function(methods, name) {
      methods[name] = function(obj, arg1, arg2) {
        var result, coerced = keysWithCoercion(obj);
        result = array.prototype[name].call(coerced, function(key) {
          if(mapping) {
            return transformArgument(obj[key], arg1, obj, [key, obj[key], obj]);
          } else {
            return multiMatch(obj[key], arg1, obj, [key, obj[key], obj]);
          }
        }, arg2);
        if(isArray(result)) {
          // The method has returned an array of keys so use this array
          // to build up the resulting object in the form we want it in.
          result = result.reduce(function(o, key, i) {
            o[key] = obj[key];
            return o;
          }, {});
        }
        return result;
      };
    });
    buildObjectInstanceMethods(names, Hash);
  }