code: public Object extractObject(Object pValue, Stack<String> pPathParts, boolean pJsonify)
              throws AttributeNotFoundException {
          ObjectSerializationContext stackContext = stackContextLocal.get();
          String limitReached = checkForLimits(pValue, stackContext);
          Stack<String> pathStack = pPathParts != null ? pPathParts : new Stack<String>();
          if (limitReached != null) {
              return limitReached;
          }
          try {
              stackContext.push(pValue);
  
              if (pValue == null) {
                  return pathStack.isEmpty() ?
                          null :
                          stackContext.getValueFaultHandler().handleException(
                                  new AttributeNotFoundException("Cannot apply a path to an null value"));
              }
  
              if (pValue.getClass().isArray()) {
                  // Special handling for arrays
                  return arrayExtractor.extractObject(this,pValue,pathStack,pJsonify);
              }
              return callHandler(pValue, pathStack, pJsonify);
          } finally {
              stackContext.pop();
          }
      }
docs: Related to {@link #extractObjectWithContext} except that
  it does not setup a context. This method is called back from the
  various extractors to recursively continue the extraction, hence it is public.
  
  This method must not be used as entry point for serialization.
  Use {@link #convertToJson(Object, List, JsonConvertOptions)} or
  {@link #setInnerValue(Object, Object, List)} instead.
  
  @param pValue value to extract from
  @param pPathParts stack for diving into the object
  @param pJsonify whether a JSON representation {@link org.json.simple.JSONObject}
  @return extracted object either in native format or as {@link org.json.simple.JSONObject}
  @throws AttributeNotFoundException if an attribute is not found during traversal