stdlib_libraries/forwarding_no_parens.rb
tests/_examples/stdlib_libraries/forwarding_no_parens.rb in the metorex repository.
# Forwardable hands a call on to whatever an accessor names: an instance
# variable, a method, or an expression written as a String.
require "forwardable"
# The warning about a private method is written where the output can be
# read with the rest.
$stderr = $stdout
class Line
extend Forwardable
attr_reader :items
def initialize
@items = []
@log = []
end
def_delegators :@items, :size, :<<, :first, :each, :__send__
def_delegator :@items, :shift, :dequeue
def_delegator :items, :last
def_delegator "@items.first", :to_s, :first_text
delegate [:push, :empty?] => :@items, :clear => :@log
instance_delegate :length => :items
include Enumerable
end
line = Line.new
line << 3 << 5
p line.size, line.first, line.last, line.length
p line.dequeue, line.first_text
line.push(9)
p line.map { |held| held * 2 }
p line.empty?
p Line.instance_method(:size).owner
p Line.public_method_defined?(:dequeue)
p Line.method_defined?(:__send__)
p(Line.instance_method(:size).arity)
p Line.def_delegator(:@items, :count)
p Line.def_delegators(:@items, :min, :max)
class Secretive
def initialize = @inner = Inner.new
class Inner
private def hidden = :reached
end
extend Forwardable
def_delegator :@inner, :hidden
end
p Secretive.new.hidden
settings = { "a" => 1 }
settings.extend SingleForwardable
settings.def_delegator :itself, :keys, :names
p settings.names
printer = Object.new
printer.extend SingleForwardable
printer.def_delegators :$stdout, :puts
printer.delegate [:write] => :$stdout
printer.puts "through stdout"
p Forwardable::VERSION
p Forwardable.debug
Output:
2
3
5
2
3
"5"
[10, 18]
false
Line
true
true
-1
:count
[:min, :max]
tests/_examples/stdlib_libraries/forwarding_no_parens.rb:49: warning: Secretive#hidden at tests/_examples/stdlib_libraries/forwarding_no_parens.rb:47 forwarding to private method Secretive::Inner#hidden
:reached
["a"]
through stdout
"1.4.0"
nil