docs: function(getterSetter, context, eventName, bindOnce) {
  	var args = [];
  
  	for(var i = 0, arglen = arguments.length; i < arglen; i++) {
  		args[i] = arguments[i];
  	}
  
  	var contextType = typeof args[1];
  
  	if (typeof args[0] === 'function') {
  		// Getter/Setter functional computes.
  		// `new can.Compute(function(){ ... })`
  		this._setupGetterSetterFn(args[0], args[1], args[2], args[3]);
  	} else if (args[1] !== undefined) {
  		if (contextType === 'string' || contextType === 'number') {
  			// Property computes.
  			// `new can.Compute(object, propertyName[, eventName])`
  			var isListLike = canReflect.isObservableLike(args[0]) && canReflect.isListLike(args[0]);
  			var isMapLike = canReflect.isObservableLike(args[0]) && canReflect.isMapLike(args[0]);
  			if(isMapLike || isListLike) {
  				var map = args[0];
  				var propertyName = args[1];
  				var mapGetterSetter = function(newValue){
  					if(arguments.length) {
  						observeReader.set(map,propertyName, newValue);
  					} else {
  						// forces length to be read
  						if(isListLike) {
  							observeReader.get(map,"length");
  						}
  						return observeReader.get(map,""+propertyName);
  					}
  				};
  				this._setupGetterSetterFn(mapGetterSetter, args[1], args[2], args[3]);
  			} else {
  				this._setupProperty(args[0], args[1], args[2]);
  			}
  
  		} else if(contextType === 'function') {
  			// Setter computes.
  			// `new can.Compute(initialValue, function(newValue){ ... })`
  			this._setupSetter(args[0], args[1], args[2]);
  		} else {
  
  			if(args[1] && args[1].fn) {
  				// Async computes.
  				this._setupAsyncCompute(args[0], args[1]);
  			} else {
  				// Settings computes.
  				//`new can.Compute(initialValue, {on, off, get, set})`
  				this._setupSettings(args[0], args[1]);
  			}
  
  		}
  	} else {
  		// Simple value computes.
  		// `new can.Compute(initialValue)`
  		this._setupSimpleValue(args[0]);
  	}
  
  	this._args = args;
  	this._primaryDepth = 0;
  
  	this.isComputed = true;
  
  }