public override void Validate(string value)
        {
            if (value == null)
            {
                throw new ArgumentNullException("value");
            }
            base.Validate(value);
            int parsedValue;

            if (!Int32.TryParse(value, out parsedValue))
            {
                throw new FormatException("Value cannot be parsed as an integer.");
            }

            if (AlwaysAllowZero && parsedValue == 0)
            {
                return;
            }

            if (MinValue != int.MinValue && parsedValue < MinValue)
            {
                throw new FormatException(String.Format("Value is too low ({0}); expected at least {1}.", parsedValue,
                                                        MinValue));
            }

            if (MaxValue != int.MaxValue && parsedValue > MaxValue)
            {
                throw new FormatException(String.Format("Value is too high ({0}); expected at most {1}.", parsedValue,
                                                        MaxValue));
            }

            if (MultipleOf != 0 && (parsedValue % MultipleOf != 0))
            {
                throw new FormatException(String.Format("Value ({0}) is not a multiple of {1}.", parsedValue,
                                                        MultipleOf));
            }
            if (PowerOfTwo)
            {
                bool found = false;
                for (int i = 0; i < 31; i++)
                {
                    if (parsedValue == (1 << i))
                    {
                        found = true;
                        break;
                    }
                }
                if (!found && parsedValue != 0)
                {
                    throw new FormatException(String.Format("Value ({0}) is not a power of two.", parsedValue));
                }
            }
            if (ValidValues != null)
            {
                if (ValidValues.All(t => parsedValue != t))
                {
                    throw new FormatException(String.Format("Value ({0}) is not on the list of valid values.",
                                                            parsedValue));
                }
            }
            if (InvalidValues != null)
            {
                if (InvalidValues.Any(t => parsedValue == t))
                {
                    throw new FormatException(String.Format("Value ({0}) is on the list of invalid values.",
                                                            parsedValue));
                }
            }
        }