12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
# File 'lib/perspectives/memoization.rb', line 12
def memoize_property(prop_name)
raise ArgumentError, "No method #{prop_name}" unless method_defined?(prop_name)
original_property_method = "_unmemoized_#{prop_name}"
raise ArgumentError, "Already memoized property #{prop_name.inspect}" if method_defined?(original_property_method)
ivar = "@_memoized_#{prop_name.to_s.sub(/\?\Z/, '_query').sub(/!\Z/, '_bang')}"
alias_method original_property_method, prop_name
class_eval <<-CODE, __FILE__, __LINE__ + 1
def #{prop_name} # def name
return #{ivar} if defined?(#{ivar}) # return @_memoized_name if defined?(@_memoized_name)
#{ivar} = #{original_property_method} # @_memoized_name = _unmemoized_name
end
CODE
end
|