Castle.MonoRail.ActiveRecordSupport.ARDataBinder.BindSpecialObjectInstance C# (CSharp) Method

BindSpecialObjectInstance() protected method

protected BindSpecialObjectInstance ( Type instanceType, string prefix, Castle.Components.Binder.Node node, bool &succeeded ) : object
instanceType System.Type
prefix string
node Castle.Components.Binder.Node
succeeded bool
return object
		protected override object BindSpecialObjectInstance(Type instanceType, string prefix, Node node,
															out bool succeeded)
		{
			succeeded = false;

			ActiveRecordModel model = CurrentARModel;

			if (model == null)
			{
				return null;
			}

			object container = CreateContainer(instanceType);

			bool found = false;
			Type targetType = null;
			ActiveRecordModel targetModel = null;

			found = FindPropertyInHasAndBelongsToMany(model, prefix, ref targetType, ref targetModel);

			if (!found)
			{
				found = FindPropertyInHasMany(model, prefix, ref targetType, ref targetModel);
			}

			if (found)
			{
				succeeded = true;

				ClearContainer(container);

				if (node.NodeType == NodeType.Indexed)
				{
					IndexedNode indexNode = (IndexedNode) node;

					Array collArray = Array.CreateInstance(targetType, indexNode.ChildrenCount);

					collArray = (Array) InternalBindObject(collArray.GetType(), prefix, node);

					foreach(object item in collArray)
					{
						AddToContainer(container, item);
					}
				}
				else if (node.NodeType == NodeType.Leaf)
				{
					PrimaryKeyModel pkModel = targetModel.PrimaryKey;
					Type pkType = pkModel.Property.PropertyType;

					LeafNode leafNode = (LeafNode) node;

					bool convSucceeded;

					if (leafNode.IsArray) // Multiples values found
					{
						foreach(object element in (Array) leafNode.Value)
						{
							object keyConverted = Converter.Convert(pkType, leafNode.ValueType.GetElementType(),
																	element, out convSucceeded);

							if (convSucceeded)
							{
								object item = FindByPrimaryKey(targetType, keyConverted);
								AddToContainer(container, item);
							}
						}
					}
					else // Single value found
					{
						object keyConverted = Converter.Convert(pkType, leafNode.ValueType.GetElementType(),
																leafNode.Value, out convSucceeded);

						if (convSucceeded)
						{
							object item = FindByPrimaryKey(targetType, keyConverted);
							AddToContainer(container, item);
						}
					}
				}
			}

			return container;
		}