code: public Optional<Object> getData(Object key) {
          if (key == null) {
              throw new IllegalArgumentException("key cannot be null");
          }
          for (ContextData c = this; c != null; c = c.parent) {
              if (key.equals(c.key)) {
                  return Optional.of(c.value);
              }
          }
          return Optional.empty();
      }
docs: Scans the linked-list of {@link ContextData} objects looking for one with the specified key.
  Note that the first key found, i.e. the most recently added, will be returned.
  
  @param key the key to search for
  @return the value of the key if it exists