class Contracts::MethodReference

MethodReference represents original method reference that was decorated by contracts.ruby. Used for instance methods.

Attributes

name[R]

Public Class Methods

new(name, method) click to toggle source

name - name of the method method - method object

# File lib/contracts/method_reference.rb, line 9
def initialize(name, method)
  @name   = name
  @method = method
end

Public Instance Methods

make_alias(this) click to toggle source

Aliases original method to a special unique name, which is known only to this class. Usually done right before re-defining the method.

# File lib/contracts/method_reference.rb, line 30
def make_alias(this)
  _aliased_name = aliased_name
  original_name = name

  alias_target(this).class_eval do
    alias_method _aliased_name, original_name
  end
end
make_definition(this, &blk) click to toggle source

Makes a method re-definition in proper way

# File lib/contracts/method_reference.rb, line 19
def make_definition(this, &blk)
  is_private   = private?(this)
  is_protected = protected?(this)
  alias_target(this).send(:define_method, name, &blk)
  make_private(this)   if is_private
  make_protected(this) if is_protected
end
method_position() click to toggle source
# File lib/contracts/method_reference.rb, line 14
def method_position
  Support.method_position(@method)
end
send_to(this, *args, &blk) click to toggle source

Calls original method on specified `this` argument with specified arguments `args` and block `&blk`.

# File lib/contracts/method_reference.rb, line 41
def send_to(this, *args, &blk)
  this.send(aliased_name, *args, &blk)
end

Private Instance Methods

alias_target(this) click to toggle source

Returns alias target for instance methods, subject to be overriden in subclasses.

# File lib/contracts/method_reference.rb, line 69
def alias_target(this)
  this
end
aliased_name() click to toggle source
# File lib/contracts/method_reference.rb, line 73
def aliased_name
  @_original_name ||= construct_unique_name
end
construct_unique_name() click to toggle source
# File lib/contracts/method_reference.rb, line 77
def construct_unique_name
  :"__contracts_ruby_original_#{name}_#{Support.unique_id}"
end
make_private(this) click to toggle source

Makes a method private

# File lib/contracts/method_reference.rb, line 56
def make_private(this)
  original_name = name
  alias_target(this).class_eval { private original_name }
end
make_protected(this) click to toggle source

Makes a method protected

# File lib/contracts/method_reference.rb, line 62
def make_protected(this)
  original_name = name
  alias_target(this).class_eval { protected original_name }
end
private?(this) click to toggle source
# File lib/contracts/method_reference.rb, line 47
def private?(this)
  this.private_instance_methods.include?(name)
end
protected?(this) click to toggle source
# File lib/contracts/method_reference.rb, line 51
def protected?(this)
  this.protected_instance_methods.include?(name)
end