public @Nullable T getValue(H h) {
    T data = h.getUserData(this);
    if (data == null) {
      RecursionGuard.StackStamp stamp = RecursionManager.markStack();
      data = myFunction.fun(h);
      if (stamp.mayCacheNow()) {
        //noinspection unchecked
        h.putUserData(this, data == null ? (T)ObjectUtils.NULL : data);
      }
    }
    return data == ObjectUtils.NULL ? null : data;
  }
public @Nullable T getValue(H h)