Module: Perspectives::Memoization::ClassMethods

Defined in:
lib/perspectives/memoization.rb

Instance Method Summary collapse

Instance Method Details

#memoize_property(prop_name) ⇒ Object

Raises:

  • (ArgumentError)


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

#property(name, *names, &block) ⇒ Object



8
9
10
# File 'lib/perspectives/memoization.rb', line 8

def property(name, *names, &block)
  super.tap { memoize_property(name) if names.empty? }
end