def to_xml_document(opts={}, doc = nil)
xml = XML.serializer
doc ||= xml.new_document
default_xml_element_name = lambda {
DataMapper::Inflector.underscore(model.name).tr("/", "-")
}
root = xml.root_node(
doc,
(opts[:element_name] || default_xml_element_name[])
)
properties_to_serialize(opts).each do |property|
value = __send__(property.name)
attrs = {}
unless property.primitive == String
attrs['type'] = property.primitive.to_s.downcase
end
xml.add_node(root, property.name.to_s, value, attrs)
end
Array(opts[:methods]).each do |meth|
if self.respond_to?(meth)
xml_name = meth.to_s.gsub(/[^a-z0-9_]/, '')
value = __send__(meth)
unless value.nil?
if value.respond_to?(:to_xml_document)
xml.add_xml(root, value.to_xml_document)
else
xml.add_node(root, xml_name, value.to_s)
end
end
end
end
doc
end