class TimeBasedCache {

    public V get(K key)
    {
        // optimistically try to get the key without locking
        V value = _cache.get(key);
        if (value == null && mayReload())
        {
            reloadCache();
            value = _cache.get(key);
        }

        return value;
    }

    public  TimeBasedCache(Duration minTimeBetweenReloads, Supplier<ImmutableMap<K, V>> valuesSupplier);
    public  TimeBasedCache(Duration minTimeBetweenReloads,
                          Supplier<ImmutableMap<K, V>> valuesSupplier,
                          ImmutableMap<K, V> initialCache,
                          Clock clock);

}