class Dry::Core::Memoizable::Memoizer

@api private

Public Class Methods

new(klass, names) click to toggle source

@api private

# File lib/dry/core/memoizable.rb, line 53
def initialize(klass, names)
  names.each do |name|
    define_memoizable(
      method: klass.instance_method(name)
    )
  end
end

Private Instance Methods

define_memoizable(method:) click to toggle source

@api private

# File lib/dry/core/memoizable.rb, line 64
        def define_memoizable(method:)
          module_eval <<~RUBY, __FILE__, __LINE__ + 1
            def #{method.name}(#{to_declaration(method.parameters)})
              key = [Kernel.__method__] + Kernel.local_variables.map { |var| Kernel.eval(var.to_s) }

              if @__memoized__.key?(key)
                @__memoized__[key]
              else
                @__memoized__[key] = super
              end
            end
          RUBY

          if respond_to?(:ruby2_keywords, true)
            ruby2_keywords(method.name)
          end
        end
to_declaration(params, lookup = params.to_h) click to toggle source

@api private

# File lib/dry/core/memoizable.rb, line 83
def to_declaration(params, lookup = params.to_h)
  params.map do |type, name|
    case type
    when :req
      name
    when :rest
      "*#{name}"
    when :keyreq
      "#{name}:"
    when :keyrest
      "**#{name}"
    when :block
      "&#{name}"
    when :opt
      lookup.key?(:rest) ? nil : "*args"
    when :key
      lookup.key?(:keyrest) ? nil : "**kwargs"
    else
      raise NotImplementedError, "type: #{type}, name: #{name}"
    end
  end.compact.join(", ")
end