module Sof class Writer include Util def initialize members @members = members end def write node = to_sof_node(@members.root , 0) io = StringIO.new node.out( io , 0 ) io.string end def to_sof_node(object , level) if is_value?(object) return SimpleNode.new(object.to_sof()) end occurence = @members.objects[object] raise "no object #{object}" unless occurence if(level > occurence.level ) #puts "level #{level} at #{occurence.level}" return SimpleNode.new("*#{occurence.number}") end ref = occurence.referenced ? occurence.number : nil if(object.respond_to? :to_sof_node) #mainly meant for arrays and hashes object.to_sof_node(self , level , ref ) else object_sof_node(object , level , ref ) end end def object_sof_node( object , level , ref) head = object.class.name + "(" atts = attributes_for(object).inject({}) do |hash , a| val = get_value(object , a) hash[a] = to_sof_node(val , level + 1) hash end immediate , extended = atts.partition {|a,val| val.is_a?(SimpleNode) } head += immediate.collect {|a,val| "#{a}: #{val.data}"}.join(", ") + ")" node = ObjectNode.new(head , ref) extended.each do |a , val| node.add( to_sof_node(a,level + 1) , val ) end node end def self.write object writer = Writer.new(Members.new(object) ) writer.write end end end