module ActiveSupport::Cache::Strategy::LocalCache

def bypass_local_cache

def bypass_local_cache
  use_temporary_local_cache(nil) { yield }
end

def cleanup(options = nil) # :nodoc:

:nodoc:
def cleanup(options = nil) # :nodoc:
  return super unless cache = local_cache
  cache.clear(options)
  super
end

def clear(options = nil) # :nodoc:

:nodoc:
def clear(options = nil) # :nodoc:
  return super unless cache = local_cache
  cache.clear(options)
  super
end

def decrement(name, amount = 1, options = nil) # :nodoc:

:nodoc:
def decrement(name, amount = 1, options = nil) # :nodoc:
  return super unless local_cache
  value = bypass_local_cache{super}
  write_cache_value(name, value, options)
  value
end

def delete_entry(key, options) # :nodoc:

:nodoc:
def delete_entry(key, options) # :nodoc:
  local_cache.delete_entry(key, options) if local_cache
  super
end

def increment(name, amount = 1, options = nil) # :nodoc:

:nodoc:
def increment(name, amount = 1, options = nil) # :nodoc:
  return super unless local_cache
  value = bypass_local_cache{super}
  write_cache_value(name, value, options)
  value
end

def local_cache

def local_cache
  LocalCacheRegistry.cache_for(local_cache_key)
end

def local_cache_key

def local_cache_key
  @local_cache_key ||= "#{self.class.name.underscore}_local_cache_#{object_id}".gsub(/[\/-]/, '_').to_sym
end

def middleware

duration of request.
Middleware class can be inserted as a Rack handler to be local cache for the
def middleware
  @middleware ||= Middleware.new(
    "ActiveSupport::Cache::Strategy::LocalCache",
    local_cache_key)
end

def read_entry(key, options) # :nodoc:

:nodoc:
def read_entry(key, options) # :nodoc:
  if cache = local_cache
    cache.fetch_entry(key) { super }
  else
    super
  end
end

def set_cache_value(value, name, amount, options) # :nodoc:

:nodoc:
def set_cache_value(value, name, amount, options) # :nodoc:
  ActiveSupport::Deprecation.warn(<<-MESSAGE.strip_heredoc)
    `set_cache_value` is deprecated and will be removed from Rails 5.1.
    Please use `write_cache_value` instead.
  MESSAGE
  write_cache_value name, value, options
end

def use_temporary_local_cache(temporary_cache)

def use_temporary_local_cache(temporary_cache)
  save_cache = LocalCacheRegistry.cache_for(local_cache_key)
  begin
    LocalCacheRegistry.set_cache_for(local_cache_key, temporary_cache)
    yield
  ensure
    LocalCacheRegistry.set_cache_for(local_cache_key, save_cache)
  end
end

def with_local_cache

Use a local cache for the duration of block.
def with_local_cache
  use_temporary_local_cache(LocalStore.new) { yield }
end

def write_cache_value(name, value, options) # :nodoc:

:nodoc:
def write_cache_value(name, value, options) # :nodoc:
  name = normalize_key(name, options)
  cache = local_cache
  cache.mute do
    if value
      cache.write(name, value, options)
    else
      cache.delete(name, options)
    end
  end
end

def write_entry(key, entry, options) # :nodoc:

:nodoc:
def write_entry(key, entry, options) # :nodoc:
  local_cache.write_entry(key, entry, options) if local_cache
  super
end