|
8a9934a9
»
|
josh |
2008-07-14 |
Added Memoizable mixin for ...  |
1 |
module ActiveSupport |
|
8a87d8a6
»
|
josh |
2008-07-22 |
Improved Memoizable test co... |
2 |
module Memoizable |
| |
3 |
module Freezable |
| |
4 |
def self.included(base) |
| |
5 |
base.class_eval do |
| |
6 |
unless base.method_defined?(:freeze_without_memoizable) |
| |
7 |
alias_method_chain :freeze, :memoizable |
| |
8 |
end |
| |
9 |
end |
| |
10 |
end |
| |
11 |
|
| |
12 |
def freeze_with_memoizable |
| |
13 |
methods.each do |method| |
|
ae6105ef
»
|
jeremy |
2008-07-27 |
Don't rememoize if already ... |
14 |
__send__($1) if method.to_s =~ /^_unmemoized_(.*)/ |
| |
15 |
end unless frozen? |
| |
16 |
|
|
8a87d8a6
»
|
josh |
2008-07-22 |
Improved Memoizable test co... |
17 |
freeze_without_memoizable |
| |
18 |
end |
| |
19 |
end |
| |
20 |
|
|
ef6f6625
»
|
josh |
2008-07-18 |
Changed ActiveSupport::Memo...  |
21 |
def memoize(*symbols) |
| |
22 |
symbols.each do |symbol| |
|
8a87d8a6
»
|
josh |
2008-07-22 |
Improved Memoizable test co... |
23 |
original_method = "_unmemoized_#{symbol}" |
| |
24 |
memoized_ivar = "@_memoized_#{symbol}" |
|
ef6f6625
»
|
josh |
2008-07-18 |
Changed ActiveSupport::Memo...  |
25 |
|
|
8a87d8a6
»
|
josh |
2008-07-22 |
Improved Memoizable test co... |
26 |
class_eval <<-EOS, __FILE__, __LINE__ |
| |
27 |
include Freezable |
|
ef6f6625
»
|
josh |
2008-07-18 |
Changed ActiveSupport::Memo...  |
28 |
|
|
8a87d8a6
»
|
josh |
2008-07-22 |
Improved Memoizable test co... |
29 |
raise "Already memoized #{symbol}" if method_defined?(:#{original_method}) |
| |
30 |
alias #{original_method} #{symbol} |
| |
31 |
|
| |
32 |
def #{symbol}(*args) |
| |
33 |
#{memoized_ivar} ||= {} |
| |
34 |
reload = args.pop if args.last == true || args.last == :reload |
|
c609be45
»
|
josh |
2008-07-18 |
Ruby 1.9: Ensure Memoizable... |
35 |
|
|
8a87d8a6
»
|
josh |
2008-07-22 |
Improved Memoizable test co... |
36 |
if !reload && #{memoized_ivar} && #{memoized_ivar}.has_key?(args) |
| |
37 |
#{memoized_ivar}[args] |
|
ef6f6625
»
|
josh |
2008-07-18 |
Changed ActiveSupport::Memo...  |
38 |
else |
|
8a87d8a6
»
|
josh |
2008-07-22 |
Improved Memoizable test co... |
39 |
#{memoized_ivar}[args] = #{original_method}(*args).freeze |
|
ef6f6625
»
|
josh |
2008-07-18 |
Changed ActiveSupport::Memo...  |
40 |
end |
| |
41 |
end |
| |
42 |
EOS |
|
8a9934a9
»
|
josh |
2008-07-14 |
Added Memoizable mixin for ...  |
43 |
end |
| |
44 |
end |
| |
45 |
end |
| |
46 |
end |