cheri 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|