code: public static CharSequence removePrefix(CharSequence fieldName, List<String> prefixes) {
  		if (prefixes == null || prefixes.isEmpty()) return fieldName;
  		
  		fieldName = fieldName.toString();
  		
  		outer:
  		for (String prefix : prefixes) {
  			if (prefix.length() == 0) return fieldName;
  			if (fieldName.length() <= prefix.length()) continue outer;
  			for (int i = 0; i < prefix.length(); i++) {
  				if (fieldName.charAt(i) != prefix.charAt(i)) continue outer;
  			}
  			char followupChar = fieldName.charAt(prefix.length());
  			// if prefix is a letter then follow up letter needs to not be lowercase, i.e. 'foo' is not a match
  			// as field named 'oo' with prefix 'f', but 'fOo' would be.
  			if (Character.isLetter(prefix.charAt(prefix.length() - 1)) &&
  					Character.isLowerCase(followupChar)) continue outer;
  			return "" + Character.toLowerCase(followupChar) + fieldName.subSequence(prefix.length() + 1, fieldName.length());
  		}
  		
  		return null;
  	}
docs: Given the name of a field, return the 'base name' of that field. For example, {@code fFoobar} becomes {@code foobar} if {@code f} is in the prefix list.
  For prefixes that end in a letter character, the next character must be a non-lowercase character (i.e. {@code hashCode} is not {@code ashCode} even if
  {@code h} is in the prefix list, but {@code hAshcode} would become {@code ashCode}). The first prefix that matches is used. If the prefix list is empty,
  or the empty string is in the prefix list and no prefix before it matches, the fieldName will be returned verbatim.
  
  If no prefix matches and the empty string is not in the prefix list and the prefix list is not empty, {@code null} is returned.
  
  @param fieldName The full name of a field.
  @param prefixes A list of prefixes, usually provided by the {@code Accessors} settings annotation, listing field prefixes.
  @return The base name of the field.