Module: SingleForwardable

Defined in:
lib/forwardable.rb

Overview

SingleForwardable can be used to setup delegation at the object level as well.

printer = String.new
printer.extend SingleForwardable        # prepare object for delegation
printer.def_delegator "STDOUT", "puts"  # add delegation for STDOUT.puts()
printer.puts "Howdy!"

Also, SingleForwardable can be used to set up delegation for a Class or Module.

class Implementation
  def self.service
    puts "serviced!"
  end
end

module Facade
  extend SingleForwardable
  def_delegator :Implementation, :service
end

Facade.service #=> serviced!

If you want to use both Forwardable and SingleForwardable, you can use methods def_instance_delegator and def_single_delegator, etc.

Instance Method Summary collapse

Instance Method Details

#def_single_delegator(accessor, method, ali = method) ⇒ Object Also known as: def_delegator

:call-seq:

def_single_delegator(accessor, method, new_name=method)

Defines a method method which delegates to accessor (i.e. it calls the method of the same name in accessor). If new_name is provided, it is used as the name for the delegate method.



277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
# File 'lib/forwardable.rb', line 277

def def_single_delegator(accessor, method, ali = method)
  accessor = accessor.to_s
  if method_defined?(accessor) || private_method_defined?(accessor)
    accessor = "#{accessor}()"
  end

  line_no = __LINE__; str = %{
    def #{ali}(*args, &block)
      begin
        #{accessor}.__send__(:#{method}, *args, &block)
      rescue ::Exception
        [email protected]_if{|s| ::Forwardable::FILE_REGEXP =~ s} unless ::Forwardable::debug
        ::Kernel::raise
      end
    end
  }

  instance_eval(str, __FILE__, line_no)
end

#def_single_delegators(accessor, *methods) ⇒ Object Also known as: def_delegators

Shortcut for defining multiple delegator methods, but with no provision for using a different name. The following two code samples have the same effect:

def_delegators :@records, :size, :<<, :map

def_delegator :@records, :size
def_delegator :@records, :<<
def_delegator :@records, :map


263
264
265
266
267
268
269
# File 'lib/forwardable.rb', line 263

def def_single_delegators(accessor, *methods)
  methods.delete("__send__")
  methods.delete("__id__")
  for method in methods
    def_single_delegator(accessor, method)
  end
end

#single_delegate(hash) ⇒ Object Also known as: delegate

Takes a hash as its argument. The key is a symbol or an array of symbols. These symbols correspond to method names. The value is the accessor to which the methods will be delegated.

:call-seq:

delegate method => accessor
delegate [method, method, ...] => accessor


243
244
245
246
247
248
249
250
# File 'lib/forwardable.rb', line 243

def single_delegate(hash)
  hash.each{ |methods, accessor|
    methods = [methods] unless methods.respond_to?(:each)
    methods.each{ |method|
      def_single_delegator(accessor, method)
    }
  }
end