summaryrefslogtreecommitdiff
path: root/lib/e2mmap.rb
blob: bf860dc5c136fb623aa5c29134e99f057f728929 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#
#   e2mmap.rb - for ruby 1.1
#   	$Release Version: 1.2$
#   	$Revision: 1.8 $
#   	$Date: 1998/08/19 15:22:22 $
#   	by Keiju ISHITSUKA
#
# --
#   Usage:
#
#   class Foo
#     extend Exception2MassageMapper
#     def_exception :NewExceptionClass, "message..."[, superclass]
#     def_e2meggage ExistingExceptionClass, "message..."
#     ...
#   end
#
#   Foo.Fail NewExceptionClass, arg...
#   Foo.Fail ExistingExceptionClass, arg...
#
#
if VERSION < "1.1"
  require "e2mmap1_0.rb"
else  
  
  module Exception2MessageMapper
    @RCS_ID='-$Id: e2mmap.rb,v 1.8 1998/08/19 15:22:22 keiju Exp keiju $-'
    
    E2MM = Exception2MessageMapper

    def E2MM.extend_object(cl)
      super
      cl.bind(self)
    end
    
    # backward compatibility
    def E2MM.extend_to(b)
      c = eval("self", b)
      c.extend(self)
    end
    
    #    public :fail
    alias fail! fail

    #def fail(err = nil, *rest)
    #  super
    #end

    def Fail(err = nil, *rest)
      Exception2MessageMapper.Fail Exception2MessageMapper::ErrNotRegisteredException, err.inspect
    end
    
    def bind(cl)
      self.module_eval %q^
	E2MM_ErrorMSG = {} unless self.const_defined?(:E2MM_ErrorMSG)
	# fail(err, *rest)
	#	err:	Exception
	#	rest:	Parameter accompanied with the exception
	#
	def self.Fail(err = nil, *rest)
	  if form = E2MM_ErrorMSG[err]
	    $! = err.new(sprintf(form, *rest))
	    $@ = caller(0) if $@.nil?
	    $@.shift
	    # e2mm_fail()
	    raise()
#	  elsif self == Exception2MessageMapper
#	    fail Exception2MessageMapper::ErrNotRegisteredException, err.to_s
	  else
#	    print "super\n"
	    super
	  end
	end

	# 過去の互換性のため
	def self.fail(err = nil, *rest)
	  if form = E2MM_ErrorMSG[err]
	    $! = err.new(sprintf(form, *rest))
	    $@ = caller(0) if $@.nil?
	    $@.shift
	    # e2mm_fail()
	    raise()
#	  elsif self == Exception2MessageMapper
#	    fail Exception2MessageMapper::ErrNotRegisteredException, err.to_s
	  else
#	    print "super\n"
	    super
	  end
	end
	class << self
	  public :fail
	end
	
	# def_exception(c, m)
	#	    c:  exception
	#	    m:  message_form
	#
	def self.def_e2message(c, m)
	  E2MM_ErrorMSG[c] = m
	end
	
	# def_exception(c, m)
	#	    n:  exception_name
	#	    m:  message_form
	#	    s:	superclass_of_exception (default: Exception)
	#	defines excaption named ``c'', whose message is ``m''.
	#
	#def def_exception(n, m)
	def self.def_exception(n, m, s = nil)
	  n = n.id2name if n.kind_of?(Fixnum)
	  unless s
	    if defined?(StandardError)
	      s = StandardError
	    else
	      s = Exception
	    end
	  end
	  e = Class.new(s)

	  const_set(n, e)
	  E2MM_ErrorMSG[e] = m
	  #	const_get(:E2MM_ErrorMSG)[e] = m
	end
      ^
      end
      
      extend E2MM
      def_exception(:ErrNotClassOrModule, "Not Class or Module")
      def_exception(:ErrNotRegisteredException, "not registerd exception(%s)")
    end
end