Module: ActiveSupport::Memoizable

Defined in:
activesupport/lib/active_support/memoizable.rb

Defined Under Namespace

Modules: InstanceMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(base) ⇒ Object



7
8
9
10
11
# File 'activesupport/lib/active_support/memoizable.rb', line 7

def self.extended(base)
  ActiveSupport::Deprecation.warn "ActiveSupport::Memoizable is deprecated and will be removed in future releases," \
    "simply use Ruby memoization pattern instead.", caller
  super
end

.memoized_ivar_for(symbol) ⇒ Object



13
14
15
# File 'activesupport/lib/active_support/memoizable.rb', line 13

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



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
104
105
106
107
108
109
110
111
112
113
114
# File 'activesupport/lib/active_support/memoizable.rb', line 66

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?
          args_length = method(:#{original_method}).arity                      #     args_length = method(:_unmemoized_mime_type).arity
          if args.length == args_length + 1 &&                                 #     if args.length == args_length + 1 &&
            (args.last == true || args.last == :reload)                        #       (args.last == true || args.last == :reload)
            reload = args.pop                                                  #       reload = args.pop
          end                                                                  #     end
                                                                               #
          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