public IRuleBuilderOptions <TValidatedType, TProperty> AddMetaValidationRule <TValidator> (
            Expression <Func <IEnumerable <TValidator>, bool> > metaValidationRuleExpression)
            where TValidator : IPropertyValidator
        {
            ArgumentUtility.CheckNotNull("metaValidationRuleExpression", metaValidationRuleExpression);

            var metaValidationRuleExecutor = metaValidationRuleExpression.Compile();

            var metaValidationRule = new DelegateMetaValidationRule <TValidator> (
                validationRules =>
            {
                var isValid = metaValidationRuleExecutor(validationRules);
                if (isValid)
                {
                    return(MetaValidationRuleValidationResult.CreateValidResult());
                }

                return(MetaValidationRuleValidationResult.CreateInvalidResult(
                           "Meta validation rule '{0}' failed for validator '{1}' on property '{2}.{3}'.",
                           metaValidationRuleExpression,
                           typeof(TValidator).FullName,
                           _addingComponentPropertyRule.Property.DeclaringType.FullName,
                           _addingComponentPropertyRule.Property.Name));
            });

            _addingMetaValidationPropertyRule.RegisterMetaValidationRule(metaValidationRule);
            return(this);
        }
        public void Validate()
        {
            var fakeResult   = MetaValidationRuleValidationResult.CreateValidResult();
            var delegateRule = new DelegateMetaValidationRule <IPropertyValidator> (v => fakeResult);

            var result = delegateRule.Validate(new IPropertyValidator[0]).First();

            Assert.That(result, Is.SameAs(fakeResult));
        }
        public IRuleBuilderOptions <TValidatedType, TProperty> AddMetaValidationRule(
            Func <IEnumerable <IPropertyValidator>, MetaValidationRuleValidationResult> rule)
        {
            ArgumentUtility.CheckNotNull("rule", rule);

            var metaValidationRule = new DelegateMetaValidationRule <IPropertyValidator> (rule);

            _addingMetaValidationPropertyRule.RegisterMetaValidationRule(metaValidationRule);
            return(this);
        }