 			_providers.push(provider);
 			
 			for (var attrName : String in dataDescriptor)
-			{
-				// if this provider attribute is also a dataprovider, let's also bind it
-				var bindingName	: String	= dataDescriptor[attrName];
-				var attribute	: Object	= provider[attrName];
-				
-				if (_bindingNames.indexOf(bindingName) != -1)
-					throw new Error(
-						'Another data provider is already declaring the \'' + bindingName
-                        + '\' property.'
-					);
-				
-				_bindingNameToProvider[bindingName] = provider;
-				_bindingNameToValue[bindingName] = attribute;
-				
-				providerBindingNames.push(bindingName);
-				_bindingNames.push(bindingName);
-				
-				if (_bindingNameToChangedSignal[bindingName])
-					_bindingNameToChangedSignal[bindingName].execute(this, bindingName, null, attribute);
-			}
+				addBinding(
+					dataDescriptor[attrName],
+					provider[attrName],
+					provider,
+					providerBindingNames
+				);
+		}
+		
+		private function addBinding(bindingName 			: String,
+									value 					: Object,
+									provider				: IDataProvider,
+									providerBindingNames	: Vector.<String>) : void
+		{
+			if (_bindingNames.indexOf(bindingName) != -1)
+				throw new Error(
+					'Another data provider is already declaring the \'' + bindingName
+					+ '\' property.'
+				);
+			
+			_bindingNameToProvider[bindingName] = provider;
+			_bindingNameToValue[bindingName] = value;
+			
+			providerBindingNames.push(bindingName);
+			_bindingNames.push(bindingName);
+			
+			if (_bindingNameToChangedSignal[bindingName])
+				_bindingNameToChangedSignal[bindingName].execute(this, bindingName, null, value);			
 		}
 		
 		public function removeProvider(provider : IDataProvider) : void


	public final class DataBindings
	{
		private var _owner							: ISceneNode				= null;
		
		private var _providers						: Vector.<IDataProvider> 	= new <IDataProvider>[];
		private var _bindingNames					: Vector.<String>			= new Vector.<String>();
		
		private var _bindingNameToValue				: Object					= {};
		private var _bindingNameToChangedSignal		: Object					= {};
		
		private var _bindingNameToProvider			: Object					= {};
		private var _providerToBindingNames			: Dictionary				= new Dictionary(); // dic[Vector.<String>[]]
		
		public function get owner() : ISceneNode
		{

			}
			else
			{
				var bindingName : String	= source.dataDescriptor[attributeName];
				var oldValue	: Object	= _bindingNameToValue[bindingName];
				var newValue	: Object	= source[attributeName];
				
				_bindingNameToValue[bindingName] = newValue;
				
				if (_bindingNameToChangedSignal[bindingName])
					_bindingNameToChangedSignal[bindingName].execute(
						this,
						bindingName,
						oldValue,
						newValue
					);
			}
		}
		
//		FIXME: handle provider's properties removal
//		private function updateProviderBindings(provider : IDataProvider) : void
//		{
//			var dataDescriptor			: Object			= provider.dataDescriptor;
//			var providerBindingNames	: Vector.<String>	= _providerToBindingNames[provider];
//			var numBindingNames			: uint				= providerBindingNames.length;
//			
//			for (var bindingNameId : uint; bindingNameId < numBindingNames; ++bindingNameId)
//			{
//				var bindingName : String = providerBindingNames[bindingNameId];
//				
//				if (!dataDescriptor.hasOwnProperty(bindingName))
//					
//			}
//			
//			for (var propertyName : String in dataDescriptor)
//				if (providerBindingNames.indexOf(propertyName) < -1)
//					addBinding(
//						dataDescriptor[propertyName],
//						provider[propertyName],
//						provider,
//						providerBindingNames
//					);
//		}
	}
}