cheri 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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