module ForgetMeNot::Memoizable::ClassMethods

Public Instance Methods

memoize(*methods) click to toggle source
# File lib/forget-me-not/memoizable.rb, line 13
def memoize(*methods)
  options = methods.last.is_a?(Hash) ? methods.pop : {}
  methods.each { |m| memoize_method(m, options) }
end
memoize_with_args(*methods) click to toggle source
# File lib/forget-me-not/memoizable.rb, line 18
def memoize_with_args(*methods)
  options = methods.last.is_a?(Hash) ? methods.pop : {}
  options = options.merge(allow_args: true)
  methods.each { |m| memoize_method(m, options) }
end

Private Instance Methods

define_memoized_method(method, _) click to toggle source
# File lib/forget-me-not/memoizable.rb, line 33
def define_memoized_method(method, _)
  method_name = method.name.to_sym
  key_prefix = "/memoized_method_result/#{self.name}"

  undef_method(method_name)
  define_method(method_name) do |*args, &block|
    raise 'Cannot pass blocks to memoized methods' if block

    memoize_key = [
        key_prefix,
        method_name,
        args.hash
    ].compact.join '/'

    if Memoizable.log_activity
      Memoizable.logger.info("key: #{memoize_key}")
    end

    fetch_from_storage(memoize_key) do
      method.bind(self).call(*args)
    end
  end
end
memoize_method(method_name, options) click to toggle source
# File lib/forget-me-not/memoizable.rb, line 25
def memoize_method(method_name, options)
  method = instance_method(method_name)
  raise 'Cannot memoize with arity > 0.  Use memoize_with_args instead.' if method.arity > 0 && !options[:allow_args]
  visibility = method_visibility(method_name)
  define_memoized_method(method, options)
  send(visibility, method_name)
end
method_visibility(method) click to toggle source
# File lib/forget-me-not/memoizable.rb, line 57
def method_visibility(method)
  if private_method_defined?(method)
    :private
  elsif protected_method_defined?(method)
    :protected
  else
    :public
  end
end