class Geocoder::Cache

def [](url)


Read from the Cache.
#
def [](url)
  interpret case
    when store.respond_to?(:[])
      store[key_for(url)]
    when store.respond_to?(:get)
      store.get key_for(url)
    when store.respond_to?(:read)
      store.read key_for(url)
  end
rescue => e
  warn "Geocoder cache read error: #{e}"
end

def []=(url, value)


Write to the Cache.
#
def []=(url, value)
  case
    when store.respond_to?(:[]=)
      store[key_for(url)] = value
    when store.respond_to?(:set)
      store.set key_for(url), value
    when store.respond_to?(:write)
      store.write key_for(url), value
  end
rescue => e
  warn "Geocoder cache write error: #{e}"
end

def expire(url)


or pass :all to clear all URLs.
Delete cache entry for given URL,
#
def expire(url)
  if url == :all
    if store.respond_to?(:keys)
      urls.each{ |u| expire(u) }
    else
      raise(NoMethodError, "The Geocoder cache store must implement `#keys` for `expire(:all)` to work")
    end
  else
    expire_single_url(url)
  end
end

def expire_single_url(url)

def expire_single_url(url)
  key = key_for(url)
  store.respond_to?(:del) ? store.del(key) : store.delete(key)
end

def initialize(store, prefix)

def initialize(store, prefix)
  @store = store
  @prefix = prefix
end

def interpret(value)


(Some key/value stores return empty string instead of nil.)
Clean up value before returning. Namely, convert empty string to nil.
#
def interpret(value)
  value == "" ? nil : value
end

def key_for(url)


Cache key for a given URL.
#
def key_for(url)
  if url.match(/^#{prefix}/)
    url
  else
    [prefix, url].join
  end
end

def keys


that have non-nil values.
Array of keys with the currently configured prefix
#
def keys
  store.keys.select{ |k| k.match(/^#{prefix}/) and self[k] }
end

def prefix; @prefix; end

def prefix; @prefix; end

def store; @store; end

def store; @store; end

def urls


Array of cached URLs.
#
def urls
  keys.map{ |k| k[/^#{prefix}(.*)/, 1] }
end