rtp-connect 1.0 → 1.1
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/CHANGELOG.rdoc +11 -0
- data/README.rdoc +8 -7
- data/lib/rtp-connect.rb +4 -1
- data/lib/rtp-connect/control_point.rb +76 -82
- data/lib/rtp-connect/extended_field.rb +43 -18
- data/lib/rtp-connect/field.rb +88 -108
- data/lib/rtp-connect/methods.rb +1 -1
- data/lib/rtp-connect/plan.rb +62 -65
- data/lib/rtp-connect/prescription.rb +52 -36
- data/lib/rtp-connect/record.rb +9 -4
- data/lib/rtp-connect/ruby_extensions.rb +1 -1
- data/lib/rtp-connect/site_setup.rb +53 -38
- data/lib/rtp-connect/version.rb +1 -1
- metadata +4 -4
@@ -24,10 +24,8 @@ module RTP
|
|
24
24
|
# * <tt>parent</tt> -- A Record which is used to determine the proper parent of this instance.
|
25
25
|
#
|
26
26
|
def self.load(string, parent)
|
27
|
-
raise ArgumentError, "Invalid argument 'string'. Expected String, got #{string.class}." unless string.is_a?(String)
|
28
|
-
raise ArgumentError, "Invalid argument 'parent'. Expected RTP::Record, got #{parent.class}." unless parent.is_a?(RTP::Record)
|
29
27
|
# Get the quote-less values:
|
30
|
-
values = string.values
|
28
|
+
values = string.to_s.values
|
31
29
|
raise ArgumentError, "Invalid argument 'string': Expected exactly 6 elements, got #{values.length}." unless values.length == 6
|
32
30
|
f = self.new(parent)
|
33
31
|
# Assign the values to attributes:
|
@@ -47,19 +45,34 @@ module RTP
|
|
47
45
|
# * <tt>parent</tt> -- A Record which is used to determine the proper parent of this instance.
|
48
46
|
#
|
49
47
|
def initialize(parent)
|
50
|
-
|
51
|
-
|
52
|
-
@parent = get_parent(parent, Field)
|
48
|
+
# Parent relation (may get more than one type of record here):
|
49
|
+
@parent = get_parent(parent.to_record, Field)
|
53
50
|
@parent.add_extended_field(self)
|
54
51
|
@keyword = 'EXTENDED_FIELD_DEF'
|
55
52
|
end
|
56
53
|
|
54
|
+
# Returns true if the argument is an instance with attributes equal to self.
|
55
|
+
#
|
56
|
+
def ==(other)
|
57
|
+
if other.respond_to?(:to_extended_field)
|
58
|
+
other.send(:state) == state
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
alias_method :eql?, :==
|
63
|
+
|
57
64
|
# Returns an empty array, as these instances are child-less by definition.
|
58
65
|
#
|
59
66
|
def children
|
60
67
|
return Array.new
|
61
68
|
end
|
62
69
|
|
70
|
+
# Generates a Fixnum hash value for this instance.
|
71
|
+
#
|
72
|
+
def hash
|
73
|
+
state.hash
|
74
|
+
end
|
75
|
+
|
63
76
|
# Returns the values of this instance in an array.
|
64
77
|
# The values does not include the CRC.
|
65
78
|
#
|
@@ -73,55 +86,67 @@ module RTP
|
|
73
86
|
]
|
74
87
|
end
|
75
88
|
|
89
|
+
# Returns self.
|
90
|
+
#
|
91
|
+
def to_extended_field
|
92
|
+
self
|
93
|
+
end
|
94
|
+
|
76
95
|
# Writes the ExtendedField object + any hiearchy of child objects,
|
77
96
|
# to a properly formatted RTPConnect ascii string.
|
78
97
|
#
|
79
|
-
def
|
98
|
+
def to_s
|
80
99
|
str = encode
|
81
100
|
if children
|
82
101
|
children.each do |child|
|
83
|
-
str += child.
|
102
|
+
str += child.to_s
|
84
103
|
end
|
85
104
|
end
|
86
105
|
return str
|
87
106
|
end
|
88
107
|
|
108
|
+
alias :to_str :to_s
|
109
|
+
|
89
110
|
# Sets the keyword attribute.
|
90
111
|
#
|
91
112
|
def keyword=(value)
|
92
|
-
|
93
|
-
raise ArgumentError, "Invalid keyword. Expected 'EXTENDED_FIELD_DEF', got #{value}." unless value
|
113
|
+
value = value.to_s.upcase
|
114
|
+
raise ArgumentError, "Invalid keyword. Expected 'EXTENDED_FIELD_DEF', got #{value}." unless value == "EXTENDED_FIELD_DEF"
|
94
115
|
@keyword = value
|
95
116
|
end
|
96
117
|
|
97
118
|
# Sets the field_id attribute.
|
98
119
|
#
|
99
120
|
def field_id=(value)
|
100
|
-
|
101
|
-
@field_id = value
|
121
|
+
@field_id = value && value.to_s
|
102
122
|
end
|
103
123
|
|
104
124
|
# Sets the original_plan_uid attribute.
|
105
125
|
#
|
106
126
|
def original_plan_uid=(value)
|
107
|
-
|
108
|
-
@original_plan_uid = value
|
127
|
+
@original_plan_uid = value && value.to_s
|
109
128
|
end
|
110
129
|
|
111
130
|
# Sets the original_beam_number attribute.
|
112
131
|
#
|
113
132
|
def original_beam_number=(value)
|
114
|
-
|
115
|
-
@original_beam_number = value
|
133
|
+
@original_beam_number = value && value.to_s
|
116
134
|
end
|
117
135
|
|
118
136
|
# Sets the original_beam_name attribute.
|
119
137
|
#
|
120
138
|
def original_beam_name=(value)
|
121
|
-
|
122
|
-
@original_beam_name = value
|
139
|
+
@original_beam_name = value && value.to_s
|
123
140
|
end
|
124
141
|
|
142
|
+
|
143
|
+
private
|
144
|
+
|
145
|
+
|
146
|
+
# Returns the attributes of this instance in an array (for comparison purposes).
|
147
|
+
#
|
148
|
+
alias_method :state, :values
|
149
|
+
|
125
150
|
end
|
126
151
|
|
127
152
|
end
|
data/lib/rtp-connect/field.rb
CHANGED
@@ -71,10 +71,8 @@ module RTP
|
|
71
71
|
# * <tt>parent</tt> -- A Record which is used to determine the proper parent of this instance.
|
72
72
|
#
|
73
73
|
def self.load(string, parent)
|
74
|
-
raise ArgumentError, "Invalid argument 'string'. Expected String, got #{string.class}." unless string.is_a?(String)
|
75
|
-
raise ArgumentError, "Invalid argument 'parent'. Expected RTP::Record, got #{parent.class}." unless parent.is_a?(RTP::Record)
|
76
74
|
# Get the quote-less values:
|
77
|
-
values = string.values
|
75
|
+
values = string.to_s.values
|
78
76
|
raise ArgumentError, "Invalid argument 'string': Expected exactly 49 elements, got #{values.length}." unless values.length == 49
|
79
77
|
f = self.new(parent)
|
80
78
|
# Assign the values to attributes:
|
@@ -137,28 +135,35 @@ module RTP
|
|
137
135
|
# * <tt>parent</tt> -- A Record which is used to determine the proper parent of this instance.
|
138
136
|
#
|
139
137
|
def initialize(parent)
|
140
|
-
raise ArgumentError, "Invalid argument 'parent'. Expected RTP::Record, got #{parent.class}." unless parent.is_a?(RTP::Record)
|
141
138
|
# Child records:
|
142
139
|
@control_points = Array.new
|
143
140
|
@extended_field = nil
|
144
|
-
# Parent relation:
|
145
|
-
@parent = get_parent(parent, Prescription)
|
141
|
+
# Parent relation (may get more than one type of record here):
|
142
|
+
@parent = get_parent(parent.to_record, Prescription)
|
146
143
|
@parent.add_field(self)
|
147
144
|
@keyword = 'FIELD_DEF'
|
148
145
|
end
|
149
146
|
|
147
|
+
# Returns true if the argument is an instance with attributes equal to self.
|
148
|
+
#
|
149
|
+
def ==(other)
|
150
|
+
if other.respond_to?(:to_field)
|
151
|
+
other.send(:state) == state
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
alias_method :eql?, :==
|
156
|
+
|
150
157
|
# Adds a control point record to this instance.
|
151
158
|
#
|
152
159
|
def add_control_point(child)
|
153
|
-
|
154
|
-
@control_points << child
|
160
|
+
@control_points << child.to_control_point
|
155
161
|
end
|
156
162
|
|
157
163
|
# Connects an extended treatment field record to this instance.
|
158
164
|
#
|
159
165
|
def add_extended_field(child)
|
160
|
-
|
161
|
-
@extended_field = child
|
166
|
+
@extended_field = child.to_extended_field
|
162
167
|
end
|
163
168
|
|
164
169
|
# Returns nil, as these instances are child-less by definition.
|
@@ -167,6 +172,12 @@ module RTP
|
|
167
172
|
return [@extended_field, @control_points].flatten.compact
|
168
173
|
end
|
169
174
|
|
175
|
+
# Generates a Fixnum hash value for this instance.
|
176
|
+
#
|
177
|
+
def hash
|
178
|
+
state.hash
|
179
|
+
end
|
180
|
+
|
170
181
|
# Returns the values of this instance in an array.
|
171
182
|
# The values does not include the CRC.
|
172
183
|
#
|
@@ -223,356 +234,325 @@ module RTP
|
|
223
234
|
]
|
224
235
|
end
|
225
236
|
|
237
|
+
# Returns self.
|
238
|
+
#
|
239
|
+
def to_field
|
240
|
+
self
|
241
|
+
end
|
242
|
+
|
226
243
|
# Writes the Field object + any hiearchy of child objects,
|
227
244
|
# to a properly formatted RTPConnect ascii string.
|
228
245
|
#
|
229
|
-
def
|
246
|
+
def to_s
|
230
247
|
str = encode
|
231
248
|
if children
|
232
249
|
children.each do |child|
|
233
|
-
str += child.
|
250
|
+
str += child.to_s
|
234
251
|
end
|
235
252
|
end
|
236
253
|
return str
|
237
254
|
end
|
238
255
|
|
256
|
+
alias :to_str :to_s
|
257
|
+
|
239
258
|
# Sets the keyword attribute.
|
240
259
|
#
|
241
260
|
def keyword=(value)
|
242
|
-
|
243
|
-
raise ArgumentError, "Invalid keyword. Expected 'FIELD_DEF', got #{value}." unless value
|
261
|
+
value = value.to_s.upcase
|
262
|
+
raise ArgumentError, "Invalid keyword. Expected 'FIELD_DEF', got #{value}." unless value == "FIELD_DEF"
|
244
263
|
@keyword = value
|
245
264
|
end
|
246
265
|
|
247
266
|
# Sets the rx_site_name attribute.
|
248
267
|
#
|
249
268
|
def rx_site_name=(value)
|
250
|
-
|
251
|
-
@rx_site_name = value
|
269
|
+
@rx_site_name = value && value.to_s
|
252
270
|
end
|
253
271
|
|
254
272
|
# Sets the field_name attribute.
|
255
273
|
#
|
256
274
|
def field_name=(value)
|
257
|
-
|
258
|
-
@field_name = value
|
275
|
+
@field_name = value && value.to_s
|
259
276
|
end
|
260
277
|
|
261
278
|
# Sets the field_id attribute.
|
262
279
|
#
|
263
280
|
def field_id=(value)
|
264
|
-
|
265
|
-
@field_id = value
|
281
|
+
@field_id = value && value.to_s
|
266
282
|
end
|
267
283
|
|
268
284
|
# Sets the field_note attribute.
|
269
285
|
#
|
270
286
|
def field_note=(value)
|
271
|
-
|
272
|
-
@field_note = value
|
287
|
+
@field_note = value && value.to_s
|
273
288
|
end
|
274
289
|
|
275
290
|
# Sets the field_dose attribute.
|
276
291
|
#
|
277
292
|
def field_dose=(value)
|
278
|
-
|
279
|
-
@field_dose = value
|
293
|
+
@field_dose = value && value.to_s
|
280
294
|
end
|
281
295
|
|
282
296
|
# Sets the field_monitor_units attribute.
|
283
297
|
#
|
284
298
|
def field_monitor_units=(value)
|
285
|
-
|
286
|
-
@field_monitor_units = value
|
299
|
+
@field_monitor_units = value && value.to_s
|
287
300
|
end
|
288
301
|
|
289
302
|
# Sets the wedge_monitor_units attribute.
|
290
303
|
#
|
291
304
|
def wedge_monitor_units=(value)
|
292
|
-
|
293
|
-
@wedge_monitor_units = value
|
305
|
+
@wedge_monitor_units = value && value.to_s
|
294
306
|
end
|
295
307
|
|
296
308
|
# Sets the treatment_machine attribute.
|
297
309
|
#
|
298
310
|
def treatment_machine=(value)
|
299
|
-
|
300
|
-
@treatment_machine = value
|
311
|
+
@treatment_machine = value && value.to_s
|
301
312
|
end
|
302
313
|
|
303
314
|
# Sets the treatment_type attribute.
|
304
315
|
#
|
305
316
|
def treatment_type=(value)
|
306
|
-
|
307
|
-
@treatment_type = value
|
317
|
+
@treatment_type = value && value.to_s
|
308
318
|
end
|
309
319
|
|
310
320
|
# Sets the modality attribute.
|
311
321
|
#
|
312
322
|
def modality=(value)
|
313
|
-
|
314
|
-
@modality = value
|
323
|
+
@modality = value && value.to_s
|
315
324
|
end
|
316
325
|
|
317
326
|
# Sets the energy attribute.
|
318
327
|
#
|
319
328
|
def energy=(value)
|
320
|
-
|
321
|
-
@energy = value
|
329
|
+
@energy = value && value.to_s
|
322
330
|
end
|
323
331
|
|
324
332
|
# Sets the time attribute.
|
325
333
|
#
|
326
334
|
def time=(value)
|
327
|
-
|
328
|
-
@time = value
|
335
|
+
@time = value && value.to_s
|
329
336
|
end
|
330
337
|
|
331
338
|
# Sets the doserate attribute.
|
332
339
|
#
|
333
340
|
def doserate=(value)
|
334
|
-
|
335
|
-
@doserate = value
|
341
|
+
@doserate = value && value.to_s
|
336
342
|
end
|
337
343
|
|
338
344
|
# Sets the sad attribute.
|
339
345
|
#
|
340
346
|
def sad=(value)
|
341
|
-
|
342
|
-
@sad = value
|
347
|
+
@sad = value && value.to_s
|
343
348
|
end
|
344
349
|
|
345
350
|
# Sets the ssd attribute.
|
346
351
|
#
|
347
352
|
def ssd=(value)
|
348
|
-
|
349
|
-
@ssd = value
|
353
|
+
@ssd = value && value.to_s
|
350
354
|
end
|
351
355
|
|
352
356
|
# Sets the gantry_angle attribute.
|
353
357
|
#
|
354
358
|
def gantry_angle=(value)
|
355
|
-
|
356
|
-
@gantry_angle = value
|
359
|
+
@gantry_angle = value && value.to_s
|
357
360
|
end
|
358
361
|
|
359
362
|
# Sets the collimator_angle attribute.
|
360
363
|
#
|
361
364
|
def collimator_angle=(value)
|
362
|
-
|
363
|
-
@collimator_angle = value
|
365
|
+
@collimator_angle = value && value.to_s
|
364
366
|
end
|
365
367
|
|
366
368
|
# Sets the field_x_mode attribute.
|
367
369
|
#
|
368
370
|
def field_x_mode=(value)
|
369
|
-
|
370
|
-
@field_x_mode = value
|
371
|
+
@field_x_mode = value && value.to_s
|
371
372
|
end
|
372
373
|
|
373
374
|
# Sets the field_x attribute.
|
374
375
|
#
|
375
376
|
def field_x=(value)
|
376
|
-
|
377
|
-
@field_x = value
|
377
|
+
@field_x = value && value.to_s
|
378
378
|
end
|
379
379
|
|
380
380
|
# Sets the collimator_x1 attribute.
|
381
381
|
#
|
382
382
|
def collimator_x1=(value)
|
383
|
-
|
384
|
-
@collimator_x1 = value
|
383
|
+
@collimator_x1 = value && value.to_s
|
385
384
|
end
|
386
385
|
|
387
386
|
# Sets the collimator_x2 attribute.
|
388
387
|
#
|
389
388
|
def collimator_x2=(value)
|
390
|
-
|
391
|
-
@collimator_x2 = value
|
389
|
+
@collimator_x2 = value && value.to_s
|
392
390
|
end
|
393
391
|
|
394
392
|
# Sets the field_y_mode attribute.
|
395
393
|
#
|
396
394
|
def field_y_mode=(value)
|
397
|
-
|
398
|
-
@field_y_mode = value
|
395
|
+
@field_y_mode = value && value.to_s
|
399
396
|
end
|
400
397
|
|
401
398
|
# Sets the field_y attribute.
|
402
399
|
#
|
403
400
|
def field_y=(value)
|
404
|
-
|
405
|
-
@field_y = value
|
401
|
+
@field_y = value && value.to_s
|
406
402
|
end
|
407
403
|
|
408
404
|
# Sets the collimator_y1 attribute.
|
409
405
|
#
|
410
406
|
def collimator_y1=(value)
|
411
|
-
|
412
|
-
@collimator_y1 = value
|
407
|
+
@collimator_y1 = value && value.to_s
|
413
408
|
end
|
414
409
|
|
415
410
|
# Sets the collimator_y2 attribute.
|
416
411
|
#
|
417
412
|
def collimator_y2=(value)
|
418
|
-
|
419
|
-
@collimator_y2 = value
|
413
|
+
@collimator_y2 = value && value.to_s
|
420
414
|
end
|
421
415
|
|
422
416
|
# Sets the couch_vertical attribute.
|
423
417
|
#
|
424
418
|
def couch_vertical=(value)
|
425
|
-
|
426
|
-
@couch_vertical = value
|
419
|
+
@couch_vertical = value && value.to_s
|
427
420
|
end
|
428
421
|
|
429
422
|
# Sets the couch_lateral attribute.
|
430
423
|
#
|
431
424
|
def couch_lateral=(value)
|
432
|
-
|
433
|
-
@couch_lateral = value
|
425
|
+
@couch_lateral = value && value.to_s
|
434
426
|
end
|
435
427
|
|
436
428
|
# Sets the couch_longitudinal attribute.
|
437
429
|
#
|
438
430
|
def couch_longitudinal=(value)
|
439
|
-
|
440
|
-
@couch_longitudinal = value
|
431
|
+
@couch_longitudinal = value && value.to_s
|
441
432
|
end
|
442
433
|
|
443
434
|
# Sets the couch_angle attribute.
|
444
435
|
#
|
445
436
|
def couch_angle=(value)
|
446
|
-
|
447
|
-
@couch_angle = value
|
437
|
+
@couch_angle = value && value.to_s
|
448
438
|
end
|
449
439
|
|
450
440
|
# Sets the couch_pedestal attribute.
|
451
441
|
#
|
452
442
|
def couch_pedestal=(value)
|
453
|
-
|
454
|
-
@couch_pedestal = value
|
443
|
+
@couch_pedestal = value && value.to_s
|
455
444
|
end
|
456
445
|
|
457
446
|
# Sets the tolerance_table attribute.
|
458
447
|
#
|
459
448
|
def tolerance_table=(value)
|
460
|
-
|
461
|
-
@tolerance_table = value
|
449
|
+
@tolerance_table = value && value.to_s
|
462
450
|
end
|
463
451
|
|
464
452
|
# Sets the arc_direction attribute.
|
465
453
|
#
|
466
454
|
def arc_direction=(value)
|
467
|
-
|
468
|
-
@arc_direction = value
|
455
|
+
@arc_direction = value && value.to_s
|
469
456
|
end
|
470
457
|
|
471
458
|
# Sets the arc_start_angle attribute.
|
472
459
|
#
|
473
460
|
def arc_start_angle=(value)
|
474
|
-
|
475
|
-
@arc_start_angle = value
|
461
|
+
@arc_start_angle = value && value.to_s
|
476
462
|
end
|
477
463
|
|
478
464
|
# Sets the arc_stop_angle attribute.
|
479
465
|
#
|
480
466
|
def arc_stop_angle=(value)
|
481
|
-
|
482
|
-
@arc_stop_angle = value
|
467
|
+
@arc_stop_angle = value && value.to_s
|
483
468
|
end
|
484
469
|
|
485
470
|
# Sets the arc_mu_degree attribute.
|
486
471
|
#
|
487
472
|
def arc_mu_degree=(value)
|
488
|
-
|
489
|
-
@arc_mu_degree = value
|
473
|
+
@arc_mu_degree = value && value.to_s
|
490
474
|
end
|
491
475
|
|
492
476
|
# Sets the wedge attribute.
|
493
477
|
#
|
494
478
|
def wedge=(value)
|
495
|
-
|
496
|
-
@wedge = value
|
479
|
+
@wedge = value && value.to_s
|
497
480
|
end
|
498
481
|
|
499
482
|
# Sets the dynamic_wedge attribute.
|
500
483
|
#
|
501
484
|
def dynamic_wedge=(value)
|
502
|
-
|
503
|
-
@dynamic_wedge = value
|
485
|
+
@dynamic_wedge = value && value.to_s
|
504
486
|
end
|
505
487
|
|
506
488
|
# Sets the block attribute.
|
507
489
|
#
|
508
490
|
def block=(value)
|
509
|
-
|
510
|
-
@block = value
|
491
|
+
@block = value && value.to_s
|
511
492
|
end
|
512
493
|
|
513
494
|
# Sets the compensator attribute.
|
514
495
|
#
|
515
496
|
def compensator=(value)
|
516
|
-
|
517
|
-
@compensator = value
|
497
|
+
@compensator = value && value.to_s
|
518
498
|
end
|
519
499
|
|
520
500
|
# Sets the e_applicator attribute.
|
521
501
|
#
|
522
502
|
def e_applicator=(value)
|
523
|
-
|
524
|
-
@e_applicator = value
|
503
|
+
@e_applicator = value && value.to_s
|
525
504
|
end
|
526
505
|
|
527
506
|
# Sets the e_field_def_aperture attribute.
|
528
507
|
#
|
529
508
|
def e_field_def_aperture=(value)
|
530
|
-
|
531
|
-
@e_field_def_aperture = value
|
509
|
+
@e_field_def_aperture = value && value.to_s
|
532
510
|
end
|
533
511
|
|
534
512
|
# Sets the bolus attribute.
|
535
513
|
#
|
536
514
|
def bolus=(value)
|
537
|
-
|
538
|
-
@bolus = value
|
515
|
+
@bolus = value && value.to_s
|
539
516
|
end
|
540
517
|
|
541
518
|
# Sets the portfilm_mu_open attribute.
|
542
519
|
#
|
543
520
|
def portfilm_mu_open=(value)
|
544
|
-
|
545
|
-
@portfilm_mu_open = value
|
521
|
+
@portfilm_mu_open = value && value.to_s
|
546
522
|
end
|
547
523
|
|
548
524
|
# Sets the portfilm_coeff_open attribute.
|
549
525
|
#
|
550
526
|
def portfilm_coeff_open=(value)
|
551
|
-
|
552
|
-
@portfilm_coeff_open = value
|
527
|
+
@portfilm_coeff_open = value && value.to_s
|
553
528
|
end
|
554
529
|
|
555
530
|
# Sets the portfilm_delta_open attribute.
|
556
531
|
#
|
557
532
|
def portfilm_delta_open=(value)
|
558
|
-
|
559
|
-
@portfilm_delta_open = value
|
533
|
+
@portfilm_delta_open = value && value.to_s
|
560
534
|
end
|
561
535
|
|
562
536
|
# Sets the portfilm_mu_treat attribute.
|
563
537
|
#
|
564
538
|
def portfilm_mu_treat=(value)
|
565
|
-
|
566
|
-
@portfilm_mu_treat = value
|
539
|
+
@portfilm_mu_treat = value && value.to_s
|
567
540
|
end
|
568
541
|
|
569
542
|
# Sets the portfilm_coeff_treat attribute.
|
570
543
|
#
|
571
544
|
def portfilm_coeff_treat=(value)
|
572
|
-
|
573
|
-
@portfilm_coeff_treat = value
|
545
|
+
@portfilm_coeff_treat = value && value.to_s
|
574
546
|
end
|
575
547
|
|
548
|
+
|
549
|
+
private
|
550
|
+
|
551
|
+
|
552
|
+
# Returns the attributes of this instance in an array (for comparison purposes).
|
553
|
+
#
|
554
|
+
alias_method :state, :values
|
555
|
+
|
576
556
|
end
|
577
557
|
|
578
558
|
end
|