public <S> BuilderStage3a<S> withStateSupplier(final Supplier<S> stateSupplier) {
            return new BuilderStage3a<>(this, stateSupplier);
        }
@param stateSupplier Will generally be called once per checkInterval unless multiple threads
                     call {@link CachedValue#getValue()} at once, in which case
                     it may be called by multiple threads at once. Should be side effect free.
                     Value returned must implement equals method to determine if it has changed.
stroom-util/src/main/java/stroom/util/concurrent/CachedValue.java