protected virtual bool IsOutbrokenByInheritance(IPropertyMap propertyMap, IClassMap classMap)
 {
     if (((classMap.InheritanceType == InheritanceType.ClassTableInheritance || classMap.InheritanceType == InheritanceType.ConcreteTableInheritance) && !(classMap.GetInheritedClassMap() == null && (classMap.InheritanceType == InheritanceType.ConcreteTableInheritance || classMap.IsInheritedProperty(propertyMap) == false))))
     {
         return true;
     }
     return false;
 }
        public virtual void VerifyClassMap(IClassMap classMap)
        {
            bool failedSorting = false;
            IClassMap superClassMap = null;
            if (classMap.Name.Length < 1)
            {
                HandleVerifyException(classMap, "Class name must not be empty!", "Name"); // do not localize
            }

            if (classMap.ClassType == ClassType.Class || classMap.ClassType == ClassType.Default)
            {
                superClassMap = classMap.GetInheritedClassMap();
                if (superClassMap != null)
                {
                    if (!(classMap.IsLegalAsSuperClass(superClassMap)))
                    {
                        HandleVerifyException(classMap, "Inherited class '" + superClassMap.Name + "' is illegal as superclass for this class! Creates cyclic inheritance graph, which is a very serious error, potentially leading to infinite loops! No more verification of this class or its properties will be made until this error is corrected! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "InheritsClass"); // do not localize
                        return;
                    }
                }
                bool checkMappings = this.checkOrmMappings;
                if (classMap.IsAbstract)
                {
                    if (classMap.InheritanceType == InheritanceType.ConcreteTableInheritance)
                    {
                        checkMappings = false;
                    }
                }
                if (checkMappings)
                {
                    if (classMap.SourceClass.Length > 0)
                    {
                        if (classMap.GetSourceClassMap() == null)
                        {
                            HandleVerifyException(classMap, "Source class not found! (Class: '" + classMap.Name + "', Source class: '" + classMap.SourceClass + "')", "SourceClass"); // do not localize
                        }
                    }
                    else
                    {
                        if (classMap.Table.Length < 1)
                        {
                            HandleVerifyException(classMap, "Table name must not be empty! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "Table"); // do not localize
                        }
                        if (classMap.GetTableMap() == null)
                        {
                            HandleVerifyException(classMap, "Table not found! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Table: '" + classMap.Table + "')", "Table"); // do not localize
                        }
                        if (classMap.TypeColumn.Length > 0)
                        {
                            if (classMap.GetTypeColumnMap() == null)
                            {
                                HandleVerifyException(classMap, "Type column not found! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Type column: '" + classMap.TypeColumn + "')", "TypeColumn"); // do not localize
                            }
                            if (classMap.TypeValue.Length < 1)
                            {
                                HandleVerifyException(classMap, "Type column supplied but no type value! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Type column: '" + classMap.TypeColumn + "')", "TypeColumn"); // do not localize
                            }
                        }
                    }
                    if (classMap.TypeValue.Length > 0)
                    {
                        if (classMap.TypeColumn.Length < 1)
                        {
                            HandleVerifyException(classMap, "Type value supplied but no type column! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Type value: '" + classMap.TypeValue + "')", "TypeValue"); // do not localize
                        }
                        VerifyUniqueTypeValue(classMap);
                    }

                }
                if (classMap.InheritsClass.Length > 0)
                {
                    if (superClassMap == null)
                    {
                        HandleVerifyException(classMap, "Inherited class not found! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Inherited class: '" + classMap.InheritsClass + "')", "InheritsClass"); // do not localize
                    }
                }
                if (classMap.GetSortedIdentityPropertyMaps(ref failedSorting, true).Count < 1)
                {
                    HandleVerifyException(classMap, "Class must have at least one identity property! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "PropertyMaps"); // do not localize
                }
                if (failedSorting)
                {
                    HandleVerifyException(classMap, "Failed sorting identity properties due to invalid indexes! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "PropertyMaps"); // do not localize
                }
                if (classMap.IsInHierarchy())
                {
                    if (classMap.InheritanceType == InheritanceType.None)
                    {
                        HandleVerifyException(classMap, "Inheritance type must be specified for class that is part of an inheritance hierarchy! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "InheritanceType"); // do not localize
                    }
                    else
                    {
                        if (classMap.InheritanceType == InheritanceType.ConcreteTableInheritance)
                        {
                            if (superClassMap != null)
                            {
                                if (!(classMap.IsAbstract))
                                {
                                    foreach (IPropertyMap propertyMap in classMap.GetAllPropertyMaps())
                                    {
                                        if (classMap.IsShadowingProperty(propertyMap))
                                        {
                                            if (propertyMap.IsIdentity)
                                            {
                                                HandleVerifyException(classMap,"Identity properties should not be shadowed! (" + GetClassType(classMap) + ": '" + classMap.Name + "', property: '" + propertyMap.Name + "')", "InheritanceType"); // do not localize
                                            }
                                        }
                                        else
                                        {
                                            if (!(propertyMap.IsIdentity) && !(propertyMap.IsCollection))
                                            {
                                                if (classMap.IsInheritedProperty(propertyMap))
                                                {
                                                    HandleVerifyException(classMap, "Non-identity, non-collection Properties should be shadowed (at least in the mapping file) in concrete classes for 'ConcreteTableInheritance' inheritance types! (" + GetClassType(classMap) + ": '" + classMap.Name + "', property: '" + propertyMap.Name + "')", "InheritanceType"); // do not localize
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            if (superClassMap != null)
                            {
                                foreach (IPropertyMap propertyMap in classMap.GetAllPropertyMaps())
                                {
                                    if (classMap.IsShadowingProperty(propertyMap))
                                    {
                                        if (propertyMap.IsIdentity)
                                        {
                                            HandleVerifyException(classMap, "Identity properties should not be shadowed! (" + GetClassType(classMap) + ": '" + classMap.Name + "', property: '" + propertyMap.Name + "')", "InheritanceType"); // do not localize
                                        }
                                        else
                                        {
                                            HandleVerifyException(classMap, "Properties should not be shadowed for 'SingleTableInheritance' or 'ClassTableInheritance' inheritance types! (" + GetClassType(classMap) + ": '" + classMap.Name + "', property: '" + propertyMap.Name + "')", "InheritanceType"); // do not localize
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                }
                if (classMap.InheritanceType != InheritanceType.None)
                {
                    if (classMap.TypeValue.Length < 1)
                    {
                        HandleVerifyException(classMap, "Type value must not be empty for class in inheritance hierarchy! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Type value: '" + classMap.TypeValue + "')", "TypeValue"); // do not localize
                    }
                    if (checkMappings)
                    {
                        if (classMap.GetTypeColumnMap() == null)
                        {
                            HandleVerifyException(classMap, "Type column not found! Class in inheritance hierarchy must have a type column! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Type column: '" + classMap.TypeColumn + "')", "TypeColumn"); // do not localize
                        }
                    }
                }
                else
                {
                }

            }

            if (classMap.ClassType == ClassType.Enum)
            {
                if (classMap.InheritsClass.Length > 0)
                {
                    HandleVerifyException(classMap, "Enumerations can not inherit! (Enumeration: '" + classMap.Name + "', Inherits: '" + classMap.InheritsClass + "'", "InheritsClass"); // do not localize
                }
                if (classMap.PropertyMaps.Count > 0)
                {
                    HandleVerifyException(classMap, "Enumerations can not have properties! (Enumeration: '" + classMap.Name + "'", "PropertyMaps"); // do not localize
                }
                if (classMap.GetSortedEnumValueMaps(ref failedSorting).Count < 1)
                {
                    HandleVerifyException(classMap, "Enumeration must have at least one enumeration value! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "PropertyMaps"); // do not localize
                }
                if (failedSorting)
                {
                    HandleVerifyException(classMap, "Failed sorting enumeration values due to invalid indexes! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "PropertyMaps"); // do not localize
                }

            }
            else
            {
                if (classMap.EnumValueMaps.Count > 0)
                {
                    HandleVerifyException(classMap, "Only enumerations can have enumeration values! (" + GetClassType(classMap) + ": '" + classMap.Name + "'", "PropertyMaps"); // do not localize
                }
            }

            if (classMap.ClassType == ClassType.Interface)
            {
                if (classMap.InheritsClass.Length > 0)
                {
                    IClassMap super = classMap.GetInheritedClassMap() ;
                    if (super != null)
                    {
                        if (super.ClassType != ClassType.Interface)
                        {
                            HandleVerifyException(classMap, "Interfaces can only inherit other interfaces! (Interface: '" + classMap.Name + "', Inherits: '" + classMap.InheritsClass + "'", "InheritsClass"); // do not localize
                        }
                    }
                }
            }

            if (classMap.ClassType != ClassType.Class && classMap.ClassType != ClassType.Default)
            {
                if (classMap.Source.Length > 0)
                {
                    HandleVerifyException(classMap, "Only classes can be mapped to a persistent data source! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Source: '" + classMap.Source + "'", "Source"); // do not localize
                }
                if (classMap.Table.Length > 0)
                {
                    HandleVerifyException(classMap, "Only classes can be mapped to a table in a persistent data source! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Table: '" + classMap.Table + "'", "Table"); // do not localize
                }
                if (classMap.TypeColumn.Length > 0)
                {
                    HandleVerifyException(classMap, "Only classes can be mapped to a type column in a persistent data source! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Type column: '" + classMap.TypeColumn + "'", "TypeColumn"); // do not localize
                }
                if (classMap.TypeValue.Length > 0)
                {
                    HandleVerifyException(classMap, "Only classes can be mapped to a type value in a persistent data source! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Type value: '" + classMap.TypeValue + "'", "TypeValue"); // do not localize
                }
                if (classMap.SourceClass.Length > 0)
                {
                    HandleVerifyException(classMap, "Only classes can be mapped to a class in a persistent data source! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Source class: '" + classMap.SourceClass + "'", "SourceClass"); // do not localize
                }
                if (classMap.DocElement.Length > 0)
                {
                    HandleVerifyException(classMap, "Only classes can be mapped to an element in a persistent data source! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Document element: '" + classMap.DocElement + "'", "DocElement"); // do not localize
                }
                if (classMap.DocParentProperty.Length > 0)
                {
                    HandleVerifyException(classMap, "Only classes can be mapped to a parent class property for mapping against a persistent data source! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Document parent property: '" + classMap.DocParentProperty + "'", "DocParentProperty"); // do not localize
                }
                if (classMap.DocRoot.Length > 0)
                {
                    HandleVerifyException(classMap, "Only classes can be mapped to a document root in a persistent data source! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Document root: '" + classMap.DocRoot + "'", "DocRoot"); // do not localize
                }

            }

            if (this.Recursive)
            {
                foreach (IPropertyMap propertyMap in classMap.PropertyMaps)
                {
                    propertyMap.Accept(this);
                }
                foreach (ICodeMap codeMap in classMap.CodeMaps)
                {
                    codeMap.Accept(this);
                }
                foreach (IEnumValueMap enumValueMap in classMap.EnumValueMaps)
                {
                    enumValueMap.Accept(this);
                }
            }
            Hashtable hashNames = new Hashtable();
            foreach (IPropertyMap propertyMap in classMap.PropertyMaps)
            {
                if (propertyMap.Name.Length > 0)
                {
                    if (hashNames.ContainsKey(propertyMap.Name.ToLower(CultureInfo.InvariantCulture)))
                    {
                        HandleVerifyException(classMap, "Property names must not appear in duplicates! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Overridable Property name: '" + propertyMap.Name + "')", "PropertyMaps"); // do not localize
                    }
                    hashNames[propertyMap.Name.ToLower(CultureInfo.InvariantCulture)] = "1";
                }
            }
            if (classMap.DomainMap.VerifyCSharpReservedWords)
            {
                if (MapBase.IsReservedCSharp(classMap.Name))
                {
                    HandleVerifyException(classMap, "Reserved word conflict! The name of this class is a reserved word in C#! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "Name"); // do not localize
                }
            }
            if (classMap.DomainMap.VerifyVbReservedWords)
            {
                if (MapBase.IsReservedVBNet(classMap.Name))
                {
                    HandleVerifyException(classMap, "Reserved word conflict! The name of this class is a reserved word in Visual Basic.NET! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "Name"); // do not localize
                }
            }
            if (classMap.DomainMap.VerifyDelphiReservedWords)
            {
                if (MapBase.IsReservedDelphi(classMap.Name))
                {
                    HandleVerifyException(classMap, "Reserved word conflict! The name of this class is a reserved word in delphi for .NET! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "Name"); // do not localize
                }
            }
        }