* io.c (rb_open_file): encoding in mode string was ignored if perm is
[ruby-svn.git] / lib / e2mmap.rb
blobb8d1d44f380f85f21434a6d14fa108010aa92b8d
2 #   e2mmap.rb - for ruby 1.1
3 #       $Release Version: 2.0$
4 #       $Revision: 1.10 $
5 #       by Keiju ISHITSUKA
7 # --
8 #   Usage:
10 # U1)
11 #   class Foo
12 #     extend Exception2MessageMapper
13 #     def_e2message ExistingExceptionClass, "message..."
14 #     def_exception :NewExceptionClass, "message..."[, superclass]
15 #     ...
16 #   end
18 # U2)
19 #   module Error
20 #     extend Exception2MessageMapper
21 #     def_e2meggage ExistingExceptionClass, "message..."
22 #     def_exception :NewExceptionClass, "message..."[, superclass]
23 #     ...
24 #   end
25 #   class Foo
26 #     include Error
27 #     ...
28 #   end
30 #   foo = Foo.new
31 #   foo.Fail ....
33 # U3)
34 #   module Error
35 #     extend Exception2MessageMapper
36 #     def_e2message ExistingExceptionClass, "message..."
37 #     def_exception :NewExceptionClass, "message..."[, superclass]
38 #     ...
39 #   end
40 #   class Foo
41 #     extend Exception2MessageMapper
42 #     include Error
43 #     ...
44 #   end
46 #   Foo.Fail NewExceptionClass, arg...
47 #   Foo.Fail ExistingExceptionClass, arg...
50 module Exception2MessageMapper
51   @RCS_ID='-$Id: e2mmap.rb,v 1.10 1999/02/17 12:33:17 keiju Exp keiju $-'
53   E2MM = Exception2MessageMapper
55   def E2MM.extend_object(cl)
56     super
57     cl.bind(self) unless cl < E2MM
58   end
59   
60   def bind(cl)
61     self.module_eval %[
62       def Raise(err = nil, *rest)
63         Exception2MessageMapper.Raise(self.class, err, *rest)
64       end
65       alias Fail Raise
67       def self.included(mod)
68         mod.extend Exception2MessageMapper
69       end
70     ]
71   end
73   # Fail(err, *rest)
74   #     err:    exception
75   #     rest:   message arguments
76   #
77   def Raise(err = nil, *rest)
78     E2MM.Raise(self, err, *rest)
79   end
80   alias Fail Raise
81   alias fail Raise
83   # def_e2message(c, m)
84   #         c:  exception
85   #         m:  message_form
86   #     define exception c with message m.
87   #
88   def def_e2message(c, m)
89     E2MM.def_e2message(self, c, m)
90   end
91   
92   # def_exception(n, m, s)
93   #         n:  exception_name
94   #         m:  message_form
95   #         s:  superclass(default: StandardError)
96   #     define exception named ``c'' with message m.
97   #
98   def def_exception(n, m, s = StandardError)
99     E2MM.def_exception(self, n, m, s)
100   end
102   #
103   # Private definitions.
104   #
105   # {[class, exp] => message, ...}
106   @MessageMap = {}
108   # E2MM.def_e2message(k, e, m)
109   #         k:  class to define exception under.
110   #         e:  exception
111   #         m:  message_form
112   #     define exception c with message m.
113   #
114   def E2MM.def_e2message(k, c, m)
115     E2MM.instance_eval{@MessageMap[[k, c]] = m}
116     c
117   end
118   
119   # E2MM.def_exception(k, n, m, s)
120   #         k:  class to define exception under.
121   #         n:  exception_name
122   #         m:  message_form
123   #         s:  superclass(default: StandardError)
124   #     define exception named ``c'' with message m.
125   #
126   def E2MM.def_exception(k, n, m, s = StandardError)
127     n = n.id2name if n.kind_of?(Fixnum)
128     e = Class.new(s)
129     E2MM.instance_eval{@MessageMap[[k, e]] = m}
130     k.const_set(n, e)
131   end
133   # Fail(klass, err, *rest)
134   #     klass:  class to define exception under.
135   #     err:    exception
136   #     rest:   message arguments
137   #
138   def E2MM.Raise(klass = E2MM, err = nil, *rest)
139     if form = e2mm_message(klass, err)
140       b = $@.nil? ? caller(1) : $@
141       #p $@
142       #p __FILE__
143       b.shift if b[0] =~ /^#{Regexp.quote(__FILE__)}:/
144       raise err, sprintf(form, *rest), b
145     else
146       E2MM.Fail E2MM, ErrNotRegisteredException, err.inspect
147     end
148   end
149   class <<E2MM
150     alias Fail Raise
151   end
153   def E2MM.e2mm_message(klass, exp)
154     for c in klass.ancestors
155       if mes = @MessageMap[[c,exp]]
156         #p mes
157         m = klass.instance_eval('"' + mes + '"')
158         return m
159       end
160     end
161     nil
162   end
163   class <<self
164     alias message e2mm_message
165   end
167   E2MM.def_exception(E2MM, 
168                      :ErrNotRegisteredException, 
169                      "not registerd exception(%s)")