private static void Build(MemberInfo memberInfo)
        {
            List <IChoSurrogateValidator> validators = new List <IChoSurrogateValidator>();

            ChoCompositeValidator compositeValidator = new ChoAndCompositeValidator();

            foreach (Attribute memberCallAttribute in ChoType.GetMemberAttributesByBaseType(memberInfo, typeof(Attribute)))
            {
                foreach (IChoValidationManager validationManager in ChoValidationManagerSettings.Me.ValidationManagers)
                {
                    if (memberCallAttribute is ChoCompositeValidatorAttribute)
                    {
                        if (((ChoCompositeValidatorAttribute)memberCallAttribute).CompositionType == ChoCompositionType.Or)
                        {
                            if (validators.Count > 0)
                            {
                                compositeValidator.Add(validators.ToArray());
                                validators.Add(compositeValidator);
                                validators.Clear();
                            }
                            compositeValidator = new ChoOrCompositeValidator();
                        }
                    }
                    else if (validationManager.IsValid(memberCallAttribute))
                    {
                        IChoSurrogateValidator validator = validationManager.CreateValidator(memberCallAttribute, ValidationScope.Before, ValidatorSource.Attribute);
                        if (validator != null)
                        {
                            validators.Add(validator);
                        }
                    }
                }
            }
            if (validators.Count > 0)
            {
                compositeValidator.Add(validators.ToArray());
                validators.Add(compositeValidator);
            }

            _objectMemberValidatorCache.Add(memberInfo, new ChoAndCompositeValidator(validators.ToArray()));
        }
        private static IChoSurrogateValidator BuildCompositeValidator(ChoCompositeValidatorAttribute compositeValidatorAttribute, Dictionary <string, IChoSurrogateValidator> namedValidators,
                                                                      ChoCompositeValidatorAttribute[] attrs, List <ChoCompositeValidator> parentValidators = null)
        {
            ChoCompositeValidator compositeValidator = null;

            if (compositeValidatorAttribute.CompositionType == ChoCompositionType.Or)
            {
                compositeValidator = new ChoOrCompositeValidator();
            }
            else
            {
                compositeValidator = new ChoAndCompositeValidator();
            }

            compositeValidator.Name = compositeValidatorAttribute.Name;
            if (parentValidators == null)
            {
                parentValidators = new List <ChoCompositeValidator>();
            }

            parentValidators.Add(compositeValidator);

            foreach (string name in compositeValidatorAttribute.ValidatorNames)
            {
                if (name.IsNullOrWhiteSpace())
                {
                    continue;
                }
                if (namedValidators.ContainsKey(name))
                {
                    if (!(namedValidators[name] is ChoCompositeValidator))
                    {
                        compositeValidator.Add(namedValidators[name]);
                    }
                    else if (!IsCircularReferenceFound(parentValidators, name))
                    {
                        compositeValidator.Add(namedValidators[name]);
                        parentValidators.Add(namedValidators[name] as ChoCompositeValidator);
                    }

                    continue;
                }
                else
                {
                    foreach (Attribute memberCallAttribute in attrs)
                    {
                        if (!(memberCallAttribute is ChoCompositeValidatorAttribute))
                        {
                            continue;
                        }
                        if (((ChoCompositeValidatorAttribute)memberCallAttribute).Name != name)
                        {
                            continue;
                        }
                        if (IsCircularReferenceFound(parentValidators, name))
                        {
                            continue;
                        }

                        IChoSurrogateValidator childCompositeValidator = null;

                        childCompositeValidator = BuildCompositeValidator(memberCallAttribute as ChoCompositeValidatorAttribute,
                                                                          namedValidators, attrs, parentValidators);

                        namedValidators.Add(name, childCompositeValidator);

                        compositeValidator.Add(childCompositeValidator);
                        parentValidators.Add(namedValidators[name] as ChoCompositeValidator);
                    }
                }
            }

            return(compositeValidator);
        }