lib/happymapper.rb in happymapper-0.3.1 vs lib/happymapper.rb in happymapper-0.3.2

- old
+ new

@@ -11,38 +11,51 @@ def self.included(base) base.instance_variable_set("@attributes", {}) base.instance_variable_set("@elements", {}) base.extend ClassMethods end - + module ClassMethods def attribute(name, type, options={}) attribute = Attribute.new(name, type, options) @attributes[to_s] ||= [] @attributes[to_s] << attribute attr_accessor attribute.method_name.intern end - + def attributes @attributes[to_s] || [] end - + def element(name, type, options={}) element = Element.new(name, type, options) @elements[to_s] ||= [] @elements[to_s] << element attr_accessor element.method_name.intern end - + + def content(name) + @content = name + attr_accessor name + end + + def after_parse_callbacks + @after_parse_callbacks ||= [] + end + + def after_parse(&block) + after_parse_callbacks.push(block) + end + def elements @elements[to_s] || [] end - + def has_one(name, type, options={}) element name, type, {:single => true}.merge(options) end - + def has_many(name, type, options={}) element name, type, {:single => false}.merge(options) end # Specify a namespace if a node and all its children are all namespaced @@ -54,15 +67,15 @@ end def tag(new_tag_name) @tag_name = new_tag_name.to_s end - + def tag_name @tag_name ||= to_s.split('::')[-1].downcase end - + def parse(xml, options = {}) if xml.is_a?(XML::Node) node = xml else if xml.is_a?(XML::Document) @@ -78,25 +91,29 @@ namespace = "#{DEFAULT_NS}:#{namespace}" if namespace xpath = root ? '/' : './/' xpath += "#{DEFAULT_NS}:" if namespace xpath += tag_name - + nodes = node.find(xpath, Array(namespace)) collection = nodes.collect do |n| obj = new - - attributes.each do |attr| - obj.send("#{attr.method_name}=", + + attributes.each do |attr| + obj.send("#{attr.method_name}=", attr.from_xml_node(n, namespace)) end - + elements.each do |elem| - obj.send("#{elem.method_name}=", + obj.send("#{elem.method_name}=", elem.from_xml_node(n, namespace)) end - + + obj.send("#{@content}=", n.content) if @content + + obj.class.after_parse_callbacks.each { |callback| callback.call(obj) } + obj end # per http://libxml.rubyforge.org/rdoc/classes/LibXML/XML/Document.html#M000354 nodes = nil @@ -110,6 +127,6 @@ end end require 'happymapper/item' require 'happymapper/attribute' -require 'happymapper/element' \ No newline at end of file +require 'happymapper/element'