class Unparser::Adamantium::MethodBuilder

Build the memoized method

Public Class Methods

new(descendant, method_name) click to toggle source

Initialize an object to build a memoized method

@param [Module] descendant @param [Symbol] method_name

@return [undefined]

@api private

# File lib/unparser/adamantium/method_builder.rb, line 47
def initialize(descendant, method_name)
  @descendant          = descendant
  @method_name         = method_name
  @original_visibility = visibility
  @original_method     = @descendant.instance_method(@method_name)
  assert_arity(@original_method.arity)
end

Public Instance Methods

call() click to toggle source

Build a new memoized method

@example

method_builder.call  # => creates new method

@return [UnboundMethod]

@api public

# File lib/unparser/adamantium/method_builder.rb, line 63
def call
  remove_original_method
  create_memoized_method
  set_method_visibility
  @original_method
end

Private Instance Methods

assert_arity(arity) click to toggle source
# File lib/unparser/adamantium/method_builder.rb, line 72
def assert_arity(arity)
  if arity.nonzero?
    fail InvalidArityError.new(@descendant, @method_name, arity)
  end
end
create_memoized_method() click to toggle source
# File lib/unparser/adamantium/method_builder.rb, line 83
def create_memoized_method
  name =   @method_name
  method = @original_method
  @descendant.module_eval do
    define_method(name) do |&block|
      fail BlockNotAllowedError.new(self.class, name) if block

      memoized_method_cache.fetch(name) do
        method.bind(self).call.freeze
      end
    end
  end
end
remove_original_method() click to toggle source
# File lib/unparser/adamantium/method_builder.rb, line 78
def remove_original_method
  name = @method_name
  @descendant.module_eval { undef_method(name) }
end
set_method_visibility() click to toggle source
# File lib/unparser/adamantium/method_builder.rb, line 97
def set_method_visibility
  @descendant.__send__(@original_visibility, @method_name)
end
visibility() click to toggle source
# File lib/unparser/adamantium/method_builder.rb, line 101
def visibility
  if    @descendant.private_method_defined?(@method_name)   then :private
  elsif @descendant.protected_method_defined?(@method_name) then :protected
  else                                                           :public
  end
end