Module: Tins::Delegate

Included in:
Module
Defined in:
lib/tins/dslkit.rb

Overview

This module can be included into modules/classes to make the delegate method available.

Constant Summary collapse

UNSET =
Object.new

Instance Method Summary collapse

Instance Method Details

#delegate(method_name, opts = {}) ⇒ Object

A method to easily delegate methods to an object, stored in an instance variable or returned by a method call.

It’s used like this:

class A
  delegate :method_here, :@obj, :method_there
end

or:

class A
  delegate :method_here, :method_call, :method_there
end

other_method_name defaults to method_name, if it wasn’t given. def delegate(method_name, to: UNSET, as: method_name)

Raises:

  • (ArgumentError)


453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
# File 'lib/tins/dslkit.rb', line 453

def delegate(method_name, opts = {})
  to = opts[:to] || UNSET
  as = opts[:as] || method_name
  raise ArgumentError, "to argument wasn't defined" if to == UNSET
  to = to.to_s
  case
  when to[0, 2] == '@@'
    define_method(as) do |*args, &block|
      if self.class.class_variable_defined?(to)
        self.class.class_variable_get(to).__send__(method_name, *args, &block)
      end
    end
  when to[0] == ?@
    define_method(as) do |*args, &block|
      if instance_variable_defined?(to)
        instance_variable_get(to).__send__(method_name, *args, &block)
      end
    end
  when (?A..?Z).include?(to[0])
    define_method(as) do |*args, &block|
      Tins::DeepConstGet.deep_const_get(to).__send__(method_name, *args, &block)
    end
  else
    define_method(as) do |*args, &block|
      __send__(to).__send__(method_name, *args, &block)
    end
  end
end