Module: AssetTrip::Memoizable

Included in:
Asset
Defined in:
lib/asset_trip/memoizable.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.memoized_ivar_for(symbol) ⇒ Object



4
5
6
# File 'lib/asset_trip/memoizable.rb', line 4

def self.memoized_ivar_for(symbol)
  "@_memoized_#{symbol.to_s.sub(/\?\Z/, '_query').sub(/!\Z/, '_bang')}".to_sym
end

Instance Method Details

#memoize(symbol) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/asset_trip/memoizable.rb', line 8

def memoize(symbol)
  original_method = :"_unmemoized_#{symbol}"
  memoized_ivar = AssetTrip::Memoizable.memoized_ivar_for(symbol)

  raise "Already memoized #{symbol}" if method_defined?(original_method)
  alias_method original_method, symbol

  class_eval <<-EOS, __FILE__, __LINE__
    def #{symbol}(*args)                              # def mime_type(*args)
      if !defined?(#{memoized_ivar})                  #   if !defined?(@_memoized_mime_type)
        #{memoized_ivar} = #{original_method}(*args)  #     @_memoized_mime_type = _unmemoized_mime_type(*args)
      end                                             #   end
      #{memoized_ivar}                                #   @_memoized_mime_type
    end                                               # end
  EOS

  private symbol if private_method_defined?(original_method)
end