Imported File#ftype spec from rubyspecs.
[rbx.git] / lib / e2mmap.rb
blob7d935b4c1fbd5531f42535ad5123dd9f0caad92a
2 #   e2mmap.rb - for ruby 1.1
3 #       $Release Version: 2.0$
4 #       $Revision: 1.10 $
5 #       $Date: 1999/02/17 12:33:17 $
6 #       by Keiju ISHITSUKA
8 # --
9 #   Usage:
11 # U1)
12 #   class Foo
13 #     extend Exception2MessageMapper
14 #     def_e2message ExistingExceptionClass, "message..."
15 #     def_exception :NewExceptionClass, "message..."[, superclass]
16 #     ...
17 #   end
19 # U2)
20 #   module Error
21 #     extend Exception2MessageMapper
22 #     def_e2meggage ExistingExceptionClass, "message..."
23 #     def_exception :NewExceptionClass, "message..."[, superclass]
24 #     ...
25 #   end
26 #   class Foo
27 #     include Error
28 #     ...
29 #   end
31 #   foo = Foo.new
32 #   foo.Fail ....
34 # U3)
35 #   module Error
36 #     extend Exception2MessageMapper
37 #     def_e2message ExistingExceptionClass, "message..."
38 #     def_exception :NewExceptionClass, "message..."[, superclass]
39 #     ...
40 #   end
41 #   class Foo
42 #     extend Exception2MessageMapper
43 #     include Error
44 #     ...
45 #   end
47 #   Foo.Fail NewExceptionClass, arg...
48 #   Foo.Fail ExistingExceptionClass, arg...
51 module Exception2MessageMapper
52   @RCS_ID='-$Id: e2mmap.rb,v 1.10 1999/02/17 12:33:17 keiju Exp keiju $-'
54   E2MM = Exception2MessageMapper
56   def E2MM.extend_object(cl)
57     super
58     cl.bind(self) unless cl < E2MM
59   end
60   
61   def bind(cl)
62     self.module_eval %[
63       def Raise(err = nil, *rest)
64         Exception2MessageMapper.Raise(self.class, err, *rest)
65       end
66       alias Fail Raise
68       def self.included(mod)
69         mod.extend Exception2MessageMapper
70       end
71     ]
72   end
74   # Fail(err, *rest)
75   #     err:    exception
76   #     rest:   message arguments
77   #
78   def Raise(err = nil, *rest)
79     E2MM.Raise(self, err, *rest)
80   end
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_exception(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)")