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
-
#def_single_delegator(accessor, method, ali = method) ⇒ Object
(also: #def_delegator)
:call-seq: def_single_delegator(accessor, method, new_name=method).
-
#def_single_delegators(accessor, *methods) ⇒ Object
(also: #def_delegators)
Shortcut for defining multiple delegator methods, but with no provision for using a different name.
-
#single_delegate(hash) ⇒ Object
(also: #delegate)
Takes a hash as its argument.
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 |