/// <summary>
        /// Specificaiton execution using this strategy
        /// </summary>
        /// <param name="specification"></param>
        /// <returns></returns>
        public override SpecificationResult Execute(BaseSpecification specification)
        {
            if (ExecuteNext)
            {
                var result = specification.Execute();
                if (!result.IsValid)
                {
                    ExecuteNext = false;
                }
                return(result);
            }

            return(null);
        }
 /// <summary>
 /// Specificaiton execution using this strategy
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="specification"></param>
 /// <param name="input"></param>
 /// <returns></returns>
 public override SpecificationResult Execute <T>(BaseSpecification <T> specification, T input)
 {
     return(specification.Execute(input));
 }
 /// <summary>
 /// Specificaiton execution using this strategy
 /// </summary>
 /// <param name="specification"></param>
 /// <returns></returns>
 public override SpecificationResult Execute(BaseSpecification specification)
 {
     return(specification.Execute());
 }