@SuppressWarnings("unchecked")
  @Nullable
  public <T> T getData(@NotNull Key<T> key) {
    if (this.key.equals(key)) {
      return (T)data;
    }
    for (DataNode<?> p = parent; p != null; p = p.parent) {
      if (p.key.equals(key)) {
        return (T)p.data;
      }
    }
    return null;
  }
@SuppressWarnings("unchecked")
  @Nullable
  public <T> T getData(@NotNull Key<T> key)