private void BindComponent(System.Type reflectedClass, string path, HbmCompositeId idSchema)
		{
			if (idSchema.@class != null)
			{
				compositeId.ComponentClass = ClassForNameChecked(idSchema.@class, mappings, "component class not found: {0}");

				compositeId.IsEmbedded = false;
			}
			else if (reflectedClass != null)
			{
				compositeId.ComponentClass = reflectedClass;
				compositeId.IsEmbedded = false;
			}
			else
			{
				// an "embedded" component (ids only)
				if (compositeId.Owner.HasPocoRepresentation)
				{
					compositeId.ComponentClass = compositeId.Owner.MappedClass;
					compositeId.IsEmbedded = true;
				}
				else
				{
					// if not - treat compositeid as a dynamic-component
					compositeId.IsDynamic = true;
				}
			}

			foreach (object item in idSchema.Items ?? new object[0])
			{
				var keyManyToOneSchema = item as HbmKeyManyToOne;
				var keyPropertySchema = item as HbmKeyProperty;

				if (keyManyToOneSchema != null)
				{
					var manyToOne = new ManyToOne(compositeId.Table);

					string propertyName = keyManyToOneSchema.name == null ? null : StringHelper.Qualify(path, keyManyToOneSchema.name);

					BindManyToOne(keyManyToOneSchema, manyToOne, propertyName, false);

					Property property = CreateProperty(manyToOne, keyManyToOneSchema.name, compositeId.ComponentClass,
					                                   keyManyToOneSchema);

					compositeId.AddProperty(property);
				}
				else if (keyPropertySchema != null)
				{
					var value = new SimpleValue(compositeId.Table);

					string propertyName = keyPropertySchema.name == null ? null : StringHelper.Qualify(path, keyPropertySchema.name);

					BindSimpleValue(keyPropertySchema, value, false, propertyName);

					Property property = CreateProperty(value, keyPropertySchema.name, compositeId.ComponentClass, keyPropertySchema);

					compositeId.AddProperty(property);
				}
			}
		}
		public ComponentAsIdMapper(System.Type componentType, MemberInfo declaringTypeMember, HbmCompositeId id, HbmMapping mapDoc)
		{
			this.id = id;
			this.mapDoc = mapDoc;
			id.@class = componentType.GetShortClassName(mapDoc);
			accessorPropertyMapper = new AccessorPropertyMapper(declaringTypeMember.DeclaringType, declaringTypeMember.Name, x => id.access = x);
		}
		public void WhenCreatedThenSetTheComponentClass()
		{
			var mapdoc = new HbmMapping();
			var component = new HbmCompositeId();
			new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x=> x.Id), component, mapdoc);

			[email protected]().Contain("PersonId");
		}
		public void WhenCreatedThenSetTheComponentClass()
		{
			var mapdoc = new HbmMapping();
			var component = new HbmCompositeId();
			new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x=> x.Id), component, mapdoc);

			Assert.That(component.@class, Is.StringContaining("PersonId"));
		}
		public void CallMapManyToOneMapper()
		{
			var mapdoc = new HbmMapping();
			var compositeId = new HbmCompositeId();
			var mapper = new ComposedIdMapper(typeof(Person), compositeId, mapdoc);
			var called = false;

			mapper.ManyToOne(For<Person>.Property(ts => ts.User), x => called = true);

			called.Should().Be.True();
		}
		public void CallMapManyToOneMapper()
		{
			var mapdoc = new HbmMapping();
			var compositeId = new HbmCompositeId();
			var mapper = new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x => x.Id), compositeId, mapdoc);
			var called = false;

			mapper.ManyToOne(For<PersonId>.Property(ts => ts.User), x => called = true);

			Assert.That(called, Is.True);
		}
		public void CallPropertyMapper()
		{
			var mapdoc = new HbmMapping();
			var compositeId = new HbmCompositeId();
			var mapper = new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x => x.Id), compositeId, mapdoc);
			var called = false;

			mapper.Property(For<PersonId>.Property(ts => ts.Email), x => called = true);

			called.Should().Be.True();
		}
		public void CallPropertyMapper()
		{
			var mapdoc = new HbmMapping();
			var compositeId = new HbmCompositeId();
			var mapper = new ComposedIdMapper(typeof(Person), compositeId, mapdoc);
			var called = false;

			mapper.Property(For<Person>.Property(ts => ts.Email), x => called = true);

			Assert.That(called, Is.True);
		}
		public void CanMapManyToOne()
		{
			var mapdoc = new HbmMapping();
			var compositeId = new HbmCompositeId();
			var mapper = new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x => x.Id), compositeId, mapdoc);

			mapper.ManyToOne(For<PersonId>.Property(ts => ts.User), x => { });

			Assert.That(compositeId.Items, Has.Length.EqualTo(1));
			Assert.That(compositeId.Items.First(), Is.TypeOf<HbmKeyManyToOne>());
			Assert.That(compositeId.Items.OfType<HbmKeyManyToOne>().First().Name, Is.EqualTo("User"));
		}
		public void CanMapProperty()
		{
			var mapdoc = new HbmMapping();
			var compositeId = new HbmCompositeId();
			var mapper = new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x => x.Id), compositeId, mapdoc);

			mapper.Property(For<PersonId>.Property(ts => ts.Email), x => { });

			compositeId.Items.Should().Have.Count.EqualTo(1);
			compositeId.Items.First().Should().Be.OfType<HbmKeyProperty>();
			compositeId.Items.OfType<HbmKeyProperty>().First().Name.Should().Be.EqualTo("Email");
		}
		public void CanMapManyToOne()
		{
			var mapdoc = new HbmMapping();
			var compositeId = new HbmCompositeId();
			var mapper = new ComposedIdMapper(typeof(Person), compositeId, mapdoc);

			mapper.ManyToOne(For<Person>.Property(ts => ts.User), x => { });

			compositeId.Items.Should().Have.Count.EqualTo(1);
			compositeId.Items.First().Should().Be.OfType<HbmKeyManyToOne>();
			compositeId.Items.OfType<HbmKeyManyToOne>().First().Name.Should().Be.EqualTo("User");
		}
		public void CanMapProperty()
		{
			var mapdoc = new HbmMapping();
			var compositeId = new HbmCompositeId();
			var mapper = new ComposedIdMapper(typeof(Person), compositeId, mapdoc);

			mapper.Property(For<Person>.Property(ts => ts.Email), x => { });

			Assert.That(compositeId.Items, Has.Length.EqualTo(1));
			Assert.That(compositeId.Items.First(), Is.TypeOf<HbmKeyProperty>());
			Assert.That(compositeId.Items.OfType<HbmKeyProperty>().First().Name, Is.EqualTo("Email"));
		}
		public void BindCompositeId(HbmCompositeId idSchema, PersistentClass rootClass)
		{
			if (idSchema == null)
				return;

			compositeId = new Component(rootClass);
			rootClass.Identifier = compositeId;

			if (idSchema.name == null)
			{
				BindComponent(null, "id", idSchema);
				rootClass.HasEmbeddedIdentifier = compositeId.IsEmbedded;
			}
			else
			{
				System.Type reflectedClass = GetPropertyType(rootClass.MappedClass,
					idSchema.name, idSchema);

				BindComponent(reflectedClass, idSchema.name, idSchema);

				Mapping.Property prop = new Mapping.Property(compositeId);
				BindProperty(prop, idSchema);
				rootClass.IdentifierProperty = prop;
			}

			compositeId.Table.SetIdentifierValue(compositeId);
			compositeId.NullValue = GetXmlEnumAttribute(idSchema.unsavedvalue);

			System.Type compIdClass = compositeId.ComponentClass;

            //<Simon date='26.04.2010'>
            if(compositeId.IsDynamic) return;
            //</Simon>
			if (!ReflectHelper.OverridesEquals(compIdClass))
				throw new MappingException(
					"composite-id class must override Equals(): " + compIdClass.FullName
					);

			if (!ReflectHelper.OverridesGetHashCode(compIdClass))
				throw new MappingException(
					"composite-id class must override GetHashCode(): " + compIdClass.FullName
					);
			// Serializability check not ported
		}
		public void BindCompositeId(HbmCompositeId idSchema, PersistentClass rootClass)
		{
			if (idSchema == null)
			{
				return;
			}

			compositeId = new Component(rootClass);
			compositeId.IsKey = true;
			
			rootClass.Identifier = compositeId;

			if (idSchema.name == null)
			{
				BindComponent(null, "id", idSchema);
				rootClass.HasEmbeddedIdentifier = compositeId.IsEmbedded;
			}
			else
			{
				System.Type reflectedClass = GetPropertyType(rootClass.MappedClass, idSchema.name, idSchema);

				BindComponent(reflectedClass, idSchema.name, idSchema);

				var prop = new Property(compositeId);
				BindProperty(prop, idSchema);
				rootClass.IdentifierProperty = prop;
			}

			compositeId.Table.SetIdentifierValue(compositeId);
			compositeId.NullValue = idSchema.unsavedvalue.ToNullValue();

			System.Type compIdClass = compositeId.ComponentClass;
			if (!ReflectHelper.OverridesEquals(compIdClass))
			{
				throw new MappingException("composite-id class must override Equals(): " + compIdClass.FullName);
			}

			if (!ReflectHelper.OverridesGetHashCode(compIdClass))
			{
				throw new MappingException("composite-id class must override GetHashCode(): " + compIdClass.FullName);
			}
			// Serializability check not ported
		}
		public void BindCompositeId(HbmCompositeId idSchema, PersistentClass rootClass)
		{
			if (idSchema == null)
			{
				return;
			}

			compositeId = new Component(rootClass);
			compositeId.IsKey = true;

			rootClass.Identifier = compositeId;

			if (idSchema.name == null)
			{
				BindComponent(null, "id", idSchema);
				rootClass.HasEmbeddedIdentifier = compositeId.IsEmbedded;
			}
			else
			{
				System.Type reflectedClass = GetPropertyType(rootClass.MappedClass, idSchema.name, idSchema);

				BindComponent(reflectedClass, idSchema.name, idSchema);

				var prop = new Property(compositeId);
				BindProperty(prop, idSchema);
				rootClass.IdentifierProperty = prop;
			}

			compositeId.Table.SetIdentifierValue(compositeId);
			compositeId.NullValue = idSchema.unsavedvalue.ToNullValue();

			if (!compositeId.IsDynamic)
			{
				CheckEqualsAndGetHashCodeOverride();
			}
			// Serializability check not ported
		}
		public ComposedIdMapper(System.Type container, HbmCompositeId id, HbmMapping mapDoc)
		{
			this.container = container;
			this.id = id;
			this.mapDoc = mapDoc;
		}
		private System.Type GetPropertyType(System.Type containingType, string propertyName,
			HbmCompositeId idSchema)
		{
			if (idSchema.@class != null)
				return ClassForNameChecked(idSchema.@class, mappings, "could not find class: {0}");

			else if (containingType == null)
				return null;

			else
			{
				string access = idSchema.access ?? mappings.DefaultAccess;
				return ReflectHelper.ReflectedPropertyClass(containingType, propertyName, access);
			}
		}
		private void BindProperty(Mapping.Property property, HbmCompositeId idSchema)
		{
			property.Name = idSchema.name;

			if (property.Value.Type == null)
				throw new MappingException("could not determine a property type for: " + property.Name);

			property.PropertyAccessorName = idSchema.access ?? mappings.DefaultAccess;
			property.Cascade = mappings.DefaultCascade;
			property.IsUpdateable = true;
			property.IsInsertable = true;
			property.IsOptimisticLocked = true;
			property.Generation = PropertyGeneration.Never;
			property.MetaAttributes = new Dictionary<string, MetaAttribute>();

			LogMappedProperty(property);
		}