code: public <V> V putIfAbsent(Key<V> key, V value) {
      requireNonNull(key);
      requireNonNull(value);
      if (canStore(key)) {
        @SuppressWarnings("unchecked")
        V existingValue = (V) entries.get(key);
        if (value == RECURSION_SENTINEL) {
          throw new ConcurrentModificationException(
              "Cannot access scope key " + key + " while computing its value");
        } else if (existingValue == null) {
          entries.put(key, value);
        }
        return existingValue;
      } else if (parent != null) {
        return parent.putIfAbsent(key, value);
      } else {
        throw new IllegalStateException(
            "Not in " + key.level().toString().toLowerCase() + " scope");
      }
    }
docs: If {@code key} is not already associated with a value, associates it with {@code value}.
  
  @return the original value, or {@code null} if there was no value associated