diff options
author | knu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-05-07 23:38:52 +0000 |
---|---|---|
committer | knu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-05-07 23:38:52 +0000 |
commit | 32d17e265c84973516d1717868806b324ba3052a (patch) | |
tree | bf4d2a182e9642d85cc0b8d65ec4861f6364e039 /lib/forwardable.rb | |
parent | 6bbab099c08129c86b225dc476f950809cf58b39 (diff) |
Initial revision
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1375 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/forwardable.rb')
-rw-r--r-- | lib/forwardable.rb | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/lib/forwardable.rb b/lib/forwardable.rb new file mode 100644 index 0000000000..7f57f77f53 --- /dev/null +++ b/lib/forwardable.rb @@ -0,0 +1,94 @@ +# +# forwardable.rb - +# $Release Version: 1.1$ +# $Revision$ +# $Date$ +# by Keiju ISHITSUKA([email protected]) +# original definition by delegator.rb +# -- +# Usage: +# +# class Foo +# extend Forwardable +# +# def_delegators("@out", "printf", "print") +# def_delegators(:@in, :gets) +# def_delegator(:@contents, :[], "content_at") +# end +# f = Foo.new +# f.printf ... +# f.gets +# f.content_at(1) +# +# g = Goo.new +# g.extend SingleForwardable +# g.def_delegator("@out", :puts) +# g.puts ... +# +# + +module Forwardable + + @debug = nil + class<<self + attr_accessor :debug + end + + def def_instance_delegators(accessor, *methods) + for method in methods + def_instance_delegator(accessor, method) + end + end + + def def_instance_delegator(accessor, method, ali = method) + accessor = accessor.id2name if accessor.kind_of?(Integer) + method = method.id2name if method.kind_of?(Integer) + ali = ali.id2name if ali.kind_of?(Integer) + + module_eval(<<-EOS, "(__FORWARDABLE__)", 1) + def #{ali}(*args, &block) + begin + #{accessor}.__send__(:#{method}, *args, &block) + rescue Exception + [email protected]_if{|s| /^\\(__FORWARDABLE__\\):/ =~ s} unless Forwardable::debug + raise + end + end + EOS + end + + alias def_delegators def_instance_delegators + alias def_delegator def_instance_delegator +end + +module SingleForwardable + def def_singleton_delegators(accessor, *methods) + for method in methods + def_singleton_delegator(accessor, method) + end + end + + def def_singleton_delegator(accessor, method, ali = method) + accessor = accessor.id2name if accessor.kind_of?(Integer) + method = method.id2name if method.kind_of?(Integer) + ali = ali.id2name if ali.kind_of?(Integer) + + instance_eval(<<-EOS, "(__FORWARDABLE__)", 1) + def #{ali}(*args, &block) + begin + #{accessor}.__send__(:#{method}, *args,&block) + rescue Exception + [email protected]_if{|s| /^\\(__FORWARDABLE__\\):/ =~ s} unless Forwardable::debug + raise + end + end + EOS + end + + alias def_delegators def_singleton_delegators + alias def_delegator def_singleton_delegator +end + + + + |