code: public static Map<String, Object> mapOf(Object data) {
      if (data == null || isNull(data)) {
        return Collections.emptyMap();
      }
      if (data instanceof Map<?, ?>) {
        @SuppressWarnings("unchecked")
        Map<String, Object> result = (Map<String, Object>) data;
        return result;
      }
      Map<String, Object> result = new DataMap(data, false);
      return result;
    }
docs: Returns the map to use for the given data that is treated as a map from string key to some
  value.
  
  <p>If the input is {@code null}, it returns an empty map. If the input is a map, it simply
  returns the input. Otherwise, it will create a map view using reflection that is backed by the
  object, so that any changes to the map will be reflected on the object. The map keys of that
  map view are based on the {@link Key} annotation, and null is not a possible map value,
  although the magic null instance is possible (see {@link #nullOf(Class)} and {@link
  #isNull(Object)}). Iteration order of the data keys is based on the sorted (ascending) key
  names of the declared fields. Note that since the map view is backed by the object, and that
  the object may change, many methods in the map view must recompute the field values using
  reflection, for example {@link Map#size()} must check the number of non-null fields.
  
  @param data any key value data, represented by an object or a map, or {@code null}
  @return key/value map to use