whole_func_string: function validateObjectEntity(modelObject, entity, parents, errors) {
    if (!errors) errors = {};
    if (!errors.text) errors.text = [];
    if (!parents) parents = [];
  
    for (var key in entity) {
      var fieldName = parents + '.' + key;
      if (!modelObject || !modelObject[key]) {
        if (!errors.notRequired) errors.notRequired = [];
        errors.notRequired.push(fieldName);
        errors.text.push('Field ' + fieldName + ' not required');
      } else if (!modelObject[key].type) {
        validateObjectEntity(modelObject[key], entity[key], [parents, key], errors);
      } else if (!modelObject[key].check(entity[key])) {
        if (!errors.notMatched) errors.notMatched = {};
        errors.notMatched[fieldName] = modelObject[key].type;
        errors.text.push('Field ' + fieldName + ' not matched with type ' + modelObject[key].type);
      }
    }
  
    return errors;
  }
func_code_string: function validateObjectEntity(modelObject, entity, parents, errors) {
    if (!errors) errors = {};
    if (!errors.text) errors.text = [];
    if (!parents) parents = [];
  
    for (var key in entity) {
      var fieldName = parents + '.' + key;
      if (!modelObject || !modelObject[key]) {
        if (!errors.notRequired) errors.notRequired = [];
        errors.notRequired.push(fieldName);
        errors.text.push('Field ' + fieldName + ' not required');
      } else if (!modelObject[key].type) {
        validateObjectEntity(modelObject[key], entity[key], [parents, key], errors);
      } else if (!modelObject[key].check(entity[key])) {
        if (!errors.notMatched) errors.notMatched = {};
        errors.notMatched[fieldName] = modelObject[key].type;
        errors.text.push('Field ' + fieldName + ' not matched with type ' + modelObject[key].type);
      }
    }
  
    return errors;
  }
func_documentation_string: check for extra fields and match recursively