aboutsummaryrefslogtreecommitdiffstats
path: root/lib/forwardable.rb
diff options
context:
space:
mode:
authorknu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2001-05-07 23:38:52 +0000
committerknu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2001-05-07 23:38:52 +0000
commit32d17e265c84973516d1717868806b324ba3052a (patch)
treebf4d2a182e9642d85cc0b8d65ec4861f6364e039 /lib/forwardable.rb
parent6bbab099c08129c86b225dc476f950809cf58b39 (diff)
downloadruby-32d17e265c84973516d1717868806b324ba3052a.tar.gz
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.rb94
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(keiju@ishitsuka.com)
+# 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
+ $@.delete_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
+ $@.delete_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
+
+
+
+