code: @SuppressWarnings({ "unchecked", "rawtypes" })
    protected Object getFromMap(CachingPojoPath currentPath, PojoPathContext context, PojoPathState state, Map parentPojo) {
  
      // determine pojo type
      GenericType pojoType = currentPath.parent.pojoType;
      GenericType componentType = pojoType.getComponentType();
      if (componentType.getRetrievalClass() == Object.class) {
        currentPath.pojoClass = Object.class;
      } else {
        currentPath.pojoType = componentType;
        currentPath.pojoClass = componentType.getAssignmentClass();
      }
      Object result = null;
      if (!state.isGetType()) {
        result = parentPojo.get(currentPath.getSegment());
        if ((result == null) && (state.mode == PojoPathMode.CREATE_IF_NULL)) {
          result = create(currentPath, context, state, currentPath.pojoClass);
          parentPojo.put(currentPath.getSegment(), result);
        }
      }
      return result;
    }
docs: This method {@link Map#get(Object) gets} the single {@link CachingPojoPath#getSegment() segment} of the given
  {@code currentPath} from the {@link Map} given by {@code parentPojo}. If the result is {@code null} and
  {@link PojoPathState#getMode() mode} is {@link PojoPathMode#CREATE_IF_NULL} it creates and
  {@link Map#put(Object, Object) attaches} the missing object.
  
  @param currentPath is the current {@link CachingPojoPath} to evaluate.
  @param context is the {@link PojoPathContext context} for this operation.
  @param state is the {@link #createState(Object, String, PojoPathMode, PojoPathContext) state} of this operation.
  @param parentPojo is the parent object to work on.
  @return the result of the evaluation. It might be {@code null} according to the {@link PojoPathState#getMode()
  mode}.