Sha256: 4e7e423744517a6376f74fcbbe1db414f1ead3ca5595241c17c9a58fe7528370

Contents?: true

Size: 1.88 KB

Versions: 2

Compression:

Stored size: 1.88 KB

Contents

# Refer from activesupport-2.2.0.
# * Remove the dependecies to activesupport.
# * change the key to hash value of args.
# * Not Thread safe
# * Add the clear method.
module Locale
  module Util
    module Memoizable
      MEMOIZED_IVAR = Proc.new do |symbol|
        "#{symbol.to_s.sub(/\?\Z/, '_query').sub(/!\Z/, '_bang')}".to_sym
      end

      def self.included(base)
        mod = self
        base.class_eval do
          extend mod
        end
      end

      alias :freeze_without_memoizable :freeze  #:nodoc:
      def freeze #:nodoc:
        unless frozen?
          @_memoized_ivars = {}
          freeze_without_memoizable
        end
      end

      # Clear memoized values.
      def clear
        @_memoized_ivars = {}
      end

      # Cache the result of the methods.
      #
      #  include Memoizable
      #  def foo
      #    ......
      #  end
      #  def bar(a, b)
      #    ......
      #  end
      #  memoize :foo, :bar(a, b)
      # 
      # To clear cache, #clear_foo, #clear_bar is also defined.
      #
      # (NOTE) Consider to use this with huge objects to avoid memory leaks.
      def memoize(*symbols)
        symbols.each do |symbol|
          original_method = "_unmemoized_#{symbol}"
          memoized_ivar = MEMOIZED_IVAR.call(symbol)
          class_eval <<-EOS, __FILE__, __LINE__
          raise "Already memoized #{symbol}" if method_defined?(:#{original_method})
          alias #{original_method} #{symbol}

          def #{symbol}(*args)
            @_memoized_ivars ||= {}
            @_memoized_ivars[:#{memoized_ivar}] ||= {}

            key = args.hash

            ret = @_memoized_ivars[:#{memoized_ivar}][key]

            if ret
              ret
            else
              @_memoized_ivars[:#{memoized_ivar}][key] = #{original_method}(*args).freeze
            end
          end
          
          EOS
        end
      
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
locale-0.9.0 lib/locale/util/memoizable.rb
locale-2.0.0 lib/locale/util/memoizable.rb