<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -8,4 +8,5 @@ log
 log/*
 */log/*
 coverage
-.DS_Store
\ No newline at end of file
+.DS_Store
+*.pid
\ No newline at end of file</diff>
      <filename>.gitignore</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,5 @@
+require 'base64'
+
 class Hash
   class &lt;&lt; self
     # Converts valid XML into a Ruby Hash structure.
@@ -247,13 +249,34 @@ require 'rexml/light/node'
 # This represents the hard part of the work, all I did was change the
 # underlying parser.
 class REXMLUtilityNode # :nodoc:
-  attr_accessor :name, :attributes, :children
+  attr_accessor :name, :attributes, :children, :type
+  cattr_accessor :typecasts, :available_typecasts
+  
+  self.typecasts = {}
+  self.typecasts[&quot;integer&quot;]       = lambda{|v| v.nil? ? nil : v.to_i}
+  self.typecasts[&quot;boolean&quot;]       = lambda{|v| v.nil? ? nil : (v.strip != &quot;false&quot;)}
+  self.typecasts[&quot;datetime&quot;]      = lambda{|v| v.nil? ? nil : Time.parse(v).utc}
+  self.typecasts[&quot;date&quot;]          = lambda{|v| v.nil? ? nil : Date.parse(v)}
+  self.typecasts[&quot;dateTime&quot;]      = lambda{|v| v.nil? ? nil : Time.parse(v).utc}
+  self.typecasts[&quot;decimal&quot;]       = lambda{|v| BigDecimal(v)}
+  self.typecasts[&quot;double&quot;]        = lambda{|v| v.nil? ? nil : v.to_f}
+  self.typecasts[&quot;float&quot;]         = lambda{|v| v.nil? ? nil : v.to_f}
+  self.typecasts[&quot;symbol&quot;]        = lambda{|v| v.to_sym}
+  self.typecasts[&quot;string&quot;]        = lambda{|v| v.to_s}
+  self.typecasts[&quot;yaml&quot;]          = lambda{|v| v.nil? ? nil : YAML.load(v)}
+  self.typecasts[&quot;base64Binary&quot;]  = lambda{|v| Base64.decode64(v)}
+  
+  self.available_typecasts = self.typecasts.keys
 
   def initialize(name, attributes = {})
-    @name       = name.tr(&quot;-&quot;, &quot;_&quot;)
-    @attributes = undasherize_keys(attributes)
-    @children   = []
-    @text       = false
+    @name         = name.tr(&quot;-&quot;, &quot;_&quot;)
+    # leave the type alone if we don't know what it is
+    @type         = self.class.available_typecasts.include?(attributes[&quot;type&quot;]) ? attributes.delete(&quot;type&quot;) : attributes[&quot;type&quot;]
+    
+    @nil_element  = attributes.delete(&quot;nil&quot;) == &quot;true&quot;
+    @attributes   = undasherize_keys(attributes)
+    @children     = []
+    @text         = false
   end
 
   def add_node(node)
@@ -262,26 +285,52 @@ class REXMLUtilityNode # :nodoc:
   end
 
   def to_hash
+    if @type == &quot;file&quot;
+      f = StringIO.new(::Base64.decode64(@children.first || &quot;&quot;))  
+      class &lt;&lt; f
+        attr_accessor :original_filename, :content_type
+      end
+      f.original_filename = attributes['name'] || 'untitled'
+      f.content_type = attributes['content_type'] || 'application/octet-stream'
+      return {name =&gt; f}
+    end
+    
     if @text
       return { name =&gt; typecast_value( translate_xml_entities( inner_html ) ) }
     else
       #change repeating groups into an array
-      # group by the first key of each element of the array to find repeating groups
       groups = @children.inject({}) { |s,e| (s[e.name] ||= []) &lt;&lt; e; s }
       
-      hash = {}
-      groups.each do |key, values|
-        if values.size == 1
-          hash.merge! values.first
-        else
-          hash.merge! key =&gt; values.map { |element| element.to_hash[key] }
+      out = nil
+      if @type == &quot;array&quot;
+        out = []
+        groups.each do |k, v|
+          if v.size == 1
+            out &lt;&lt; v.first.to_hash.entries.first.last
+          else
+            out &lt;&lt; v.map{|e| e.to_hash[k]}
+          end
         end
+        out = out.flatten
+        
+      else # If Hash
+        out = {}
+        groups.each do |k,v|
+          if v.size == 1
+            out.merge!(v.first)
+          else
+            out.merge!( k =&gt; v.map{|e| e.to_hash[k]})
+          end
+        end
+        out.merge! attributes unless attributes.empty?
+        out = out.empty? ? nil : out
+      end
+
+      if @type &amp;&amp; out.nil?
+        { name =&gt; typecast_value(out) }
+      else
+        { name =&gt; out }
       end
-      
-      # merge the arrays, including attributes
-      hash.merge! attributes unless attributes.empty?
-      
-      { name =&gt; hash }
     end
   end
 
@@ -311,15 +360,9 @@ class REXMLUtilityNode # :nodoc:
   # If +self+ does not have a &quot;type&quot; key, or if it's not one of the
   # options specified above, the raw +value+ will be returned.
   def typecast_value(value)
-    return value unless attributes[&quot;type&quot;]
-    
-    case attributes[&quot;type&quot;]
-      when &quot;integer&quot;  then value.to_i
-      when &quot;boolean&quot;  then value.strip == &quot;true&quot;
-      when &quot;datetime&quot; then ::Time.parse(value).utc
-      when &quot;date&quot;     then ::Date.parse(value)
-      else                 value
-    end
+    return value unless @type
+    proc = self.class.typecasts[@type]
+    proc.nil? ? value : proc.call(value)
   end
 
   # Convert basic XML entities into their literal values.
@@ -357,7 +400,8 @@ class REXMLUtilityNode # :nodoc:
   # ==== Returns
   # String:: The HTML node in text form.
   def to_html
-    &quot;&lt;#{name}#{attributes.to_xml_attributes}&gt;#{inner_html}&lt;/#{name}&gt;&quot;
+    attributes.merge!(:type =&gt; @type ) if @type
+    &quot;&lt;#{name}#{attributes.to_xml_attributes}&gt;#{@nil_element ? '' : inner_html}&lt;/#{name}&gt;&quot;
   end
 
   # ==== Alias</diff>
      <filename>lib/merb-core/core_ext/hash.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,6 @@
 require File.dirname(__FILE__) + '/../../spec_helper'
 require &quot;date&quot;
+require 'bigdecimal'
 
 describe Hash, &quot;environmentize_keys!&quot; do
   it &quot;should transform keys to uppercase text&quot; do
@@ -145,7 +146,7 @@ describe Hash, &quot;from_xml&quot; do
   end
   
   it &quot;should typecast a false boolean&quot; do
-    [&quot;false&quot;, &quot;1&quot;, &quot;0&quot;, &quot;some word&quot; ].each do |w|
+    [&quot;false&quot;].each do |w|
       Hash.from_xml(&quot;&lt;tag type='boolean'&gt;#{w}&lt;/tag&gt;&quot;)['tag'].should be_false
     end
   end
@@ -234,6 +235,277 @@ describe Hash, &quot;from_xml&quot; do
     
     Hash.from_xml(xml).should == hash
   end
+  
+  it &quot;should properly handle nil values (ActiveSupport Compatible)&quot; do
+    topic_xml = &lt;&lt;-EOT
+      &lt;topic&gt;
+        &lt;title&gt;&lt;/title&gt;
+        &lt;id type=&quot;integer&quot;&gt;&lt;/id&gt;
+        &lt;approved type=&quot;boolean&quot;&gt;&lt;/approved&gt;
+        &lt;written-on type=&quot;date&quot;&gt;&lt;/written-on&gt;
+        &lt;viewed-at type=&quot;datetime&quot;&gt;&lt;/viewed-at&gt;
+        &lt;content type=&quot;yaml&quot;&gt;&lt;/content&gt;
+        &lt;parent-id&gt;&lt;/parent-id&gt;
+      &lt;/topic&gt;
+    EOT
+
+    expected_topic_hash = {
+      'title'      =&gt; nil, 
+      'id'         =&gt; nil,
+      'approved'   =&gt; nil,
+      'written_on' =&gt; nil,
+      'viewed_at'  =&gt; nil,
+      'content'    =&gt; nil, 
+      'parent_id'  =&gt; nil
+    }
+    Hash.from_xml(topic_xml)[&quot;topic&quot;].should == expected_topic_hash 
+  end
+
+  it &quot;should handle a single record from xml (ActiveSupport Compatible)&quot; do
+    topic_xml = &lt;&lt;-EOT
+      &lt;topic&gt;
+        &lt;title&gt;The First Topic&lt;/title&gt;
+        &lt;author-name&gt;David&lt;/author-name&gt;
+        &lt;id type=&quot;integer&quot;&gt;1&lt;/id&gt;
+        &lt;approved type=&quot;boolean&quot;&gt; true &lt;/approved&gt;
+        &lt;replies-count type=&quot;integer&quot;&gt;0&lt;/replies-count&gt;
+        &lt;replies-close-in type=&quot;integer&quot;&gt;2592000000&lt;/replies-close-in&gt;
+        &lt;written-on type=&quot;date&quot;&gt;2003-07-16&lt;/written-on&gt;
+        &lt;viewed-at type=&quot;datetime&quot;&gt;2003-07-16T09:28:00+0000&lt;/viewed-at&gt;
+        &lt;content type=&quot;yaml&quot;&gt;--- \n1: should be an integer\n:message: Have a nice day\narray: \n- should-have-dashes: true\n  should_have_underscores: true\n&lt;/content&gt;
+        &lt;author-email-address&gt;david@loudthinking.com&lt;/author-email-address&gt;
+        &lt;parent-id&gt;&lt;/parent-id&gt;
+        &lt;ad-revenue type=&quot;decimal&quot;&gt;1.5&lt;/ad-revenue&gt;
+        &lt;optimum-viewing-angle type=&quot;float&quot;&gt;135&lt;/optimum-viewing-angle&gt;
+        &lt;resident type=&quot;symbol&quot;&gt;yes&lt;/resident&gt;
+      &lt;/topic&gt;
+    EOT
+
+    expected_topic_hash = {
+      'title' =&gt; &quot;The First Topic&quot;,
+      'author_name' =&gt; &quot;David&quot;,
+      'id' =&gt; 1,
+      'approved' =&gt; true,
+      'replies_count' =&gt; 0,
+      'replies_close_in' =&gt; 2592000000,
+      'written_on' =&gt; Date.new(2003, 7, 16),
+      'viewed_at' =&gt; Time.utc(2003, 7, 16, 9, 28),
+      # Changed this line where the key is :message.  The yaml specifies this as a symbol, and who am I to change what you specify
+      # The line in ActiveSupport is
+      # 'content' =&gt; { 'message' =&gt; &quot;Have a nice day&quot;, 1 =&gt; &quot;should be an integer&quot;, &quot;array&quot; =&gt; [{ &quot;should-have-dashes&quot; =&gt; true, &quot;should_have_underscores&quot; =&gt; true }] },
+      'content' =&gt; { :message =&gt; &quot;Have a nice day&quot;, 1 =&gt; &quot;should be an integer&quot;, &quot;array&quot; =&gt; [{ &quot;should-have-dashes&quot; =&gt; true, &quot;should_have_underscores&quot; =&gt; true }] },
+      'author_email_address' =&gt; &quot;david@loudthinking.com&quot;,
+      'parent_id' =&gt; nil,
+      'ad_revenue' =&gt; BigDecimal(&quot;1.50&quot;),
+      'optimum_viewing_angle' =&gt; 135.0,
+      'resident' =&gt; :yes
+    }
+
+    Hash.from_xml(topic_xml)[&quot;topic&quot;].each do |k,v|
+      v.should == expected_topic_hash[k]
+    end
+  end
+
+  it &quot;should handle multiple records (ActiveSupport Compatible)&quot; do
+    topics_xml = &lt;&lt;-EOT
+      &lt;topics type=&quot;array&quot;&gt;
+        &lt;topic&gt;
+          &lt;title&gt;The First Topic&lt;/title&gt;
+          &lt;author-name&gt;David&lt;/author-name&gt;
+          &lt;id type=&quot;integer&quot;&gt;1&lt;/id&gt;
+          &lt;approved type=&quot;boolean&quot;&gt;false&lt;/approved&gt;
+          &lt;replies-count type=&quot;integer&quot;&gt;0&lt;/replies-count&gt;
+          &lt;replies-close-in type=&quot;integer&quot;&gt;2592000000&lt;/replies-close-in&gt;
+          &lt;written-on type=&quot;date&quot;&gt;2003-07-16&lt;/written-on&gt;
+          &lt;viewed-at type=&quot;datetime&quot;&gt;2003-07-16T09:28:00+0000&lt;/viewed-at&gt;
+          &lt;content&gt;Have a nice day&lt;/content&gt;
+          &lt;author-email-address&gt;david@loudthinking.com&lt;/author-email-address&gt;
+          &lt;parent-id nil=&quot;true&quot;&gt;&lt;/parent-id&gt;
+        &lt;/topic&gt;
+        &lt;topic&gt;
+          &lt;title&gt;The Second Topic&lt;/title&gt;
+          &lt;author-name&gt;Jason&lt;/author-name&gt;
+          &lt;id type=&quot;integer&quot;&gt;1&lt;/id&gt;
+          &lt;approved type=&quot;boolean&quot;&gt;false&lt;/approved&gt;
+          &lt;replies-count type=&quot;integer&quot;&gt;0&lt;/replies-count&gt;
+          &lt;replies-close-in type=&quot;integer&quot;&gt;2592000000&lt;/replies-close-in&gt;
+          &lt;written-on type=&quot;date&quot;&gt;2003-07-16&lt;/written-on&gt;
+          &lt;viewed-at type=&quot;datetime&quot;&gt;2003-07-16T09:28:00+0000&lt;/viewed-at&gt;
+          &lt;content&gt;Have a nice day&lt;/content&gt;
+          &lt;author-email-address&gt;david@loudthinking.com&lt;/author-email-address&gt;
+          &lt;parent-id&gt;&lt;/parent-id&gt;
+        &lt;/topic&gt;
+      &lt;/topics&gt;
+    EOT
+
+    expected_topic_hash = {
+      'title' =&gt; &quot;The First Topic&quot;,
+      'author_name' =&gt; &quot;David&quot;,
+      'id' =&gt; 1,
+      'approved' =&gt; false,
+      'replies_count' =&gt; 0,
+      'replies_close_in' =&gt; 2592000000,
+      'written_on' =&gt; Date.new(2003, 7, 16),
+      'viewed_at' =&gt; Time.utc(2003, 7, 16, 9, 28),
+      'content' =&gt; &quot;Have a nice day&quot;,
+      'author_email_address' =&gt; &quot;david@loudthinking.com&quot;,
+      'parent_id' =&gt; nil
+    }
+    # puts Hash.from_xml(topics_xml)['topics'].first.inspect
+    Hash.from_xml(topics_xml)[&quot;topics&quot;].first.each do |k,v|
+      v.should == expected_topic_hash[k]
+    end
+  end
+
+  it &quot;should handle a single record from_xml with attributes other than type (ActiveSupport Compatible)&quot; do
+    topic_xml = &lt;&lt;-EOT
+    &lt;rsp stat=&quot;ok&quot;&gt;
+      &lt;photos page=&quot;1&quot; pages=&quot;1&quot; perpage=&quot;100&quot; total=&quot;16&quot;&gt;
+        &lt;photo id=&quot;175756086&quot; owner=&quot;55569174@N00&quot; secret=&quot;0279bf37a1&quot; server=&quot;76&quot; title=&quot;Colored Pencil PhotoBooth Fun&quot; ispublic=&quot;1&quot; isfriend=&quot;0&quot; isfamily=&quot;0&quot;/&gt;
+      &lt;/photos&gt;
+    &lt;/rsp&gt;
+    EOT
+
+    expected_topic_hash = {
+      'id' =&gt; &quot;175756086&quot;,
+      'owner' =&gt; &quot;55569174@N00&quot;,
+      'secret' =&gt; &quot;0279bf37a1&quot;,
+      'server' =&gt; &quot;76&quot;,
+      'title' =&gt; &quot;Colored Pencil PhotoBooth Fun&quot;,
+      'ispublic' =&gt; &quot;1&quot;,
+      'isfriend' =&gt; &quot;0&quot;,
+      'isfamily' =&gt; &quot;0&quot;,
+    }
+    Hash.from_xml(topic_xml)[&quot;rsp&quot;][&quot;photos&quot;][&quot;photo&quot;].each do |k,v|
+      v.should == expected_topic_hash[k]
+    end
+  end
+  
+  it &quot;should handle an emtpy array (ActiveSupport Compatible)&quot; do
+    blog_xml = &lt;&lt;-XML
+      &lt;blog&gt;
+        &lt;posts type=&quot;array&quot;&gt;&lt;/posts&gt;
+      &lt;/blog&gt;
+    XML
+    expected_blog_hash = {&quot;blog&quot; =&gt; {&quot;posts&quot; =&gt; []}}
+    Hash.from_xml(blog_xml).should == expected_blog_hash
+  end
+
+  it &quot;should handle empty array with whitespace from xml (ActiveSupport Compatible)&quot; do
+    blog_xml = &lt;&lt;-XML
+      &lt;blog&gt;
+        &lt;posts type=&quot;array&quot;&gt;
+        &lt;/posts&gt;
+      &lt;/blog&gt;
+    XML
+    expected_blog_hash = {&quot;blog&quot; =&gt; {&quot;posts&quot; =&gt; []}}
+    Hash.from_xml(blog_xml).should == expected_blog_hash
+  end
+
+  it &quot;should handle array with one entry from_xml (ActiveSupport Compatible)&quot; do
+    blog_xml = &lt;&lt;-XML
+      &lt;blog&gt;
+        &lt;posts type=&quot;array&quot;&gt;
+          &lt;post&gt;a post&lt;/post&gt;
+        &lt;/posts&gt;
+      &lt;/blog&gt;
+    XML
+    expected_blog_hash = {&quot;blog&quot; =&gt; {&quot;posts&quot; =&gt; [&quot;a post&quot;]}}
+    Hash.from_xml(blog_xml).should == expected_blog_hash
+  end
+
+  it &quot;should handle array with multiple entries from xml (ActiveSupport Compatible)&quot; do
+    blog_xml = &lt;&lt;-XML
+      &lt;blog&gt;
+        &lt;posts type=&quot;array&quot;&gt;
+          &lt;post&gt;a post&lt;/post&gt;
+          &lt;post&gt;another post&lt;/post&gt;
+        &lt;/posts&gt;
+      &lt;/blog&gt;
+    XML
+    expected_blog_hash = {&quot;blog&quot; =&gt; {&quot;posts&quot; =&gt; [&quot;a post&quot;, &quot;another post&quot;]}}
+    Hash.from_xml(blog_xml).should == expected_blog_hash    
+  end
+
+  it &quot;should handle file types (ActiveSupport Compatible)&quot; do
+    blog_xml = &lt;&lt;-XML
+      &lt;blog&gt;
+        &lt;logo type=&quot;file&quot; name=&quot;logo.png&quot; content_type=&quot;image/png&quot;&gt;
+        &lt;/logo&gt;
+      &lt;/blog&gt;
+    XML
+    hash = Hash.from_xml(blog_xml)
+    hash.should have_key('blog')
+    hash['blog'].should have_key('logo')
+    
+    file = hash['blog']['logo']
+    file.original_filename.should == 'logo.png'
+    file.content_type.should == 'image/png'  
+  end
+
+  it &quot;should handle file from xml with defaults (ActiveSupport Compatible)&quot; do
+    blog_xml = &lt;&lt;-XML
+      &lt;blog&gt;
+        &lt;logo type=&quot;file&quot;&gt;
+        &lt;/logo&gt;
+      &lt;/blog&gt;
+    XML
+    file = Hash.from_xml(blog_xml)['blog']['logo']
+    file.original_filename.should == 'untitled'
+    file.content_type.should == 'application/octet-stream'   
+  end
+
+  it &quot;should handle xsd like types from xml (ActiveSupport Compatible)&quot; do
+    bacon_xml = &lt;&lt;-EOT
+    &lt;bacon&gt;
+      &lt;weight type=&quot;double&quot;&gt;0.5&lt;/weight&gt;
+      &lt;price type=&quot;decimal&quot;&gt;12.50&lt;/price&gt;
+      &lt;chunky type=&quot;boolean&quot;&gt; 1 &lt;/chunky&gt;
+      &lt;expires-at type=&quot;dateTime&quot;&gt;2007-12-25T12:34:56+0000&lt;/expires-at&gt;
+      &lt;notes type=&quot;string&quot;&gt;&lt;/notes&gt;
+      &lt;illustration type=&quot;base64Binary&quot;&gt;YmFiZS5wbmc=&lt;/illustration&gt;
+    &lt;/bacon&gt;
+    EOT
+
+    expected_bacon_hash = {
+      'weight' =&gt; 0.5,
+      'chunky' =&gt; true,
+      'price' =&gt; BigDecimal(&quot;12.50&quot;),
+      'expires_at' =&gt; Time.utc(2007,12,25,12,34,56),
+      'notes' =&gt; &quot;&quot;,
+      'illustration' =&gt; &quot;babe.png&quot;
+    }
+
+    Hash.from_xml(bacon_xml)[&quot;bacon&quot;].should == expected_bacon_hash
+  end
+
+  it &quot;should let type trickle through when unknown (ActiveSupport Compatible)&quot; do
+    product_xml = &lt;&lt;-EOT
+    &lt;product&gt;
+      &lt;weight type=&quot;double&quot;&gt;0.5&lt;/weight&gt;
+      &lt;image type=&quot;ProductImage&quot;&gt;&lt;filename&gt;image.gif&lt;/filename&gt;&lt;/image&gt;
+      
+    &lt;/product&gt;
+    EOT
+
+    expected_product_hash = {
+      'weight' =&gt; 0.5,
+      'image' =&gt; {'type' =&gt; 'ProductImage', 'filename' =&gt; 'image.gif' },
+    }
+    
+    Hash.from_xml(product_xml)[&quot;product&quot;].should == expected_product_hash
+  end
+
+  it &quot;should handle unescaping from xml (ActiveResource Compatible)&quot; do
+    xml_string = '&lt;person&gt;&lt;bare-string&gt;First &amp;amp; Last Name&lt;/bare-string&gt;&lt;pre-escaped-string&gt;First &amp;amp;amp; Last Name&lt;/pre-escaped-string&gt;&lt;/person&gt;'
+    expected_hash = { 
+      'bare_string'        =&gt; 'First &amp; Last Name', 
+      'pre_escaped_string' =&gt; 'First &amp;amp; Last Name'
+    }
+    
+    Hash.from_xml(xml_string)['person'].should == expected_hash  
+  end
+
 end
 
 describe Hash, 'to_params' do</diff>
      <filename>spec/private/core_ext/hash_spec.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>d4e533e96774982ff117c82bc209e1245be64a49</id>
    </parent>
  </parents>
  <author>
    <name>Daniel Neighman</name>
    <email>has.sox@gmail.com</email>
  </author>
  <url>http://github.com/wycats/merb-core/commit/2368f8f95e17f236ce50abdf77b83d7db587abd4</url>
  <id>2368f8f95e17f236ce50abdf77b83d7db587abd4</id>
  <committed-date>2008-03-06T05:03:45-08:00</committed-date>
  <authored-date>2008-03-06T05:03:45-08:00</authored-date>
  <message>Adds specs and changes for compatibility with ActiveSupport.  There is one caveat.  It will not change YAML generated Hash keys to strings if they are defined as symbols as is currently the behaviour of ActiveSupport.

Closes #134

Squashed commit of the following:

commit 03b56a347cc331fdd3d5566bec1904732481e743
Author: Daniel Neighman &lt;has.sox@gmail.com&gt;
Date:   Thu Mar 6 23:52:43 2008 +1100

    Adds *.pid to the .gitignore file

commit 213c0792398b3c57965b766547e6d2882154185c
Author: Daniel Neighman &lt;has.sox@gmail.com&gt;
Date:   Thu Mar 6 23:51:25 2008 +1100

    Added all specs from ActiveSupport Hash#from_xml to Merb core_ext Hash#from_xml

commit f5e566a445f44be446ad63ab9e1d995dc46c0ae1
Author: Daniel Neighman &lt;has.sox@gmail.com&gt;
Date:   Thu Mar 6 23:38:31 2008 +1100

    Adds more active resource compatible specs

commit abc4c1fd3c97720091f8205f30c7929d8dd9db48
Author: Daniel Neighman &lt;has.sox@gmail.com&gt;
Date:   Thu Mar 6 22:35:51 2008 +1100

    Adds support for nil=&quot;true&quot; attribute

commit c3485f018979674d3ef326fb06da9e2d911c0792
Author: Daniel Neighman &lt;has.sox@gmail.com&gt;
Date:   Thu Mar 6 22:12:11 2008 +1100

    Adds some specs from ActiveSupport for from_xml

commit da7afbf04c4ff3c1ad3fbabcae1c49980eed06c3
Author: Daniel Neighman &lt;has.sox@gmail.com&gt;
Date:   Thu Mar 6 20:54:41 2008 +1100

    Fixes nil values</message>
  <tree>424ab87f320a0374bf0ae141c112056992cb7bf3</tree>
  <committer>
    <name>Daniel Neighman</name>
    <email>has.sox@gmail.com</email>
  </committer>
</commit>
