docs: function () {
  					var coercions, coercionNames, activeCoercion, resetValueAndthrowExpound = function (message) {
  							this.value = undefined;
  							this.valueHasBeenSet = false;
  							throwExpound(message);
  						},
  						checkConstraint = function (type) {
  							var checkType;
  							//Bail if we have nothing to check 
  							if (!type) {
  								return true;
  							}
  							//Throw error if the type doesn't exist
  							checkType = self.types[type];
  							if (!checkType) {
  								throwExpound('Type Constraint "' + type + '" No longer exists.');
  							}
  
  							//Check parents recursively
  							if (checkType.extendsType) {
  								checkConstraint.call(this, checkType.extendsType);
  							}
  							if (!checkType.constraint(this.value)) {
  								throwExpound('Value ' + this.name + ' does not pass type constraint. Expecting: ' + type);
  							}
  							return true;
  						};
  					try {
  						return checkConstraint.call(this, this.type);
  					}
  
  					//This is the entire coercion funcitonality
  					//
  					catch (err) {
  						//Check to see if we have coerce set and if the type has coercions
  						coercions = self.types[this.type].coerceFrom;
  						coercionNames = Object.keys(coercions);
  						if (!this.coerce || coercionNames.length === 0) {
  							resetValueAndthrowExpound(err.message);
  						}
  
  						//If it does, find the first coercion that matches the value
  						activeCoercion = _.find(coercionNames, function (fromType) {
  							try {
  								var foo = checkConstraint.call(this, fromType);
  								return checkConstraint.call(this, fromType);
  							} catch (err) {
  								return false;
  							}
  						}, this);
  						//and then run the function associated with that coercion
  						if (activeCoercion) {
  							this.value = coercions[activeCoercion](this.value);
  						} else {
  							resetValueAndthrowExpound(err.message + '. Coerce is set to true, but the value does not match any registered coercions for the type');
  						}
  						//try to check the constraint against the new value
  						try {
  							checkConstraint.call(this, this.type);
  						} catch (e) {
  							resetValueAndthrowExpound('Coerced ' + e.message);
  						}
  					}
  					return true;
  				}