def fetch(key)
      @monitor.synchronize do
        found, value = get(key)
        found ? value : store(key, yield)
      end
    end
def fetch(key)
      @monitor.synchronize do
        found, value = get(key)
        found ? value : store(key, yield)
      end
    end
Retrieves a value from the cache, if available and not expired, or yields
 to a block that calculates the value to be stored in the cache.

 @param [Object] key
   The key to look up or store at.

 @yield yields when the value is not present.

 @yieldreturn [Object]
   The value to store in the cache.

 @return [Object]
   The value at the key.