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