code: public <V> V computeIfAbsent(Key<V> key, Supplier<V> supplier) {
      V value = get(key);
      if (value != null) {
        return value;
      } else if (canStore(key)) {
        entries.put(key, RECURSION_SENTINEL);
        value = supplier.get();
        entries.put(key, requireNonNull(value));
        return value;
      } else if (parent != null) {
        return parent.computeIfAbsent(key, supplier);
      } else {
        throw new IllegalStateException(
            "Not in " + key.level().toString().toLowerCase() + " scope");
      }
    }
docs: If {@code key} is not already associated with a value, computes its value using
  {@code supplier} and enters it into the scope.
  
  @return the current (existing or computed) value associated with {@code key}