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.
Files changed (79) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README +98 -0
  3. data/Rakefile +121 -0
  4. data/examples/hello_world_1.rb +28 -0
  5. data/examples/table_1.rb +44 -0
  6. data/lib/cheri/awt.rb +41 -0
  7. data/lib/cheri/builder.rb +31 -0
  8. data/lib/cheri/builder/awt/connecter.rb +63 -0
  9. data/lib/cheri/builder/awt/constants.rb +1003 -0
  10. data/lib/cheri/builder/awt/main.rb +191 -0
  11. data/lib/cheri/builder/awt/types.rb +220 -0
  12. data/lib/cheri/builder/base.rb +533 -0
  13. data/lib/cheri/builder/config.rb +187 -0
  14. data/lib/cheri/builder/connecter.rb +386 -0
  15. data/lib/cheri/builder/context.rb +655 -0
  16. data/lib/cheri/builder/generator.rb +425 -0
  17. data/lib/cheri/builder/html/charsets.rb +154 -0
  18. data/lib/cheri/builder/html/common.rb +32 -0
  19. data/lib/cheri/builder/html/connecter.rb +57 -0
  20. data/lib/cheri/builder/html/element.rb +156 -0
  21. data/lib/cheri/builder/html/main.rb +116 -0
  22. data/lib/cheri/builder/html/types.rb +123 -0
  23. data/lib/cheri/builder/main.rb +483 -0
  24. data/lib/cheri/builder/swing/connecter.rb +141 -0
  25. data/lib/cheri/builder/swing/constants.rb +420 -0
  26. data/lib/cheri/builder/swing/main.rb +446 -0
  27. data/lib/cheri/builder/swing/types.rb +270 -0
  28. data/lib/cheri/builder/xml/charsets.rb +154 -0
  29. data/lib/cheri/builder/xml/common.rb +32 -0
  30. data/lib/cheri/builder/xml/connecter.rb +42 -0
  31. data/lib/cheri/builder/xml/element.rb +189 -0
  32. data/lib/cheri/builder/xml/main.rb +130 -0
  33. data/lib/cheri/builder/xml/types.rb +36 -0
  34. data/lib/cheri/cheri.rb +70 -0
  35. data/lib/cheri/cjx.rb +3 -0
  36. data/lib/cheri/explorer.rb +32 -0
  37. data/lib/cheri/explorer/explorer.rb +560 -0
  38. data/lib/cheri/html.rb +31 -0
  39. data/lib/cheri/image/Delete24.gif +0 -0
  40. data/lib/cheri/image/Find24.gif +0 -0
  41. data/lib/cheri/image/FindAgain24.gif +0 -0
  42. data/lib/cheri/image/Refresh24.gif +0 -0
  43. data/lib/cheri/image/Search24.gif +0 -0
  44. data/lib/cheri/image/Thumbs.db +0 -0
  45. data/lib/cheri/image/cheri_icon_16x16.png +0 -0
  46. data/lib/cheri/image/cheri_icon_24x24.png +0 -0
  47. data/lib/cheri/image/cheri_logo_medium.png +0 -0
  48. data/lib/cheri/image/close_10x10.png +0 -0
  49. data/lib/cheri/image/close_10x10s.png +0 -0
  50. data/lib/cheri/image/close_12x12.png +0 -0
  51. data/lib/cheri/image/close_14x14.png +0 -0
  52. data/lib/cheri/image/close_24x24.png +0 -0
  53. data/lib/cheri/image/close_dim2_12x12.png +0 -0
  54. data/lib/cheri/image/close_dim_12x12.png +0 -0
  55. data/lib/cheri/image/cls_tree.png +0 -0
  56. data/lib/cheri/image/con_tree.png +0 -0
  57. data/lib/cheri/image/jruby_14x16.png +0 -0
  58. data/lib/cheri/image/jruby_logo.png +0 -0
  59. data/lib/cheri/image/mod_tree.png +0 -0
  60. data/lib/cheri/image/obj_tree.png +0 -0
  61. data/lib/cheri/image/ruby_16x16.png +0 -0
  62. data/lib/cheri/image/vars_tree.png +0 -0
  63. data/lib/cheri/java.rb +26 -0
  64. data/lib/cheri/java/builder.rb +28 -0
  65. data/lib/cheri/java/builder/main.rb +407 -0
  66. data/lib/cheri/java/builder/util.rb +480 -0
  67. data/lib/cheri/java/java.rb +56 -0
  68. data/lib/cheri/jruby.rb +32 -0
  69. data/lib/cheri/jruby/explorer.rb +43 -0
  70. data/lib/cheri/jruby/explorer/common.rb +38 -0
  71. data/lib/cheri/jruby/explorer/dialogs.rb +383 -0
  72. data/lib/cheri/jruby/explorer/explorer.rb +904 -0
  73. data/lib/cheri/jruby/explorer/splash.rb +80 -0
  74. data/lib/cheri/jruby/explorer/viewer.rb +619 -0
  75. data/lib/cheri/jruby/explorer/viewers.rb +1057 -0
  76. data/lib/cheri/jruby/jruby.rb +59 -0
  77. data/lib/cheri/swing.rb +41 -0
  78. data/lib/cheri/xml.rb +31 -0
  79. 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