public static IValitRule <TObject, TProperty> Satisfies <TObject, TProperty>(this IValitRule <TObject, TProperty> rule, Predicate <TProperty> predicate) where TObject : class
        {
            rule.ThrowIfNull(ValitExceptionMessages.NullRule);
            predicate.ThrowIfNull(ValitExceptionMessages.NullPredicate);

            IValitRuleAccessor <TObject, TProperty> accessor;

            if (rule.IsFirstInEnsure())
            {
                accessor = rule.GetAccessor();
                accessor.SetPredicate(predicate);
                return(rule);
            }

            var newRule = new ValitRule <TObject, TProperty>(rule);

            accessor = newRule.GetAccessor();
            accessor.SetPredicate(predicate);
            return(newRule);
        }