code: public static <T, F> FieldAugment<T, F> augment(Class<T> type, Class<? super F> fieldType, String name) {
  		checkNotNull(type, "type");
  		checkNotNull(fieldType, "fieldType");
  		checkNotNull(name, "name");
  		
  		@SuppressWarnings("unchecked")
  		F defaultValue = (F) getDefaultValue(fieldType);
  		FieldAugment<T, F> ret = tryCreateReflectionAugment(type, fieldType, name, defaultValue);
  		return ret != null ? ret : new MapFieldAugment<T, F>(defaultValue);
  	}
docs: (Virtually) adds a field to an existing type and returns an object that can be used to read and write this field.
  <p>
  If the type already declares a non-final instance field with the given name and a compatible field type, that field will be used.
  Otherwise the field will be provided virtually.
  <p>
  <em>WARNING</em>: The values put into the augment should NOT reference in any way the object you've added the augment to, or memory leaks may occur.
  If you do need to add such references, use {@link #circularSafeAugment(Class, Class, String, Object)} instead.
  <p>
  This code assumes that for any combination of {@code type} and {@code name} this method is only called once.
  Otherwise, whether state is shared is undefined.
  
  @param type to augment
  @param fieldType type of the field
  @param name of the field
  @param defaultValue the value of the augment if it hasn't been set yet.
  @throws NullPointerException if {@code type}, {@code fieldType} or {@code name} is {@code null}