def fetch(key, options = {})
      options ||= {}
      value = read(key, options) unless options[:force]

      if value.nil? && block_given?
        value = yield(key)
        write(key, value, options)
      end

      value
    end
def fetch(key, options = {})
      options ||= {}
      value = read(key, options) unless options[:force]

      if value.nil? && block_given?
        value = yield(key)
        write(key, value, options)
      end

      value
    end
Fetches data from the cache, using the given key. If there is data in the
 cache with the given key, then that data is returned.

 If there is no such data in the cache (a cache miss), then `nil` will be
 returned. However, if a block has been passed, that block will be passed
 the key and executed in the event of a cache miss. The return value of
 the block will be written to the cache under the given cache key, and
 that return value will be returned.

 @param [String] key Key for lookup
 @param options [Hash] Optional overrides
 @option options [Boolean] :force Force a cache miss
 @yield [String] Gives a missing key to the block, which is used to
   generate the missing value

 @example Typical

   cache.write('today', 'Monday')
   cache.fetch('today') # => "Monday"
   cache.fetch('city')  # => nil

 @example With a block

   cache.fetch('city') do
     'Duckburgh'
   end

   cache.fetch('city') # => "Duckburgh"

 @example Cache Miss

   cache.write('today', 'Monday')
   cache.fetch('today', force: true) # => nil