private static int CompareValueTo <T>(this Argument <T> argument, object comparisonValue)
        {
            try
            {
                if (argument.Value is IComparable <T> && comparisonValue is T)
                {
                    return((argument.Value as IComparable <T>).CompareTo((T)comparisonValue));
                }

                if (argument.Value is IComparable)
                {
                    return((argument.Value as IComparable).CompareTo(comparisonValue));
                }
            }
            catch (ArgumentException)
            {
                var message = ExceptionMessages.Current.IncomparableTypes.Inject(
                    argument.GetType().FullName,
                    comparisonValue.GetType().FullName);
                throw ExceptionFactory.CreateArgumentException(argument, message);
            }

            throw new InvalidOperationException("This should not be possible, please report an issue at http://github.com/pmacn/Krav with the code used get this exception.");
        }
        public static Argument <T> IsInRange <T>(this Argument <T> argument, T min, T max)
            where T : IComparable <T>
        {
            if (argument.Value == null)
            {
                throw ExceptionFactory.CreateNullException(argument);
            }

            if (argument.CompareValueTo(min) < 0)
            {
                throw ExceptionFactory.OutOfRange(
                          argument,
                          ExceptionMessages.Current.NotInRange_TooLow.Inject(min, max));
            }

            if (argument.CompareValueTo(max) > 0)
            {
                throw ExceptionFactory.OutOfRange(
                          argument,
                          ExceptionMessages.Current.NotInRange_TooHigh.Inject(min, max));
            }

            return(argument);
        }