docs: @Override
  	protected void performValidation(String path, Object value, List<ValidationResult> results) {
  		super.performValidation(path, value, results);
  
  		if (value == null)
  			return;
  
  		String name = path != null ? path : "value";
  		Map<String, Object> properties = ObjectReader.getProperties(value);
  
  		// Process defined properties
  		if (_properties != null) {
  			for (PropertySchema propertySchema : _properties) {
  				String processedName = null;
  
  				for (Map.Entry<String, Object> entry : properties.entrySet()) {
  					String propertyName = entry.getKey();
  					Object propertyValue = entry.getValue();
  					// Find properties case insensitive
  					if (propertyName.equalsIgnoreCase(propertySchema.getName())) {
  						propertySchema.performValidation(path, propertyValue, results);
  						processedName = propertyName;
  						break;
  					}
  				}
  
  				if (processedName == null)
  					propertySchema.performValidation(path, null, results);
  				else
  					properties.remove(processedName);
  			}
  		}
  
  		// Process unexpected properties
  		for (Map.Entry<String, Object> entry : properties.entrySet()) {
  			String propertyPath = path == null || path.length() == 0 ? entry.getKey() : path + "." + entry.getKey();
  
  			results.add(new ValidationResult(propertyPath, ValidationResultType.Warning, "UNEXPECTED_PROPERTY",
  					name + " contains unexpected property " + entry.getKey(), null, entry.getKey()));
  		}
  	}