diff --git a/lib/sof/occurence.rb b/lib/sof/occurence.rb index 79b4f30..225cde9 100644 --- a/lib/sof/occurence.rb +++ b/lib/sof/occurence.rb @@ -4,13 +4,14 @@ module Sof def initialize object , level @object = object @level = level - @referenced = nil + @referenced = nil + @written = nil end def set_reference r @referenced = r end attr_reader :object , :referenced - attr_accessor :level + attr_accessor :level , :written end end diff --git a/lib/sof/writer.rb b/lib/sof/writer.rb index 6b20507..beb82ff 100644 --- a/lib/sof/writer.rb +++ b/lib/sof/writer.rb @@ -18,9 +18,14 @@ module Sof end occurence = @members.objects[object.object_id] raise "no object #{object}" unless occurence - if(level > occurence.level ) + #puts "#{level} ? #{occurence.level} : ref #{occurence.referenced}" + if( occurence.referenced and (occurence.level <= level) ) #puts "ref #{occurence.referenced} level #{level} at #{occurence.level}" - return SimpleNode.new("*#{occurence.referenced}") + if( occurence.written.nil? ) + occurence.written = true + else + return SimpleNode.new("*#{occurence.referenced}") + end end ref = occurence.referenced if(object.respond_to? :to_sof_node) #mainly meant for arrays and hashes @@ -36,7 +41,7 @@ module Sof end head = object.class.name + "(" atts = {} - attributes_for(object).each() do |a| + attributes_for(object).each() do |a| val = get_value(object , a) next if val.nil? atts[a] = to_sof_node(val , level + 1) @@ -55,6 +60,6 @@ module Sof writer = Writer.new(Members.new(object) ) writer.write end - + end end diff --git a/test/test_all.rb b/test/test_all.rb index ba5e4d5..d3ea870 100644 --- a/test/test_all.rb +++ b/test/test_all.rb @@ -1,3 +1,4 @@ require_relative "test_basic" require_relative "test_object" require_relative "test_ext" +require_relative "test_refs" diff --git a/test/test_object.rb b/test/test_object.rb index 33875fc..77e3c71 100644 --- a/test/test_object.rb +++ b/test/test_object.rb @@ -57,6 +57,6 @@ class ObjectSof < MiniTest::Test object.extra = ObjectWithAttributes ar = [object , ObjectWithAttributes] @out = ar - check "-ObjectWithAttributes(:name => 'some name', :number => 1234, :extra => *1)\n-&1 ObjectWithAttributes" + check "-ObjectWithAttributes(:name => 'some name', :number => 1234, :extra => &1 ObjectWithAttributes)\n-*1" end end