module MethodCache

Public Class Methods

default_cache() click to toggle source
# File lib/method_cache.rb, line 73
def self.default_cache
  @default_cache ||= LocalCache.new
end
disable(value = true) { || ... } click to toggle source
# File lib/method_cache.rb, line 113
def self.disable(value = true, &block)
  @disabled, old = true, @disabled
  yield
ensure
  @disabled = old
end
disabled?() click to toggle source
# File lib/method_cache.rb, line 120
def self.disabled?
  @disabled
end

Public Instance Methods

cache_class_method(method_name, opts = {}) click to toggle source
# File lib/method_cache.rb, line 38
def cache_class_method(method_name, opts = {})
  method_name = method_name.to_sym
  proxy = opts.kind_of?(Proxy) ? opts : Proxy.new(method_name, opts)

  return if methods.include?(proxy.method_name_without_caching)

  if cached_class_methods.empty?
    extend(HelperMethods)
    extend(SingletonMethodAdded)
  end

  method_name = method_name.to_sym
  cached_class_methods[method_name] = nil
  if class_method_defined?(method_name)
    (class << self; self; end).module_eval do
      if proxy.opts[:counter]
        define_method "increment_#{method_name}", proxy.counter_method(:increment)
        define_method "decrement_#{method_name}", proxy.counter_method(:decrement)
      end

      # Replace class method.
      alias_method proxy.method_name_without_caching, method_name
      define_method method_name, proxy.method_with_caching
    end
  end
  cached_class_methods[method_name] = proxy
end
cache_method(method_name, opts = {}) click to toggle source
# File lib/method_cache.rb, line 6
def cache_method(method_name, opts = {})
  method_name = method_name.to_sym
  proxy = opts.kind_of?(Proxy) ? opts : Proxy.new(method_name, opts)

  if self.class == Class
    return if instance_methods.include?(proxy.method_name_without_caching)

    if cached_instance_methods.empty?
      include(HelperMethods)
      extend(MethodAdded)
    end

    cached_instance_methods[method_name] = nil
    if method_defined?(method_name) or private_method_defined?(method_name)
      if proxy.opts[:counter]
        define_method "increment_#{method_name}", proxy.counter_method(:increment)
        define_method "decrement_#{method_name}", proxy.counter_method(:decrement)
      end

      # Replace instance method.
      alias_method proxy.method_name_without_caching, method_name
      define_method method_name, proxy.method_with_caching
    end
    cached_instance_methods[method_name] = proxy

  elsif self.class == Module
    # We will alias all methods when the module is mixed-in.
    extend(ModuleAdded) if cached_module_methods.empty?
    cached_module_methods[method_name.to_sym] = proxy
  end
end
cached_class_methods(method_name = nil) click to toggle source
# File lib/method_cache.rb, line 91
def cached_class_methods(method_name = nil)
  if method_name
    method_name = method_name.to_sym
    ancestors.each do |klass|
      next unless klass.kind_of?(MethodCache)
      proxy = klass.cached_class_methods[method_name]
      return proxy if proxy
    end
    nil
  else
    @cached_class_methods ||= {}
  end
end
cached_instance_methods(method_name = nil) click to toggle source
# File lib/method_cache.rb, line 77
def cached_instance_methods(method_name = nil)
  if method_name
    method_name = method_name.to_sym
    ancestors.each do |klass|
      next unless klass.kind_of?(MethodCache)
      proxy = klass.cached_instance_methods[method_name]
      return proxy if proxy
    end
    nil
  else
    @cached_instance_methods ||= {}
  end
end
cached_module_methods(method_name = nil) click to toggle source
# File lib/method_cache.rb, line 105
def cached_module_methods(method_name = nil)
  if method_name
    cached_module_methods[method_name.to_sym]
  else
    @cached_module_methods ||= {}
  end
end
class_method_defined?(method_name) click to toggle source
# File lib/method_cache.rb, line 66
def class_method_defined?(method_name)
  method(method_name)
  true
rescue NameError
  false
end