From: Brian Buckley Date: 2005-11-18T23:41:59+09:00 Subject: Re: YAML and constant objects > > I don't yet fully understand your code I am posting the solution I came up with, seeking critical commentary. In particular I am unsure whether my use of YAML's "add_domain_type" (where I've got a separate entry for each constant X for which "X.yamlize_as_constant" is called) is in the spirit of how YAML was designed to be used. Any comments appreciated. --Brian Buckley module YamlizeAsConstant def yamlize_as_constant(name = nil, domain = "aw.com,2005") name = (self.class.name + "/" + constant_name).downcase if !name yaml_name = "!" + domain + "/" + name (class << self; self; end).class_eval do define_method("to_yaml_type") {|*args| yaml_name} define_method("to_yaml_properties"){|*args| []} #no properties saved end #don't make an new object, rather return the constant YAML.add_domain_type(domain, name) {|type, val| self} end def constant_name self.class.constants.each do |c| return c if self.class.const_get(c) == self end nil end end class Object include YamlizeAsConstant end class Foo attr_accessor :a, :b # many more FOO1 = Foo.new FOO1.a = "test text a" FOO1.b = "test text b" FOO1.yamlize_as_constant end class TestYamlizeAsConstant < Test::Unit::TestCase def test_foo assert_equal "--- !aw.com,2005/foo/foo1 {}", Foo::FOO1.to_yaml assert_same Foo::FOO1, YAML::load(Foo::FOO1.to_yaml) end end