docs: private boolean isChanged(String name, Object[] values, boolean orderMatters) {
  
  		NameAwareAttribute orig = originalAttrs.get(name);
  		NameAwareAttribute prev = updatedAttrs.get(name);
  
  		// values == null and values.length == 0 is treated the same way
  		boolean emptyNewValue = (values == null || values.length == 0);
  
  		// Setting to empty ---------------------
  		if (emptyNewValue) {
  			// FALSE: if both are null, it is not changed (both don't exist)
  			// TRUE: if new value is null and old value exists (should be
  			// removed)
  			// TODO Also include prev in null check
  			// TODO Also check if there is a single null element
              return orig != null;
          }
  
  		// NOT setting to empty -------------------
  
  		// TRUE if existing value is null
  		if (orig == null) {
  			return true;
  		}
  
  		// TRUE if different length compared to original attributes
  		if (orig.size() != values.length) {
  			return true;
  		}
  
  		// TRUE if different length compared to previously updated attributes
  		if (prev != null && prev.size() != values.length) {
  			return true;
  		}
  
  		// Check contents of arrays
  
  		// Order DOES matter, e.g. first names
  		if (isAttributeUpdated(values, orderMatters, orig))
  			return true;
  
  		if (prev != null) {
  			// Also check against updatedAttrs, since there might have been
  			// a previous update
  			if (isAttributeUpdated(values, orderMatters, prev))
  				return true;
  		}
  		// FALSE since we have compared all values
  		return false;
  	}