 			set: (value) -> @_setPropertyValue(name, value)
 
 	@proxyProperty = (keyPath, options={}) ->
+
 		# Allows to easily proxy properties from an instance object
 		# Object property is in the form of "object.property"
+		
 		objectKey = keyPath.split(".")[0]
-		return _.extend options,
+		
+		descriptor = _.extend options,
 			get: ->
 				return unless _.isObject(@[objectKey])
 				Utils.getValueForKeyPath(@, keyPath)
 			set: (value) ->
 				return unless _.isObject(@[objectKey])
 				Utils.setValueForKeyPath(@, keyPath, value)
+			proxy: true
 
 	_setPropertyValue: (k, v) =>
 		@[DefinedPropertiesValuesKey][k] = v

		# Create a holder for the property values
		@[DefinedPropertiesValuesKey] = {}

		# Count the creation for these objects and set the id
		@constructor[CounterKey] ?= 0
		@constructor[CounterKey] += 1

		@_id = @constructor[CounterKey]

		@_applyOptionsAndDefaults(options)

	_applyOptionsAndDefaults: (options) ->
		for key, descriptor of @_propertyList()
			# For each known property (registered with @define) that has a setter, fetch
			# the value from the options object, unless the prop is not importable.
			# When there's no user value, apply the default value:
			if descriptor.set
				value = Utils.valueOrDefault(
					(options?[key] if descriptor.importable),
					@_getPropertyDefaultValue(key)
				)

				if not (value in [null, undefined])
					@[key] = value

CounterKey = "_ObjectCounter"
DefinedPropertiesKey = "_DefinedPropertiesKey"
DefinedPropertiesValuesKey = "_DefinedPropertiesValuesKey"
DefinedPropertiesOrderKey = "_DefinedPropertiesOrderKey"

capitalizeFirstLetter = (string) ->
	string.charAt(0).toUpperCase() + string.slice(1)
