@@ -53,40 +53,47 @@ def memoized?(method_name)
53
53
def prepend_memery_module!
54
54
return if defined? ( @_memery_module )
55
55
@_memery_module = Module . new { extend MemoizationModule }
56
- prepend @_memery_module
56
+ prepend ( @_memery_module )
57
57
end
58
58
59
- def define_memoized_method! ( * args , **kwargs )
60
- @_memery_module . public_send __method__ , self , * args , **kwargs
59
+ def define_memoized_method! ( method_name , **options )
60
+ @_memery_module . define_memoized_method! ( self , method_name , **options )
61
61
end
62
62
63
63
module MemoizationModule
64
+ Cache = Struct . new ( :result , :time ) do
65
+ def fresh? ( ttl )
66
+ return true if ttl . nil?
67
+ Memery . monotonic_clock <= time + ttl
68
+ end
69
+ end
70
+
64
71
def define_memoized_method! ( klass , method_name , condition : nil , ttl : nil )
65
72
method_key = "#{ method_name } _#{ object_id } "
66
73
67
74
original_visibility = method_visibility ( klass , method_name )
75
+ original_arity = klass . instance_method ( method_name ) . arity
68
76
69
- define_method method_name do |*args , &block |
77
+ define_method ( method_name ) do |*args , &block |
70
78
if block || ( condition && !instance_exec ( &condition ) )
71
79
return super ( *args , &block )
72
80
end
73
81
74
- store = ( @_memery_memoized_values ||= { } ) [ method_key ] ||= { }
82
+ cache_store = ( @_memery_memoized_values ||= { } )
83
+ cache_key = original_arity . zero? ? method_key : [ method_key , *args ]
84
+ cache = cache_store [ cache_key ]
75
85
76
- if store . key? ( args ) &&
77
- ( ttl . nil? || Memery . monotonic_clock <= store [ args ] [ :time ] + ttl )
78
- return store [ args ] [ :result ]
79
- end
86
+ return cache . result if cache &.fresh? ( ttl )
80
87
81
88
result = super ( *args )
82
- @_memery_memoized_values [ method_key ] [ args ] =
83
- { result : result , time : Memery . monotonic_clock }
89
+ new_cache = Cache . new ( result , Memery . monotonic_clock )
90
+ cache_store [ cache_key ] = new_cache
91
+
84
92
result
85
93
end
86
94
87
- ruby2_keywords method_name
88
-
89
- send original_visibility , method_name
95
+ ruby2_keywords ( method_name )
96
+ send ( original_visibility , method_name )
90
97
end
91
98
92
99
private
0 commit comments