docs: function(obj){
  		// own enumerable keys (aliased as keys)
  		var getOwnEnumerableKeys = obj[canSymbol.for("can.getOwnEnumerableKeys")];
  		if(getOwnEnumerableKeys) {
  			return getOwnEnumerableKeys.call(obj);
  		}
  		if( obj[canSymbol.for("can.getOwnKeys")] && obj[canSymbol.for("can.getOwnKeyDescriptor")] ) {
  			var keys = [];
  			shapeReflections.eachIndex(shapeReflections.getOwnKeys(obj), function(key){
  				var descriptor =  shapeReflections.getOwnKeyDescriptor(obj, key);
  				if(descriptor.enumerable) {
  					keys.push(key);
  				}
  			}, this);
  
  			return keys;
  		} /*else if(obj[canSymbol.iterator]){
  			var iter = obj[canSymbol.iterator](obj);
  			var index = 0;
  			var keys;
  			return {
  				next: function(){
  					var res = iter.next();
  					if(index++)
  				}
  			}
  			while(!().done) {
  
  				if( callback.call(context || list, res.value, index++, list) === false ){
  					break;
  				}
  			}
  		}*/ else {
  			return Object_Keys(obj);
  		}
  	}