<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -29,7 +29,7 @@ u.save
 
 # get value
 u.role				# :customer
-u.role_before_type_case		# 0
+u.role_before_type_cast		# 0
 
 # set value
 u.role = :user
@@ -50,3 +50,34 @@ User::ROLE			# [:customer, :admin]
 
 # in a controller
 u = User.new(params[:customer])
+
+
+History 
+=======
+
+Version 0.3 
+-----------
+    2008.09.04 
+    Applied patches from Hongli Lia(www.phusion.nl)
+
+    - Fixed a type in Readme 
+
+    - The singleton enum value getter method (e.g. &quot;Car.status(:broken)   =&gt;  1&quot;) is now defined on the metaclass instead of on 'SomeModel.class'. This is because 'SomeModel.class' always returns 'Class', so you actually ended up defining this singleton method on every class in the system.
+
+    - The value assignment method (e.g. &quot;@car.status = ...&quot;) can now also accept numbers (e.g. 123) and number strings (e.g. &quot;123&quot;). This allows one to call &quot;Car.new(:car =&gt; { :broken =&gt; '1' })&quot; (There was a similiar patch also from Georg Ledermann long before.)
+
+    - Unit tests have been added. (Wow! Big applause to Hongli Lai)
+
+Version 0.2 
+-----------
+    2007.12.28 
+    Applied patches from Norman Clarke and Georg Ledermann 
+
+    - accpet nil as input
+	user.role = nil
+
+Version 0.1 
+-----------
+    Someday in 2007 
+    First Release
+</diff>
      <filename>README</filename>
    </modified>
    <modified>
      <diff>@@ -25,7 +25,10 @@ module EnumFu
         # define a singleton method which get the enum value
         # example: Car.status(:broken)   =&gt;  1
         p1 =  Proc.new { |v| self.const_get(const_name).index(v) }
-        self.class.send(:define_method, name, p1)
+        metaclass = class &lt;&lt; self
+          self
+        end
+        metaclass.send(:define_method, name, p1)
 
         # define an instance get/set methods  which get/set  the enum value
         # example: 
@@ -43,12 +46,19 @@ module EnumFu
         }
         define_method name.to_sym, p2
 
-        p3 =  Proc.new { |sym|
+        p3 =  Proc.new { |value|
           # Before patch (Do not allow nil value)
           #write_attribute name.to_s, self.class.const_get(const_name).index(sym.to_sym)
           
           # After patch by Georg Ledermann (Now it's possible to set as null Ex: c.status = nil )
-          write_attribute name.to_s, (sym.blank? ? nil : self.class.const_get(const_name).index(sym.to_sym))
+          if value.blank?
+            casted_value = nil
+          elsif (value.is_a?(String) &amp;&amp; value =~ /\A\d+\Z/) || value.is_a?(Integer)
+            casted_value = value.to_i
+          else
+            casted_value = self.class.const_get(const_name).index(value.to_sym)
+          end
+          write_attribute name.to_s, casted_value
         }
         define_method name.to_s+'=', p3
       end</diff>
      <filename>lib/enum_fu.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,8 +1,64 @@
 require 'test/unit'
+require 'rubygems'
+gem 'rails', '&gt;= 1.2.6'
+require 'active_support'
+require File.dirname(__FILE__) + '/../lib/enum_fu'
+
+class Vehicle
+  include EnumFu
+  acts_as_enum :vehicle_type, [:car, :bus, :starship, :unknown]
+  
+  def initialize
+    @attributes = {}
+  end
+  
+  def read_attribute(name)
+    @attributes[name]
+  end
+  
+  def write_attribute(name, value)
+    @attributes[name] = value
+  end
+end
 
 class EnumFuTest &lt; Test::Unit::TestCase
-  # Replace this with your real tests.
-  def test_this_plugin
-    flunk
+  def setup
+    @vehicle = Vehicle.new
+  end
+  
+  def test_initially_nil
+    assert_nil @vehicle.vehicle_type
+  end
+  
+  def test_symbol_assignments
+    @vehicle.vehicle_type = :starship
+    assert_equal :starship, @vehicle.vehicle_type
+    assert_equal 2, @vehicle.read_attribute('vehicle_type')
+  end
+  
+  def test_string_value_assignments
+    @vehicle.vehicle_type = 'starship'
+    assert_equal :starship, @vehicle.vehicle_type
+    assert_equal 2, @vehicle.read_attribute('vehicle_type')
+  end
+  
+  def test_string_number_assignments
+    @vehicle.vehicle_type = '2'
+    assert_equal :starship, @vehicle.vehicle_type
+    assert_equal 2, @vehicle.read_attribute('vehicle_type')
+  end
+  
+  def test_integer_assignments
+    @vehicle.vehicle_type = 2
+    assert_equal :starship, @vehicle.vehicle_type
+    assert_equal 2, @vehicle.read_attribute('vehicle_type')
+  end
+  
+  def test_casting_symbol_to_integer
+    assert_equal 0, Vehicle.vehicle_type(:car)
+    assert_equal 1, Vehicle.vehicle_type(:bus)
+    assert_equal 2, Vehicle.vehicle_type(:starship)
+    assert_equal 3, Vehicle.vehicle_type(:unknown)
+    assert_nil Vehicle.vehicle_type(:invalid)
   end
 end</diff>
      <filename>test/enum_fu_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>6a5701abf63dcc079d7b8239a448de8cd374aa25</id>
    </parent>
  </parents>
  <author>
    <name>ikspres</name>
    <email>mail@ikspres.com</email>
  </author>
  <url>http://github.com/ikspres/enum_fu/commit/8334af64e6a9adc192ebca8399b82511dd5d10f9</url>
  <id>8334af64e6a9adc192ebca8399b82511dd5d10f9</id>
  <committed-date>2008-09-04T05:58:52-07:00</committed-date>
  <authored-date>2008-09-04T05:58:52-07:00</authored-date>
  <message>applied patch from Hongli Lai(phusion.nl)</message>
  <tree>21a5797b25cba572be164006f0cc9b8a03e70f40</tree>
  <committer>
    <name>ikspres</name>
    <email>mail@ikspres.com</email>
  </committer>
</commit>
