cheri 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README +98 -0
- data/Rakefile +121 -0
- data/examples/hello_world_1.rb +28 -0
- data/examples/table_1.rb +44 -0
- data/lib/cheri/awt.rb +41 -0
- data/lib/cheri/builder.rb +31 -0
- data/lib/cheri/builder/awt/connecter.rb +63 -0
- data/lib/cheri/builder/awt/constants.rb +1003 -0
- data/lib/cheri/builder/awt/main.rb +191 -0
- data/lib/cheri/builder/awt/types.rb +220 -0
- data/lib/cheri/builder/base.rb +533 -0
- data/lib/cheri/builder/config.rb +187 -0
- data/lib/cheri/builder/connecter.rb +386 -0
- data/lib/cheri/builder/context.rb +655 -0
- data/lib/cheri/builder/generator.rb +425 -0
- data/lib/cheri/builder/html/charsets.rb +154 -0
- data/lib/cheri/builder/html/common.rb +32 -0
- data/lib/cheri/builder/html/connecter.rb +57 -0
- data/lib/cheri/builder/html/element.rb +156 -0
- data/lib/cheri/builder/html/main.rb +116 -0
- data/lib/cheri/builder/html/types.rb +123 -0
- data/lib/cheri/builder/main.rb +483 -0
- data/lib/cheri/builder/swing/connecter.rb +141 -0
- data/lib/cheri/builder/swing/constants.rb +420 -0
- data/lib/cheri/builder/swing/main.rb +446 -0
- data/lib/cheri/builder/swing/types.rb +270 -0
- data/lib/cheri/builder/xml/charsets.rb +154 -0
- data/lib/cheri/builder/xml/common.rb +32 -0
- data/lib/cheri/builder/xml/connecter.rb +42 -0
- data/lib/cheri/builder/xml/element.rb +189 -0
- data/lib/cheri/builder/xml/main.rb +130 -0
- data/lib/cheri/builder/xml/types.rb +36 -0
- data/lib/cheri/cheri.rb +70 -0
- data/lib/cheri/cjx.rb +3 -0
- data/lib/cheri/explorer.rb +32 -0
- data/lib/cheri/explorer/explorer.rb +560 -0
- data/lib/cheri/html.rb +31 -0
- data/lib/cheri/image/Delete24.gif +0 -0
- data/lib/cheri/image/Find24.gif +0 -0
- data/lib/cheri/image/FindAgain24.gif +0 -0
- data/lib/cheri/image/Refresh24.gif +0 -0
- data/lib/cheri/image/Search24.gif +0 -0
- data/lib/cheri/image/Thumbs.db +0 -0
- data/lib/cheri/image/cheri_icon_16x16.png +0 -0
- data/lib/cheri/image/cheri_icon_24x24.png +0 -0
- data/lib/cheri/image/cheri_logo_medium.png +0 -0
- data/lib/cheri/image/close_10x10.png +0 -0
- data/lib/cheri/image/close_10x10s.png +0 -0
- data/lib/cheri/image/close_12x12.png +0 -0
- data/lib/cheri/image/close_14x14.png +0 -0
- data/lib/cheri/image/close_24x24.png +0 -0
- data/lib/cheri/image/close_dim2_12x12.png +0 -0
- data/lib/cheri/image/close_dim_12x12.png +0 -0
- data/lib/cheri/image/cls_tree.png +0 -0
- data/lib/cheri/image/con_tree.png +0 -0
- data/lib/cheri/image/jruby_14x16.png +0 -0
- data/lib/cheri/image/jruby_logo.png +0 -0
- data/lib/cheri/image/mod_tree.png +0 -0
- data/lib/cheri/image/obj_tree.png +0 -0
- data/lib/cheri/image/ruby_16x16.png +0 -0
- data/lib/cheri/image/vars_tree.png +0 -0
- data/lib/cheri/java.rb +26 -0
- data/lib/cheri/java/builder.rb +28 -0
- data/lib/cheri/java/builder/main.rb +407 -0
- data/lib/cheri/java/builder/util.rb +480 -0
- data/lib/cheri/java/java.rb +56 -0
- data/lib/cheri/jruby.rb +32 -0
- data/lib/cheri/jruby/explorer.rb +43 -0
- data/lib/cheri/jruby/explorer/common.rb +38 -0
- data/lib/cheri/jruby/explorer/dialogs.rb +383 -0
- data/lib/cheri/jruby/explorer/explorer.rb +904 -0
- data/lib/cheri/jruby/explorer/splash.rb +80 -0
- data/lib/cheri/jruby/explorer/viewer.rb +619 -0
- data/lib/cheri/jruby/explorer/viewers.rb +1057 -0
- data/lib/cheri/jruby/jruby.rb +59 -0
- data/lib/cheri/swing.rb +41 -0
- data/lib/cheri/xml.rb +31 -0
- metadata +135 -0
@@ -0,0 +1,187 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (C) 2007 William N Dortch <bill.dortch@gmail.com>
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
#
|
24
|
+
|
25
|
+
module Cheri
|
26
|
+
module Builder
|
27
|
+
|
28
|
+
class Config
|
29
|
+
None = {}.freeze #:nodoc:
|
30
|
+
def initialize(*mods)
|
31
|
+
@m = [] # included modules
|
32
|
+
@f = {} # factories, indexed by module
|
33
|
+
@c = {} # connecters, indexed by module
|
34
|
+
# lazily allocated:
|
35
|
+
# @n = {} # consumers, indexed by module
|
36
|
+
# @r = {} # resolvers, indexed by module
|
37
|
+
mods.each do |mod| self << mod; end
|
38
|
+
end
|
39
|
+
|
40
|
+
def mods
|
41
|
+
@m
|
42
|
+
end
|
43
|
+
|
44
|
+
def factories
|
45
|
+
@f
|
46
|
+
end
|
47
|
+
|
48
|
+
def connecters
|
49
|
+
@c
|
50
|
+
end
|
51
|
+
|
52
|
+
def consumers
|
53
|
+
@n || None
|
54
|
+
end
|
55
|
+
|
56
|
+
def resolvers
|
57
|
+
@r || None
|
58
|
+
end
|
59
|
+
|
60
|
+
def <<(mod)
|
61
|
+
return if @m.include?(mod)
|
62
|
+
validate(mod) unless mod == Cheri::Builder
|
63
|
+
extendee = mod.respond_to?(:extends) ? mod.extends : nil
|
64
|
+
raise BuilderException,"extended builder module not included: #{extendee}" if extendee && !@m.include?(extendee)
|
65
|
+
#puts "config add mod #{mod}"
|
66
|
+
@m << mod
|
67
|
+
@f[mod] = mod.factory if mod.respond_to?(:factory) && mod.factory
|
68
|
+
@c[mod] = mod.connecter if mod.respond_to?(:connecter) && mod.connecter
|
69
|
+
(@n ||= {})[mod] = mod.consumer if mod.respond_to?(:consumer) && mod.consumer
|
70
|
+
(@r ||= {})[mod] = mod.resolver if mod.respond_to?(:resolver) && mod.resolver
|
71
|
+
#puts "@n = #{@n}"
|
72
|
+
extend_mod(extendee,mod) if extendee
|
73
|
+
self
|
74
|
+
end
|
75
|
+
alias_method :add, :<<
|
76
|
+
|
77
|
+
def extend_mod(mod,ext)
|
78
|
+
# get to the base module to be extended
|
79
|
+
mod = mod.extends while mod.respond_to?(:extends) && mod.extends
|
80
|
+
|
81
|
+
# if we're extending the factory...
|
82
|
+
if (fx = @f[ext])
|
83
|
+
if (fm = @f[mod])
|
84
|
+
# if there's already a factory, wrap it in a SuperFactory
|
85
|
+
# extender goes first so it can override
|
86
|
+
@f[mod] = SuperFactory[fx,fm]
|
87
|
+
else
|
88
|
+
# no factory, use the extender
|
89
|
+
@f[mod] = fx
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# if we're extending the connecter...
|
94
|
+
if (cx = @c[ext])
|
95
|
+
# TODO: break apart mod/ext SuperConnecters to combine embedded type connecters?
|
96
|
+
# Right now all built-in/generated Cheri connecters are type connecters, so it's
|
97
|
+
# not an issue... yet...
|
98
|
+
if (cm = @c[mod])
|
99
|
+
if TypeConnecter === cm && TypeConnecter === cx
|
100
|
+
# if they're both TypeConnecters, create a combined TypeConnecter
|
101
|
+
# extender goes second so it can override
|
102
|
+
@c[mod] = TypeConnecter.new(cm,cx)
|
103
|
+
else
|
104
|
+
# otherwise, combine them in a SuperConnecter
|
105
|
+
# extender goes first so it can override
|
106
|
+
@c[mod] = SuperConnecter[cx,cm]
|
107
|
+
end
|
108
|
+
else
|
109
|
+
# no connecter, use extender
|
110
|
+
@c[mod] = cx
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# if we're extending the consumer... (see comments for factory)
|
115
|
+
if @n && (nx = @n[ext])
|
116
|
+
if (nm = @n[mod])
|
117
|
+
@n[mod] = SuperConsumer[nx,nm]
|
118
|
+
else
|
119
|
+
@n[mod] = nx
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# if we're extending the resolver...
|
124
|
+
# FIXME: this won't really work right now, at least for Java apps, which are
|
125
|
+
# the only ones likely to use this feature. the Java constant resolver wants
|
126
|
+
# all constant symbols from a single (virtual) source, and raises exceptions if
|
127
|
+
# it fails to resolve. coding it anyway, will rethink for next version.
|
128
|
+
if @r && (rx = @r[ext])
|
129
|
+
if (rm = @r[mod])
|
130
|
+
@r[mod] = SuperResolver[rx,rm]
|
131
|
+
else
|
132
|
+
@r[mod] = rx
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def include?(mod)
|
138
|
+
@m.include?(mod)
|
139
|
+
end
|
140
|
+
|
141
|
+
def each
|
142
|
+
@m.each_key {|m| yield m } if block_given?
|
143
|
+
end
|
144
|
+
|
145
|
+
def copy
|
146
|
+
self.class.allocate.copy_from(@m,@f,@c,@n,@r)
|
147
|
+
end
|
148
|
+
protected
|
149
|
+
def copy_from(m,f,c,n,r)
|
150
|
+
@m = m.dup
|
151
|
+
@f = f.dup
|
152
|
+
@c = c.dup
|
153
|
+
@n = n.dup if n
|
154
|
+
@r = r.dup if r
|
155
|
+
self
|
156
|
+
end
|
157
|
+
private
|
158
|
+
def validate(mod)
|
159
|
+
functional = nil
|
160
|
+
if mod.respond_to?(:factory) && (obj = mod.factory)
|
161
|
+
raise validate_error(mod,'invalid factory') unless obj.respond_to?(:builder)
|
162
|
+
functional = true
|
163
|
+
end
|
164
|
+
if mod.respond_to?(:connecter) && (obj = mod.connecter)
|
165
|
+
raise validate_error(mod,'invalid connecter') unless obj.respond_to?(:prepare)
|
166
|
+
functional = true
|
167
|
+
end
|
168
|
+
if mod.respond_to?(:consumer) && (obj = mod.consumer)
|
169
|
+
raise validate_error(mod,'invalid consumer') unless obj.respond_to?(:consume)
|
170
|
+
functional = true
|
171
|
+
end
|
172
|
+
if mod.respond_to?(:resolver) && (obj = mod.resolver)
|
173
|
+
raise validate_error(mod,'invalid resolver') unless obj.respond_to?(:resolve_ctor) &&
|
174
|
+
obj.respond_to?(:resolve_meth)
|
175
|
+
functional = true
|
176
|
+
end
|
177
|
+
raise validate_error(mod,'no functionality') unless functional
|
178
|
+
true
|
179
|
+
end
|
180
|
+
def validate_error(mod,reason)
|
181
|
+
BuilderException.new("not a valid builder module: #{mod} (#{reason})")
|
182
|
+
end
|
183
|
+
|
184
|
+
end #Config
|
185
|
+
|
186
|
+
end #Builder
|
187
|
+
end #Cheri
|
@@ -0,0 +1,386 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (C) 2007 William N Dortch <bill.dortch@gmail.com>
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
#
|
24
|
+
|
25
|
+
module Cheri
|
26
|
+
module Builder
|
27
|
+
|
28
|
+
class TypeConnecter
|
29
|
+
|
30
|
+
def initialize(*parents,&k)
|
31
|
+
@t = {}
|
32
|
+
@s = {}
|
33
|
+
unless parents.empty?
|
34
|
+
t = @t
|
35
|
+
s = @s
|
36
|
+
parents.each do |parent|
|
37
|
+
raise Cheri.type_error(parent,TypeConnecter) unless TypeConnecter === parent
|
38
|
+
parent.get_types.each_pair do |mod,type|
|
39
|
+
if (tmod = t[mod])
|
40
|
+
tmod.merge(type)
|
41
|
+
else
|
42
|
+
t[mod] = type.copy
|
43
|
+
end
|
44
|
+
end
|
45
|
+
parent.get_syms.each_pair do |sym,symc|
|
46
|
+
if (ssym = s[sym])
|
47
|
+
ssym.merge(symc)
|
48
|
+
else
|
49
|
+
s[sym] = symc.copy
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
instance_eval(&k) if k
|
55
|
+
end
|
56
|
+
|
57
|
+
def prepare(ctx,builder,obj,sym,props)
|
58
|
+
# try parent symbol matches first
|
59
|
+
if (ssym = @s[builder.sym])
|
60
|
+
# child symbol match?
|
61
|
+
if (sctr = ssym.sctrs[sym])
|
62
|
+
return sctr.prepare(ctx,builder,obj,sym,props)
|
63
|
+
end
|
64
|
+
# child type match?
|
65
|
+
unless ssym.tctrs.empty?
|
66
|
+
anc = (class<<obj;self;end).ancestors
|
67
|
+
ix = anc.length
|
68
|
+
match = nil
|
69
|
+
# match on nearest ancestor
|
70
|
+
ssym.tctrs.each do |tctr|
|
71
|
+
if (cix = anc.index(tctr.mod)) && cix < ix
|
72
|
+
ix = cix
|
73
|
+
match = tctr
|
74
|
+
end
|
75
|
+
end
|
76
|
+
return match.prepare(ctx,builder,obj,sym,props) if match
|
77
|
+
end
|
78
|
+
end
|
79
|
+
# then try parent type matches
|
80
|
+
t = @t
|
81
|
+
(class<<builder.object;self;end).ancestors.each do |a|
|
82
|
+
if (type = t[a])
|
83
|
+
# child symbol match?
|
84
|
+
if (sctr = type.sctrs[sym])
|
85
|
+
return sctr.prepare(ctx,builder,obj,sym,props)
|
86
|
+
end
|
87
|
+
# child type match?
|
88
|
+
anc ||= (class<<obj;self;end).ancestors
|
89
|
+
ix ||= anc.length
|
90
|
+
match = nil
|
91
|
+
# match on nearest ancestor
|
92
|
+
type.tctrs.each do |tctr|
|
93
|
+
if (cix = anc.index(tctr.mod)) && cix < ix
|
94
|
+
ix = cix
|
95
|
+
match = tctr
|
96
|
+
end
|
97
|
+
end
|
98
|
+
return match.prepare(ctx,builder,obj,sym,props) if match
|
99
|
+
end
|
100
|
+
end
|
101
|
+
false
|
102
|
+
end
|
103
|
+
|
104
|
+
def type(mod,&k)
|
105
|
+
if Module === mod
|
106
|
+
tp = @t[mod] ||= Type.new(mod)
|
107
|
+
tp.instance_eval(&k) if k
|
108
|
+
elsif Symbol === mod
|
109
|
+
sm = @s[mod] ||= Sym.new(mod)
|
110
|
+
sm.instance_eval(&k) if k
|
111
|
+
elsif Array === mod
|
112
|
+
mod.each do |m|
|
113
|
+
if Symbol === m
|
114
|
+
sm = @s[m] ||= Sym.new(m)
|
115
|
+
sm.instance_eval(&k) if k
|
116
|
+
elsif Module === m
|
117
|
+
tp = @t[m] ||= Type.new(m)
|
118
|
+
tp.instance_eval(&k) if k
|
119
|
+
else
|
120
|
+
raise Cheri.type_error(m,Symbol,Class,Module)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
else
|
124
|
+
raise Cheri.type_error(mod,Class,Module,Symbol,Array)
|
125
|
+
end
|
126
|
+
nil
|
127
|
+
end
|
128
|
+
alias_method :types, :type
|
129
|
+
alias_method :symbol, :type
|
130
|
+
alias_method :symbols, :type
|
131
|
+
|
132
|
+
def get_types
|
133
|
+
@t
|
134
|
+
end
|
135
|
+
protected :get_types
|
136
|
+
|
137
|
+
def get_syms
|
138
|
+
@s
|
139
|
+
end
|
140
|
+
protected :get_syms
|
141
|
+
|
142
|
+
# used by simple builder-builder
|
143
|
+
def add_type(mod) #:nodoc:
|
144
|
+
@t[mod] ||= Type.new(mod)
|
145
|
+
end
|
146
|
+
|
147
|
+
class Type
|
148
|
+
def initialize(mod)
|
149
|
+
raise Cheri.type_error(mod,Class,Module) unless Module === mod
|
150
|
+
@m = mod
|
151
|
+
@t = []
|
152
|
+
@s = {}
|
153
|
+
end
|
154
|
+
|
155
|
+
def connect(mod,adder=nil,&k)
|
156
|
+
raise Cheri.type_error(adder,Symbol) if adder && !(Symbol === adder)
|
157
|
+
adder ||= :add unless k
|
158
|
+
if Module === mod
|
159
|
+
addm(mod,adder,&k)
|
160
|
+
elsif Symbol === mod
|
161
|
+
adds(mod,adder,&k)
|
162
|
+
elsif Array === mod
|
163
|
+
mod.each do |m|
|
164
|
+
if Module === m
|
165
|
+
addm(m,adder,&k)
|
166
|
+
elsif Symbol === m
|
167
|
+
adds(m,adder,&k)
|
168
|
+
else
|
169
|
+
raise Cheri.type_error(m,Class,Module,Symbol)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
else
|
173
|
+
raise Cheri.type_error(mod,Class,Module,Symbol,Array)
|
174
|
+
end
|
175
|
+
nil
|
176
|
+
end
|
177
|
+
|
178
|
+
def addm(mod,adder,&k)
|
179
|
+
ctr = TCtr.new(mod,adder,&k)
|
180
|
+
@t.delete mod
|
181
|
+
@t << ctr
|
182
|
+
end
|
183
|
+
private :addm
|
184
|
+
|
185
|
+
def adds(sym,adder,&k)
|
186
|
+
@s[sym] = SCtr.new(sym,adder,&k)
|
187
|
+
end
|
188
|
+
private :adds
|
189
|
+
|
190
|
+
def mod
|
191
|
+
@m
|
192
|
+
end
|
193
|
+
|
194
|
+
def tctrs
|
195
|
+
@t
|
196
|
+
end
|
197
|
+
|
198
|
+
def sctrs
|
199
|
+
@s
|
200
|
+
end
|
201
|
+
|
202
|
+
def merge(other)
|
203
|
+
raise Cheri.type_error(other,Type) unless Type === other
|
204
|
+
t = @t
|
205
|
+
other.tctrs.each do |tctr| t.delete(tctr.mod); end
|
206
|
+
t.concat(other.tctrs)
|
207
|
+
s = @s
|
208
|
+
other.sctrs.each do |sctr| s[sctr.sym] = sctr; end
|
209
|
+
nil
|
210
|
+
end
|
211
|
+
|
212
|
+
def copy
|
213
|
+
self.class.allocate.copy_from(@m,@t,@s)
|
214
|
+
end
|
215
|
+
|
216
|
+
def copy_from(mod,tctrs,sctrs)
|
217
|
+
@m = mod
|
218
|
+
@t = tctrs.dup
|
219
|
+
@s = sctrs.dup
|
220
|
+
self
|
221
|
+
end
|
222
|
+
protected :copy_from
|
223
|
+
|
224
|
+
end #Type
|
225
|
+
|
226
|
+
class Sym
|
227
|
+
def initialize(sym)
|
228
|
+
raise Cheri.type_error(sym,Symbol) unless Symbol === sym
|
229
|
+
@m = sym
|
230
|
+
@t = []
|
231
|
+
@s = {}
|
232
|
+
end
|
233
|
+
|
234
|
+
def connect(sym,adder=nil,&k)
|
235
|
+
raise Cheri.type_error(adder,Symbol) if adder && !(Symbol === adder)
|
236
|
+
adder ||= :add unless k
|
237
|
+
if Symbol === sym
|
238
|
+
adds(sym,adder,&k)
|
239
|
+
elsif Module === sym
|
240
|
+
addm(sym,adder,&k)
|
241
|
+
elsif Array === sym
|
242
|
+
sym.each do |m|
|
243
|
+
if Symbol === m
|
244
|
+
adds(m,adder,&k)
|
245
|
+
elsif Module === m
|
246
|
+
addm(m,adder,&k)
|
247
|
+
else
|
248
|
+
raise Cheri.type_error(m,Symbol,Class,Module)
|
249
|
+
end
|
250
|
+
end
|
251
|
+
else
|
252
|
+
raise Cheri.type_error(sym,Symbol,Class,Module,Array)
|
253
|
+
end
|
254
|
+
nil
|
255
|
+
end
|
256
|
+
|
257
|
+
def addm(mod,adder,&k)
|
258
|
+
ctr = TCtr.new(mod,adder,&k)
|
259
|
+
@t.delete mod
|
260
|
+
@t << ctr
|
261
|
+
end
|
262
|
+
private :addm
|
263
|
+
|
264
|
+
def adds(sym,adder,&k)
|
265
|
+
@s[sym] = SCtr.new(sym,adder,&k)
|
266
|
+
end
|
267
|
+
private :adds
|
268
|
+
|
269
|
+
def sym
|
270
|
+
@m
|
271
|
+
end
|
272
|
+
|
273
|
+
def tctrs
|
274
|
+
@t
|
275
|
+
end
|
276
|
+
|
277
|
+
def sctrs
|
278
|
+
@s
|
279
|
+
end
|
280
|
+
|
281
|
+
def merge(other)
|
282
|
+
raise Cheri.type_error(other,Sym) unless Sym === other
|
283
|
+
t = @t
|
284
|
+
other.tctrs.each do |tctr| t.delete(tctr.mod); end
|
285
|
+
t.concat(other.tctrs)
|
286
|
+
s = @s
|
287
|
+
other.sctrs.each do |sctr| s[sctr.sym] = sctr; end
|
288
|
+
nil
|
289
|
+
end
|
290
|
+
|
291
|
+
def copy
|
292
|
+
self.class.allocate.copy_from(@m,@t,@s)
|
293
|
+
end
|
294
|
+
|
295
|
+
def copy_from(sym,tctrs,sctrs)
|
296
|
+
@m = sym
|
297
|
+
@t = tctrs.dup
|
298
|
+
@s = sctrs.dup
|
299
|
+
self
|
300
|
+
end
|
301
|
+
protected :copy_from
|
302
|
+
|
303
|
+
end #Sym
|
304
|
+
|
305
|
+
class TCtr #:nodoc: all
|
306
|
+
def initialize(mod,adder=nil,&k)
|
307
|
+
raise Cheri.type_error(mod,Class,Module) unless Module === mod
|
308
|
+
raise Cheri.type_error(adder,Symbol) if adder && !(Symbol === adder)
|
309
|
+
@m = mod
|
310
|
+
@a = adder if adder
|
311
|
+
@k = k if k
|
312
|
+
end
|
313
|
+
|
314
|
+
def mod
|
315
|
+
@m
|
316
|
+
end
|
317
|
+
|
318
|
+
def ==(other)
|
319
|
+
TCtr === other ? @m == other.mod : @m == other
|
320
|
+
end
|
321
|
+
|
322
|
+
def eql?(other)
|
323
|
+
TCtr === other ? @m.eql?(other.mod) : @m.eql?(other)
|
324
|
+
end
|
325
|
+
|
326
|
+
def <=>(other)
|
327
|
+
@m.name <=> other.mod.name
|
328
|
+
end
|
329
|
+
|
330
|
+
def prepare(ctx,builder,obj,sym,props)
|
331
|
+
ctx.ppd(self,builder,obj,(@a || sym),props)
|
332
|
+
end
|
333
|
+
|
334
|
+
def connect(parent,obj,sym,props)
|
335
|
+
if @k
|
336
|
+
@k.call(parent,obj,sym,props)
|
337
|
+
else
|
338
|
+
parent.__send__(sym,obj) #rescue nil
|
339
|
+
end
|
340
|
+
nil
|
341
|
+
end
|
342
|
+
end #TCtr
|
343
|
+
|
344
|
+
class SCtr #:nodoc: all
|
345
|
+
def initialize(sym,adder=nil,&k)
|
346
|
+
raise Cheri.type_error(sym,Symbol) unless Symbol === sym
|
347
|
+
raise Cheri.type_error(adder,Symbol) if adder && !(Symbol === adder)
|
348
|
+
@m = sym
|
349
|
+
@a = adder if adder
|
350
|
+
@k = k if k
|
351
|
+
end
|
352
|
+
|
353
|
+
def sym
|
354
|
+
@m
|
355
|
+
end
|
356
|
+
|
357
|
+
def ==(other)
|
358
|
+
SCtr === other ? @m == other.sym : @m == other
|
359
|
+
end
|
360
|
+
|
361
|
+
def eql?(other)
|
362
|
+
SCtr === other ? @m.eql?(other.sym) : @m.eql?(other)
|
363
|
+
end
|
364
|
+
|
365
|
+
def <=>(other)
|
366
|
+
@m.to_s <=> other.sym.to_s
|
367
|
+
end
|
368
|
+
|
369
|
+
def prepare(ctx,builder,obj,sym,props)
|
370
|
+
ctx.ppd(self,builder,obj,(@a || sym),props)
|
371
|
+
end
|
372
|
+
|
373
|
+
def connect(parent,obj,sym,props)
|
374
|
+
if @k
|
375
|
+
@k.call(parent,obj,sym,props)
|
376
|
+
else
|
377
|
+
parent.__send__(sym,obj) #rescue nil
|
378
|
+
end
|
379
|
+
nil
|
380
|
+
end
|
381
|
+
end #SCtr
|
382
|
+
|
383
|
+
end #TypeConnecter
|
384
|
+
|
385
|
+
end #Builder
|
386
|
+
end #Cheri
|