OSDN Git Service

FIRST REPOSITORY
[eos/hostdependOTHERS.git] / I386LINUX / util / I386LINUX / lib / ruby / 1.6 / forwardable.rb
1 #
2 #   forwardable.rb - 
3 #       $Release Version: 1.1$
4 #       $Revision: 1.1.1.1 $
5 #       $Date: 2002/02/01 06:36:19 $
6 #       by Keiju ISHITSUKA(keiju@ishitsuka.com)
7 #       original definition by delegator.rb
8 # --
9 # Usage:
10 #
11 #   class Foo
12 #     extend Forwardable
13 #
14 #     def_delegators("@out", "printf", "print")
15 #     def_delegators(:@in, :gets)
16 #     def_delegator(:@contents, :[], "content_at")
17 #   end
18 #   f = Foo.new
19 #   f.printf ...
20 #   f.gets
21 #   f.content_at(1)
22 #
23 #   g = Goo.new
24 #   g.extend SingleForwardable
25 #   g.def_delegator("@out", :puts)
26 #   g.puts ...
27 #
28 #
29
30 module Forwardable
31
32   @debug = nil
33   class<<self
34     attr_accessor :debug
35   end
36
37   def def_instance_delegators(accessor, *methods)
38     for method in methods
39       def_instance_delegator(accessor, method)
40     end
41   end
42
43   def def_instance_delegator(accessor, method, ali = method)
44     accessor = accessor.id2name if accessor.kind_of?(Integer)
45     method = method.id2name if method.kind_of?(Integer)
46     ali = ali.id2name if ali.kind_of?(Integer)
47
48     module_eval(<<-EOS, "(__FORWARDABLE__)", 1)
49       def #{ali}(*args, &block)
50         begin
51           #{accessor}.__send__(:#{method}, *args, &block)
52         rescue Exception
53           $@.delete_if{|s| /^\\(__FORWARDABLE__\\):/ =~ s} unless Forwardable::debug
54           raise
55         end
56       end
57     EOS
58   end
59
60   alias def_delegators def_instance_delegators
61   alias def_delegator def_instance_delegator
62 end
63
64 module SingleForwardable
65   def def_singleton_delegators(accessor, *methods)
66     for method in methods
67       def_singleton_delegator(accessor, method)
68     end
69   end
70
71   def def_singleton_delegator(accessor, method, ali = method)
72     accessor = accessor.id2name if accessor.kind_of?(Integer)
73     method = method.id2name if method.kind_of?(Integer)
74     ali = ali.id2name if ali.kind_of?(Integer)
75
76     instance_eval(<<-EOS, "(__FORWARDABLE__)", 1)
77        def #{ali}(*args, &block)
78          begin
79            #{accessor}.__send__(:#{method}, *args,&block)
80          rescue Exception
81            $@.delete_if{|s| /^\\(__FORWARDABLE__\\):/ =~ s} unless Forwardable::debug
82            raise
83          end
84        end
85     EOS
86   end
87
88   alias def_delegators def_singleton_delegators
89   alias def_delegator def_singleton_delegator
90 end
91
92
93
94