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 | |
parent | 6bbab099c08129c86b225dc476f950809cf58b39 (diff) |
Initial revision
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1375 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | doc/forwardable.rd | 84 | ||||
-rw-r--r-- | doc/forwardable.rd.jp | 79 | ||||
-rw-r--r-- | lib/forwardable.rb | 94 |
3 files changed, 257 insertions, 0 deletions
diff --git a/doc/forwardable.rd b/doc/forwardable.rd new file mode 100644 index 0000000000..54a4d83de9 --- /dev/null +++ b/doc/forwardable.rd @@ -0,0 +1,84 @@ + -- forwardable.rb + + $Release Version: 1.1 $ + $Revision$ + $Date$ + Original version by Tosh + +==begin + += Forwardable + +A Module to define delegations for selected methods to a class. + +== Usage + +Using through extending the class. + + 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) + +== Methods + +--- Forwardable#def_instance_delegators(accessor, *methods) + + adding the delegations for each method of ((|methods|)) to + ((|accessor|)). + +--- Forwardable#def_instance_delegator(accessor, method, ali = method) + + adding the delegation for ((|method|)) to ((|accessor|)). When + you give optional argument ((|ali|)), ((|ali|)) is used as the + name of the delegation method, instead of ((|method|)). + +--- Forwardable#def_delegators(accessor, *methods) + + the alias of ((|Forwardable#def_instance_delegators|)). + +--- Forwardable#def_delegator(accessor, method, ali = method) + + the alias of ((|Forwardable#def_instance_delegator|)). + += SingleForwardable + +a Module to define delegations for selected methods to an object. + +== Usage + +Using through extending the object. + + g = Goo.new + g.extend SingleForwardable + g.def_delegator("@out", :puts) + g.puts ... + +== Methods + +--- SingleForwardable#def_singleton_delegators(accessor, *methods) + + adding the delegations for each method of ((|methods|)) to + ((|accessor|)). + +--- SingleForwardable#def_singleton_delegator(accessor, method, ali = method) + + adding the delegation for ((|method|)) to ((|accessor|)). When + you give optional argument ((|ali|)), ((|ali|)) is used as the + name of the delegation method, instead of ((|method|)). + +--- SingleForwardable#def_delegators(accessor, *methods) + + the alias of ((|SingleForwardable#def_instance_delegators|)). + +--- SingleForwardable#def_delegator(accessor, method, ali = method) + + the alias of ((|SingleForwardable#def_instance_delegator|)). +==end
\ No newline at end of file diff --git a/doc/forwardable.rd.jp b/doc/forwardable.rd.jp new file mode 100644 index 0000000000..a7d2ca34c7 --- /dev/null +++ b/doc/forwardable.rd.jp @@ -0,0 +1,79 @@ + -- forwatable.rb + $Release Version: 1.1 $ + $Revision$ + $Date$ + += Forwardable + +���饹���Ф���åɤΰѾ���ǽ��������ޤ�. + +== �Ȥ��� + +���饹���Ф���extend���ƻȤ��ޤ�. + + 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) + +== ��å� + +--- Forwardable#def_instance_delegators(accessor, *methods) + + ((|methods|))���Ϥ��줿��åɤΥꥹ�Ȥ�((|accessor��|))�Ѿ����� + �褦�ˤ��ޤ�. + +--- Forwardable#def_instance_delegator(accessor, method, ali = method) + + ((||method|))���Ϥ��줿��åɤ�((|accessor|))�˰Ѿ�����褦�ˤ� + �ޤ�. ((|ali|))�������Ȥ����Ϥ��줿�Ȥ���, ��å�((|ali|))���Ƥ� + �줿�Ȥ��ˤ�, ((|accessor|))���Ф�((|method|))��ƤӽФ��ޤ�. + +--- Forwardable#def_delegators(accessor, *methods) + + ((|Forwardable#def_instance_delegators|))����̾�Ǥ�. + +--- Forwardable#def_delegator(accessor, method, ali = method) + + ((|Forwardable#def_instance_delegator|))����̾�Ǥ�. + += SingleForwardable + +���֥������Ȥ��Ф�, ��åɤΰѾ���ǽ��������ޤ�. + +== �Ȥ��� + +���֥������Ȥ��Ф���((|extend|))���ƻȤ��ޤ�. + + g = Goo.new + g.extend SingleForwardable + g.def_delegator("@out", :puts) + g.puts ... + +== ��å� + +--- SingleForwardable#def_singleton_delegators(accessor, *methods) + + ((|methods|))���Ϥ��줿��åɤΥꥹ�Ȥ�((|accessor|))�˰Ѿ����� + �褦�ˤ��ޤ�. + +--- SingleForwardable#def_singleton_delegator(accessor, method, ali = method) + + ((|method|))���Ϥ��줿��åɤ�((|accessor|))�˰Ѿ�����褦�ˤ��� + ��. ((|ali|))�������Ȥ����Ϥ��줿�Ȥ���, ��å�((|ali|))���ƤФ� + ���Ȥ��ˤ�, ((|accessor|))���Ф�((|method|))��ƤӽФ��ޤ�. + +--- SingleForwardable#def_delegators(accessor, *methods) + + ((|SingleForwardable#def_singleton_delegators|))����̾�Ǥ�. + +--- SingleForwardable#def_delegator(accessor, method, ali = method) + + ((|SingleForwardable#def_singleton_delegator|))����̾�Ǥ�. 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 + + + + |