public
Rubygem
Description: Ultra lightweight gem/plugin to do in-memory caching of any Ruby method
Homepage: http://github.com/JackDanger/simple_memoize
Clone URL: git://github.com/JackDanger/simple_memoize.git
JackDanger (author)
Fri Apr 25 15:30:56 -0700 2008
commit  06a7300f772b9791cc55ac5fd119dcc0ed62e987
tree    cbb7178631b5fbc23a4e1b638d7b6cc1dc2fed0a
parent  aa50a585cb9fa84291b9c0871f34a3ffb89c2d17
simple_memoize / lib / simple_memoize.rb
100644 33 lines (26 sloc) 1.127 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
module SimpleMemoize
  VERSION = '1.1.0'
 
  module Module
    def memoize(*method_names)
      method_names.each do |method_name|
        method_name = method_name.to_s
        memoized_method_name = "#{method_name}_with_memo"
        regular_method_name = "#{method_name}_without_memo"
 
        unless (instance_methods + private_instance_methods).include?(method_name)
          raise NoMethodError, "The Method '#{method_name}' cannot be memoized because it doesn't exist in #{self}"
        end
        return if self.method_defined?(memoized_method_name)
    
        self.class_eval "
def #{memoized_method_name}(*args)
@#{method_name} ||= #{regular_method_name}(*args)
end
 
alias_method :#{regular_method_name}, :#{method_name}
alias_method :#{method_name}, :#{memoized_method_name}
 
protected :#{method_name} if protected_instance_methods.include?('#{regular_method_name}')
private :#{method_name} if private_instance_methods.include?('#{regular_method_name}')
"
      end
    end
  end
end
 
Module.send :include, SimpleMemoize::Module