class ZAML::Label
Label
class – resolves circular references
Public Class Methods
counter_reset()
click to toggle source
YAML only wants objects in the datastream once; if the same object
occurs more than once, we need to emit a label ("&idxxx") on the first occurrence and then emit a back reference (*idxxx") on any subsequent occurrence(s).
To accomplish this we keeps a hash (by object id) of the labels of
the things we serialize as we begin to serialize them. The labels initially serialize as an empty string (since most objects are only going to be be encountered once), but can be changed to a valid (by assigning it a number) the first time it is subsequently used, if it ever is. Note that we need to do the label setup BEFORE we start to serialize the object so that circular structures (in which we will encounter a reference to the object as we serialize it can be handled).
# File lib/icss/serialization/zaml.rb, line 160 def self.counter_reset @@previously_emitted_object = {} @@next_free_label_number = 0 end
for(obj)
click to toggle source
# File lib/icss/serialization/zaml.rb, line 176 def self.for(obj) @@previously_emitted_object[obj.object_id] end
new(obj,indent)
click to toggle source
# File lib/icss/serialization/zaml.rb, line 164 def initialize(obj,indent) @indent = indent @this_label_number = nil @@previously_emitted_object[obj.object_id] = self end
Public Instance Methods
reference()
click to toggle source
# File lib/icss/serialization/zaml.rb, line 172 def reference @this_label_number ||= (@@next_free_label_number += 1) @reference ||= '*id%03d' % @this_label_number end
to_s()
click to toggle source
# File lib/icss/serialization/zaml.rb, line 169 def to_s @this_label_number ? ('&id%03d%s' % [@this_label_number, @indent]) : '' end