protected bool IsPropertyResolvable(Type type, IMap <String, IPropertyInfo> propertyMap, String memberName, IEntityMetaData metaData)
        {
            if (metaData != null && metaData.GetMemberByName(memberName) == null)
            {
                return(false);
            }
            if (propertyMap == null)
            {
                propertyMap = PropertyInfoProvider.GetPropertyMap(type);
            }
            if (propertyMap.ContainsKey(memberName))
            {
                return(true);
            }
            String[] memberPath = memberName.Split("\\.".ToCharArray());
            if (memberPath.Length == 0)
            {
                return(false);
            }
            IPropertyInfo propertyInfo = propertyMap.Get(memberPath[0]);

            if (propertyInfo == null)
            {
                return(false);
            }
            String remainingMemberName = memberName.Substring(memberPath[0].Length + 1);

            return(IsPropertyResolvable(propertyInfo.PropertyType, null, remainingMemberName, metaData));
        }
        protected void HandleMemberMappings(ValueObjectConfig config, IMap <String, IList <XElement> > configDetails, IEntityMetaData metaData)
        {
            Type entityType = config.EntityType;
            Type valueType  = config.ValueType;

            IMap <String, IPropertyInfo> entityPropertyMap = PropertyInfoProvider.GetPropertyMap(entityType);
            IMap <String, IPropertyInfo> valuePropertyMap  = PropertyInfoProvider.GetPropertyMap(valueType);

            for (int i = memberTagNames.Length; i-- > 0;)
            {
                String memberTagName = memberTagNames[i].LocalName;

                IList <XElement> memberTags = configDetails.Get(memberTagName);
                if (memberTags == null)
                {
                    continue;
                }

                for (int j = memberTags.Count; j-- > 0;)
                {
                    XElement element    = memberTags[j];
                    String   memberName = XmlConfigUtil.GetRequiredAttribute(element, XmlConstants.NAME);
                    if (config.IsIgnoredMember(memberName))
                    {
                        continue;
                    }
                    if (RuntimeValidationActive && !IsPropertyResolvable(valueType, valuePropertyMap, memberName, null))
                    {
                        throw new ArgumentException("Value type property '" + valueType.Name + "." + memberName + "' not found");
                    }

                    bool holdsListType = XmlConfigUtil.AttributeIsTrue(element, XmlConstants.LIST_TYPE);
                    if (holdsListType)
                    {
                        config.AddListTypeMember(memberName);
                    }

                    String entityMemberName = XmlConfigUtil.GetAttribute(element, XmlConstants.NAME_IN_ENTITY);
                    if (entityMemberName.Length == 0)
                    {
                        entityMemberName = memberName;
                    }
                    else
                    {
                        config.PutValueObjectMemberName(entityMemberName, memberName);
                    }
                    if (RuntimeValidationActive && !IsPropertyResolvable(entityType, entityPropertyMap, entityMemberName, metaData))
                    {
                        throw new ArgumentException("Entity type property '" + entityType.Name + "." + entityMemberName
                                                    + "' not found while configuring value type '" + valueType.Name + "'");
                    }
                }
            }
        }