code: function fulfills(instance, protocol) {
  	assertArgumentNotNullOrUndefined(instance, ERROR_MESSAGES.NULL, 'Object', 'fulfills');
  	assertArgumentNotNullOrUndefined(protocol, ERROR_MESSAGES.NULL, 'Protocol', 'fulfills');
  
  	var protocolIsConstructor = typeof protocol === 'function';
  	if (protocolIsConstructor && isA(instance, protocol)) {
  		return true;
  	}
  
  	var requirement = protocolIsConstructor ? protocol.prototype : protocol;
  	for (var item in requirement) {
  		var type = typeof instance[item];
  		var required = requirement[item];
  
  		if (required === Number) {
  			if (type !== 'number') {
  				return false;
  			}
  		} else if (required === Object) {
  			if (type !== 'object') {
  				return false;
  			}
  		} else if (required === String) {
  			if (type !== 'string') {
  				return false;
  			}
  		} else if (required === Boolean) {
  			if (type !== 'boolean') {
  				return false;
  			}
  		} else {
  			if (type !== typeof required) {
  				return false;
  			}
  		}
  	}
  
  	return true;
  }
docs: Does duck typing to determine if an instance object implements a protocol.
  <p>The protocol may be either an adhoc protocol, in which case it is an object or it can be a formal protocol in
  which case it's a function.</p>
  
  <p>In an adhoc protocol, you can use Number, Object, String and Boolean to indicate the type required on the
  instance.</p>
  
  @memberOf topiarist
  @param {Object} instance the object to check.
  @param {function|Object} protocol the description of the properties that the object should have.
  @returns {boolean} true if all the properties on the protocol were on the instance and of the right type.