docs: function(value, options){
          // NOTE - the nesting is taken care of by validateParams.validate()
          // so the valueConstraints don't need to be applied here
          
          // implicitly pass undefined
          if(typeof value === 'undefined') return undefined;
          
          // make sure the default options object exists
          if(typeof this.options !== 'object') this.options = {};
          
          // build up a base config from the pre-defined defaults
          var config = {};
          config.arrayOnly = this.options.arrayOnly ? true : false;
          config.lengthIs = parseInt(this.options.lengthIs); // NaN means ignore this option
          config.minimumLength = parseInt(this.options.minimumLength); // NaN means ignore this option
          config.maximumLength = parseInt(this.options.maximumLength); // NaN means ignore this option
          config.message = validateParams.extractValidatorMessage(this, options);
          
          // interpret the passed value
          if(typeof options === 'boolean'){
              config.arrayOnly = true;
          }else if(validate.isObject(options)){
              if(options.arrayOnly) config.arrayOnly = true;
              if(!isNaN(parseInt(options.lengthIs))) config.lengthIs = parseInt(options.lengthIs);
              if(!isNaN(parseInt(options.minimumLength))) config.minimumLength = parseInt(options.minimumLength);
              if(!isNaN(parseInt(options.maximumLength))) config.maximumLength = parseInt(options.maximumLength);
              if(validate.isString(options.message)) config.message = options.message;
          }else{
              throw new Error('invalid options passed - must be true or a plain object');
          }
          
          // flip the size bounds if needed
          if(!(isNaN(config.minimumLength) || isNaN(config.maximumLength))){
              if(config.maximumLength < config.minimumLength){
                  var trueMin = config.maximumLength;
                  var trueMax = config.minimumLength;
                  config.maximumLength = trueMax;
                  config.minimumLength = trueMin;
              }
          }
          
          // implicitly reject non-lists
          if(!(validate.isArray(value) || validateParams.isArguments(value))){
              return config.message ? config.message : 'must be an array or an arguments object';
          }
          
          var errors = [];
          
          // deal with arrayOnly option
          if(config.arrayOnly && !validate.isArray(value)){
              errors.push('must be an array');
          }
          
          // deal with any specified length restrictions
          var arrLen = value.length;
          if(!isNaN(config.lengthIs) && arrLen !== config.lengthIs){
              errors.push('must have length of ' + config.lengthIs + ', but length is ' + arrLen);
          }
          if(!isNaN(config.minimumLength) && arrLen < config.minimumLength){
              errors.push('must have length of at least ' + config.minimumLength + ', but length is ' + arrLen);
          }
          if(!isNaN(config.maximumLength) && arrLen > config.maximumLength){
              errors.push('cannot have length greater than ' + config.maximumLength + ', but length is ' + arrLen);
          }
          
          // retrun as appropraite
          if(errors.length > 0){
              return config.message ? config.message : errors;
          }
          return undefined;
      }