public <V> BuilderStage4<S, V> withValueFunction(final Function<S, V> valueFunction) {
            return new BuilderStage4<>(
                    builderStage2.maxCheckInterval,
                    stateSupplier,
                    valueFunction);
        }
@param valueFunction Will be called on first call of {@link CachedValue#getValue()}
                     then any time the value supplied by stateSupplier changes. If multiple
                     threads call {@link CachedValue#getValue()} at once valueSupplier
                     may be called by each thread. Should be side effect free.
stroom-util/src/main/java/stroom/util/concurrent/CachedValue.java