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