public static <T, E extends Throwable> ValueSupplier<T, E> asCaching(final ValueSupplier<? extends T, ? extends E> delegate) {
    return new ValueSupplier<T, E>() {
      private Reference<T> myRef;
      
      @Override
      public T get() throws E {
        T value = (myRef == null? null : myRef.get());
        if (value == null) {
          myRef = new WeakReference<>(value = delegate.get());
        }
        return value;
      }
    };
  }
public static <T, E extends Throwable> ValueSupplier<T, E> asCaching(final ValueSupplier<? extends T, ? extends E> delegate)