/**
 * @module objects
 */

modules.define('objects', function(provide) {

var hasOwnProp = Object.prototype.hasOwnProperty;

provide({
    extend : function(target) {
        typeof target !== 'object' && (target = {});

        for(var i = 1, len = arguments.length; i < len; i++) {
            var obj = arguments[i];
            if(obj) {
                for(var key in obj) {
                    hasOwnProp.call(obj, key) && (target[key] = obj[key]);
                }
            }
        }

        return target;
    },

    isEmpty : function(obj) {
        for(var key in obj) {
            if(hasOwnProp.call(obj, key)) {
                return false;
            }
        }

        return true;
    },

    each : function(obj, fn, ctx) {
        for(var key in obj) {
            if(hasOwnProp.call(obj, key)) {
                ctx? fn.call(ctx, obj[key], key) : fn(obj[key], key);
            }
        }
    }
});

});

@@ -129,16 +129,170 @@
 ovide(%7B%0A
+    /**%0A     * Extends a given target by%0A     * @param %7BObject%7D target object to extend%0A     * @param %7B...Object%7D source%0A     * @returns %7BObject%7D%0A     */%0A
     exte
@@ -311,16 +311,24 @@
 n(target
+, source
 ) %7B%0A    
@@ -681,24 +681,174 @@
 et;%0A    %7D,%0A%0A
+    /**%0A     * Check whether a given object is empty (contains no enumerable properties)%0A     * @param %7BObject%7D obj%0A     * @returns %7BBoolean%7D%0A     */%0A
     isEmpty 
@@ -1019,24 +1019,216 @@
 ue;%0A    %7D,%0A%0A
+    /**%0A     * Generic iterator function over object%0A     * @param %7BObject%7D obj object to iterate%0A     * @param %7BFunction%7D fn callback%0A     * @param %7BObject%7D %5Bctx%5D callbacks's context%0A     */%0A
     each : f
@@ -1430,12 +1430,11 @@
  %7D%0A%7D);%0A%0A
+
 %7D);
-%0A

add jsdoc