Module: ActiveSupport::Memoizable

Included in:
ActionDispatch::Http::Headers, ActionView::Helpers::DateTimeSelector
Defined in:
activesupport/lib/active_support/memoizable.rb

Defined Under Namespace

Modules: InstanceMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.memoized_ivar_for(symbol) ⇒ Object



6
7
8
# File 'activesupport/lib/active_support/memoizable.rb', line 6

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

Instance Method Details

#memoize(*symbols) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'activesupport/lib/active_support/memoizable.rb', line 59

def memoize(*symbols)
  symbols.each do |symbol|
    original_method = :"_unmemoized_#{symbol}"
    memoized_ivar = ActiveSupport::Memoizable.memoized_ivar_for(symbol)

    class_eval <<-EOS, __FILE__, __LINE__ + 1
      include InstanceMethods                                                  # include InstanceMethods
                                                                               #
      if method_defined?(:#{original_method})                                  # if method_defined?(:_unmemoized_mime_type)
        raise "Already memoized #{symbol}"                                     #   raise "Already memoized mime_type"
      end                                                                      # end
      alias #{original_method} #{symbol}                                       # alias _unmemoized_mime_type mime_type
                                                                               #
      if instance_method(:#{symbol}).arity == 0                                # if instance_method(:mime_type).arity == 0
        def #{symbol}(reload = false)                                          #   def mime_type(reload = false)
          if reload || !defined?(#{memoized_ivar}) || #{memoized_ivar}.empty?  #     if reload || !defined?(@_memoized_mime_type) || @_memoized_mime_type.empty?
            #{memoized_ivar} = [#{original_method}]                            #       @_memoized_mime_type = [_unmemoized_mime_type]
          end                                                                  #     end
          #{memoized_ivar}[0]                                                  #     @_memoized_mime_type[0]
        end                                                                    #   end
      else                                                                     # else
        def #{symbol}(*args)                                                   #   def mime_type(*args)
          #{memoized_ivar} ||= {} unless frozen?                               #     @_memoized_mime_type ||= {} unless frozen?
          reload = args.pop if args.last == true || args.last == :reload       #     reload = args.pop if args.last == true || args.last == :reload
                                                                               #
          if defined?(#{memoized_ivar}) && #{memoized_ivar}                    #     if defined?(@_memoized_mime_type) && @_memoized_mime_type
            if !reload && #{memoized_ivar}.has_key?(args)                      #       if !reload && @_memoized_mime_type.has_key?(args)
              #{memoized_ivar}[args]                                           #         @_memoized_mime_type[args]
            elsif #{memoized_ivar}                                             #       elsif @_memoized_mime_type
              #{memoized_ivar}[args] = #{original_method}(*args)               #         @_memoized_mime_type[args] = _unmemoized_mime_type(*args)
            end                                                                #       end
          else                                                                 #     else
            #{original_method}(*args)                                          #       _unmemoized_mime_type(*args)
          end                                                                  #     end
        end                                                                    #   end
      end                                                                      # end
                                                                               #
      if private_method_defined?(#{original_method.inspect})                   # if private_method_defined?(:_unmemoized_mime_type)
        private #{symbol.inspect}                                              #   private :mime_type
      elsif protected_method_defined?(#{original_method.inspect})              # elsif protected_method_defined?(:_unmemoized_mime_type)
        protected #{symbol.inspect}                                            #   protected :mime_type
      end                                                                      # end
    EOS
  end
end