code: function(obj){
  		if(obj == null) {
  			return 0;
  		}
  		var size = obj[sizeSymbol];
  		var count = 0;
  		if(size) {
  			return size.call(obj);
  		}
  		else if(helpers.hasLength(obj)){
  			return obj.length;
  		}
  		else if(typeReflections.isListLike(obj)){
  
  			shapeReflections.eachIndex(obj, function(){
  				count++;
  			});
  			return count;
  		}
  		else if( obj ) {
  			return shapeReflections.getOwnEnumerableKeys(obj).length;
  		}
  		else {
  			return undefined;
  		}
  	}
docs: @function can-reflect.size size
  @parent can-reflect/shape
  @description Return the number of items in the collection.
  
  @signature `.size(target)`
  
  Returns the number of items contained in `target`. Target can
  provide the size using the [can-symbol/symbols/size] symbol.
  
  If the `target` has a numeric `length` property that is greater than or equal to 0, that
  `length` will be returned.
  
  ```js
  canReflect.size([1,2,3]) //-> 3
  ```
  
  If the `target` is [can-reflect.isListLike], the values of the list will be counted.
  
  If the `target` is a plain JS object, the number of enumerable properties will be returned.
  
  ```js
  canReflect.size({foo:"bar"}) //-> 1
  ```
  
  If the `target` is anything else, `undefined` is returned.
  
  @param  {Object} target The container object.
  @return {Number} The number of values in the target.