CLI2 provides a mechanism to validate argument values.  The Validator
        interface must be implemented to create an argument validator.  This interface has
        a single method validate(java.util.List values) throws InvalidArgumentException.
      
CLI2 has some standard validators included. They validate the following:
- Java class
 - enumeration
 - date
 - file path
 - number
 - URI
 - URL
 
          The ClassValidator validates a value using three criteria:
        
- the value adheres to the Java Language Specification rules
 - the class specified by the name is loadable
 - the class specified by the name can be instantiated
 
// 1. ClassValidator validator = new ClassValidator(); // 2. validator.setLoadable(true); // 3. validator.setLoadable(true);
TODO: add section about values being replaced with class instances
          The DateValidator validates values against a 
          java.text.DateFormat.  There are three helper methods
          that create built-in validators.
        
getDateInstancereturns a validator for the default date format for the default locale.getTimeInstancereturns a validator for the default time format for the default locale.getDateTimeInstancereturns a validator for the default date and time format for the default locale.
          A DateValidator can also be created by passing your
          a custom DateFormat into the constructor.
        
DateFormat myFormat = DateFormat.getDateInstance( DateFormat.LONG, Locale.UK ); DateValidator myValidator = new DateValidator( myFormat );
          In addition to basic format checking you can also check if the date/time specified
          is before/after a specific date/time.  The lower bound is set using the 
          setMinimum( java.util.Date ), and the upper bound is set using
          the setMaximum( java.util.Date ).
        
TODO: add section about values being replaced with date instances
          The EnumValidator validates values against a list of
          allowed string values.  The values that are allowed are specified in
          a java.util.Set and passed in to the constructor.
        
Set enumSet = new TreeSet();
enumSet.add("red");
enumSet.add("green");
enumSet.add("blue");
       
EnumValidator validator = new EnumValidator( enumSet );
          The FileValidator validates that values represent
          existing files.  You can also specify a combination of the 
          following additional criteria:
        
- value is a file
 - value is a directory
 - the file is writable
 - the file is readable
 
Each of the criteria listed here are specified using the appropriate setter.
There are three helper methods to create validators:
getExistingInstancereturns a validator that ensures a value represents an existing file.getExistingFileInstancereturns a validator that ensures a value represents an existing file that is not a directory.getExistingDirectoryInstancereturns a validator that ensures a value represents an existing file this is a directory.
// validate that the value represents a file that exists FileValidator validator = FileValidator.getExistingInstance(); // ensure it's a writable file validator.setWritable( true );
          The NumberValidator validates that values adhere to 
          certain rules like the following:
        
getCurrencyInstancereturns a validator for the default currency format for the default locale.getPercentInstancereturns a validator for the default percent format for the default locale.getIntegerInstancereturns a validator for the default integer format for the default locale.getNumberInstancereturns a validator for the default number format for the default locale.
          A NumberValidator can also be created by passing your
          a custom NumberFormat into the constructor.
        
NumberFormat myFormat = NumberFormat.getCurrencyInstance( Locale.UK ); NumberValidator myValidator = new NumberValidator( myFormat );
          In addition to basic format checking you can also check if the number specified
          is less than or greater than a specific number.  The lower bound is set using 
          the setMinimum( Number ), and the upper bound is set using
          the setMaximum( Number ).
        
          A URIValidator validates that a given URI is parsable
          and optionally provides support for scheme validation.
        
URIValidator validator = new URIValidator();
          A URLValidator validates that values are URLs and if you
          choose it will also validate the protocol is of the type you have
          specified.
        
UrlValidator validator = new UrlValidator();
// only accept https URLs
validator.setProtocol("https");