public void SubElements()
 {
     IGetter getter = new BasicPropertyAccessor().GetGetter(typeof(AClass), "Address");
     ClassValidator cvadd = new ClassValidator(typeof(Address));
     ClassValidator cv = new ClassValidator(typeof(AClass));
     ValidatableElement ve = new ValidatableElement(typeof(AClass), cv);
     try
     {
         ve.AddSubElement(new ValidatableElement(typeof(Address), cvadd));
         Assert.Fail("No exception adding a subelement without getter");
     }
     catch (ArgumentException)
     {
         //ok
     }
     Assert.IsFalse(ve.HasSubElements);
     ve.AddSubElement(new ValidatableElement(typeof(Address), cvadd, getter));
     Assert.IsTrue(ve.HasSubElements);
 }
            private static void AddSubElement(Property property, ValidatableElement element)
            {
                if (property != null && property.IsComposite && !property.BackRef)
                {
                    Component component = (Component) property.Value;
                    if (component.IsEmbedded)
                    {
                        return;
                    }

                    if (property.PersistentClass != null)
                    {
                        var cv = Engine.GetClassValidator(property.PersistentClass.MappedClass);

                        if (cv != null)
                        {
                            if (cv.GetMemberConstraints(property.Name).OfType<ValidAttribute>().Any())
                            {
                                // the components is already marked as Valid
                                return;
                            }
                        }
                    }

                    IPropertyAccessor accesor = PropertyAccessorFactory.GetPropertyAccessor(property, EntityMode.Poco);

                    IGetter getter = accesor.GetGetter(element.EntityType, property.Name);

                    IClassValidator validator = Engine.GetClassValidator(getter.ReturnType);
                    if (validator != null)
                    {
                        ValidatableElement subElement = new ValidatableElement(getter.ReturnType, validator, getter);

                        foreach (Property currentProperty in component.PropertyIterator)
                        {
                            AddSubElement(currentProperty, subElement);
                        }

                        if (subElement.HasSubElements || subElement.Validator.HasValidationRules)
                        {
                            element.AddSubElement(subElement);
                        }
                    }
                }
            }
            private static void AddSubElement(Property property, ValidatableElement element)
            {
                if (property != null && property.IsComposite && !property.BackRef)
                {
                    Component component = (Component) property.Value;
                    if (component.IsEmbedded)
                    {
                        return;
                    }

                    IPropertyAccessor accesor = PropertyAccessorFactory.GetPropertyAccessor(property, EntityMode.Poco);

                    IGetter getter = accesor.GetGetter(element.EntityType, property.Name);

                    IClassValidator validator = Engine.GetClassValidator(getter.ReturnType);
                    if (validator != null)
                    {
                        ValidatableElement subElement = new ValidatableElement(getter.ReturnType, validator, getter);

                        foreach (Property currentProperty in component.PropertyIterator)
                        {
                            AddSubElement(currentProperty, subElement);
                        }

                        if (subElement.HasSubElements || subElement.Validator.HasValidationRules)
                        {
                            element.AddSubElement(subElement);
                        }
                    }
                }
            }