docs: function doValidateAdd(context, inMultiple) {
    //console.log('doValidateAdd', util.inspect(context, {depth: null}), inMultiple);
  
    if (!inMultiple && context.schema.multiple) {
      //console.log('should have multiple values');
  
      if (context.data !== undefined) {
        if (context.schema.object) {
          if (!(context.data instanceof Object)) {
            throw new errors.DataTypeError('Existing data'
                + (context.parameterName ? ' for ' + context.parameterName 
                : '') + ' is not an object as it should be', context);
          }
        } else {
          if (!(context.data instanceof Array)) {
            throw new errors.DataTypeError('Existing data'
                + (context.parameterName ? ' for ' + context.parameterName : '')
                + ' is not an array as it should be', context);
          }
        }
      }
  
      if (context.newData === undefined) {
        if (context.data !== undefined) {
          return context.data;
        } else if (context.schema.default) {
          return (context.data = clone(context.schema.default));
        } else {
          if (context.schema.required) {
            throw new errors.DataRequiredError('Value' + (context.parameterName
                ? ' for ' + context.parameterName
                      : '') + ' required', context);
          }
          return undefined;
        }
      }
  
      if (context.schema.object) {
        //console.log('store in object');
        if (context.newData) {
          // Throw if we don't have an Object
          if (!(context.newData instanceof Object)) {
            throw new errors.DataTypeError('Value'
                + (context.parameterName ? ' for ' + context.parameterName : '')
                + ' must be an object of values (' + typeof context.newData
                + ' given)', context);
          }
          var newData;
          if (context.data === undefined || shouldReplace(context)) {
            newData = {};
          } else {
            newData = context.data;
          }
  
          var o, newDataPart;
  
          for (o in context.newData) {
            //console.log('looking at ' + o + ' in newData');
            if ((newDataPart = doValidateAdd(merge({}, context, {
                  newData: context.newData[o],
                  data: newData[o],
                  parameterName: (context.parameterName ? context.parameterName
                      + '.' : '') + o
                }), true)) !== undefined) {
              newData[o] = newDataPart;
            }
          }
  
          if (Object.keys(newData).length || context.newData !== undefined) {
            context.data = newData;
          }
        }
      } else {
        //console.log('store in array');
        // Throw if we don't have an Array
        if (!(context.newData instanceof Array)) {
          //console.log(context);
          throw new errors.DataTypeError('Value'
                    + (context.parameterName ? ' for ' + context.parameterName
                    : '') + ' must be an array of values (' 
                    + typeof context.newData + ' given)', context);
        }
  
        //let newData;
        //console.log(context.data);
        if (context.data === undefined || shouldReplace(context)) {
          //console.log('currently undefined, creating array');
          newData = [];
        } else {
          //console.log('have a value already');
          newData = context.data;
        }
  
        //let o, newDataPart;
  
        for (o in context.newData) {
          if ((newDataPart = doValidateAdd(merge({}, context, {
                newData: context.newData[o],
                data: undefined,
                parameterName: (context.parameterName ? context.parameterName
                    + '.' : '') + o
              }), true)) !== undefined) {
            newData.push(newDataPart);
          }
        }
  
        context.data = newData;
  
        if (context.schema.required) {
          if (context.schema.required instanceof Array
              && (context.data.length < context.schema.required[0]
              || (context.schema.required.length == 2
              && context.data.length > context.schema.required[1]))) {
            if (context.schema.required.length == 2) {
              if (context.schema.required[0] === context.schema.required[1]) {
                throw new errors.DataItemsError('Must have exactly '
                    + context.schema.required[0] + ' item(s)'
                      + (context.parameterName ? ' for ' + context.parameterName
                      : ''), context);
              } else {
                throw new errors.DataItemsError('Must have between '
                    + context.schema.required.join(' and ') + ' item(s)'
                      + (context.parameterName ? ' for ' + context.parameterName
                      : ''), context);
              }
            } else {
              throw new errors.DataItemsError('Must have atleast '
                  + context.schema.required[0] + ' item(s)'
                    + (context.parameterName ? ' for ' + context.parameterName
                    : ''), context);
            }
          }
  
        }
      }
    } else {
      return setValueToType(context);
    }
  
    return context.data;
  }