code: function Schema(options, descriptors) {
  
      if (!descriptors) {
          descriptors = options;
          options = null;
      }
  
      function opt(name, type) {
          var value = options[name];
          if (value !== undefined) {
              if (typeof value === type) return value;
              else throw new TypeError(current + 'options : ' + name + ': "' +
                  value + '" is not of type [' + type + ']');
          }
          else return false;
      }
  
      var current = 'Schema: arguments: ',
          defaults = { required: false };
  
      if (hasValue(options)) {
          if (type(options) === 'object') {
              defaults.required = opt('required', 'boolean');
              if (opt('validator', 'function')) defaults.validator = options.validator;
          }
          else throw new TypeError(current + 'options: must be of type [object]');
      }
  
      current += 'descriptors: ';
      if (typeof descriptors !== 'object')
          throw new TypeError(current + 'must be of type [object]');
      if (!Array.isArray(descriptors)) {
          descriptors = this.toDescriptors(descriptors, defaults);
      }
      if (options && options.extends instanceof Schema) {
          descriptors = this.extendDescriptors(descriptors, options.extends.descriptors);
      }
      if (!descriptors.length)
          throw new TypeError(current + 'contains no values');
      else if (!(descriptors[0] instanceof Descriptor)) {
          throw new TypeError(current + 'must be instances of Descriptor class');
      }
      var instance = this;
      this.descriptors = descriptors;
  
  }
docs: define expected property types and/or default values for properties
  @constructor