<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -46,8 +46,16 @@ class ActiveForm &lt; ActiveRecord::Base
   end
   
   def save # :nodoc:
-    callback(:before_save)
-    callback(:after_save) if result = valid?
+    if result = valid?
+      callback(:before_save)
+      callback(:before_create)
+      
+      # do nothing!
+      
+      callback(:after_save)
+      callback(:after_create)
+    end
+    
     result
   end
   </diff>
      <filename>lib/active_form.rb</filename>
    </modified>
    <modified>
      <diff>@@ -63,44 +63,55 @@ class ActiveFormTest &lt; Test::Unit::TestCase
     end
   end
   
-  def test_after_and_before_save_callbacks_called_on_valid
+  CALLBACKS_CALLED_FOR_VALID = %w(before_validation after_validation before_validation_on_create after_validation_on_create before_save after_save before_create after_create)
+  CALLBACKS_NOT_CALLED_FOR_VALID = %w(before_validation_on_update after_validation_on_update)
+  CALLBACKS_FOR_VALID = CALLBACKS_CALLED_FOR_VALID + CALLBACKS_NOT_CALLED_FOR_VALID
+
+  def test_callbacks_called_on_valid
     self.class.class_eval %q{
       class WithCallbackSuccess &lt; ActiveForm
-        attr_accessor :before_save_called, :after_save_called
-        before_save do |obj|
-          obj.before_save_called = true
-        end
-        after_save do |obj|
-          obj.after_save_called = true
+        CALLBACKS_FOR_VALID.each do |callback|
+          attr_accessor &quot;#{callback}_called&quot;
+          send(callback){|obj| obj.send(&quot;#{callback}_called=&quot;, true)}
         end
       end
     }
     
     obj = WithCallbackSuccess.new
     assert obj.save
-    assert obj.before_save_called
-    assert obj.after_save_called
+    CALLBACKS_CALLED_FOR_VALID.each do |callback|
+      assert obj.send(&quot;#{callback}_called&quot;), &quot;expected #{callback} to be called&quot;
+    end
+    CALLBACKS_NOT_CALLED_FOR_VALID.each do |callback|
+      assert !obj.send(&quot;#{callback}_called&quot;), &quot;expected #{callback} not to be called&quot;
+    end
   end
 
-  def test_old_before_save_callback_called_on_invalid
+  CALLBACKS_CALLED_FOR_INVALID = %w(before_validation before_validation_on_create after_validation after_validation_on_create)
+  CALLBACKS_NOT_CALLED_FOR_INVALID = %w(before_validation_on_update after_validation_on_update before_save after_save before_create after_create)
+  CALLBACKS_FOR_INVALID = CALLBACKS_CALLED_FOR_INVALID + CALLBACKS_NOT_CALLED_FOR_INVALID
+
+  def test_callbacks_called_on_invalid
     self.class.class_eval %q{
       class WithCallbackFailure &lt; ActiveForm
-        column :required_field
-        validates_presence_of :required_field
-        attr_accessor :before_save_called, :after_save_called
-        before_save do |obj|
-          obj.before_save_called = true
-        end
-        after_save do |obj|
-          obj.after_save_called = true
+        column :required
+        validates_presence_of :required
+        
+        CALLBACKS_FOR_INVALID.each do |callback|
+          attr_accessor &quot;#{callback}_called&quot;
+          send(callback){|obj| obj.send(&quot;#{callback}_called=&quot;, true)}
         end
       end
     }
     
     obj = WithCallbackFailure.new
     assert !obj.save
-    assert obj.before_save_called
-    assert !obj.after_save_called
+    CALLBACKS_CALLED_FOR_INVALID.each do |callback|
+      assert obj.send(&quot;#{callback}_called&quot;), &quot;expected #{callback} to be called&quot;
+    end
+    CALLBACKS_NOT_CALLED_FOR_INVALID.each do |callback|
+      assert !obj.send(&quot;#{callback}_called&quot;), &quot;expected #{callback} not to be called&quot;
+    end
   end
 
   def test_create_bang_raises_no_exception_on_valid</diff>
      <filename>test/active_form_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>44de309bd667b7714c5bbf0863be9acc2b75277e</id>
    </parent>
  </parents>
  <author>
    <name>Remco van 't Veer</name>
    <email>rwvtveer@xs4all.nl</email>
  </author>
  <url>http://github.com/remvee/active_form/commit/510388877d098f6b0f7f305df756f6d9e1f132ec</url>
  <id>510388877d098f6b0f7f305df756f6d9e1f132ec</id>
  <committed-date>2009-10-30T07:03:49-07:00</committed-date>
  <authored-date>2009-10-30T07:03:49-07:00</authored-date>
  <message>properly handle create callbacks</message>
  <tree>33110d19eeb74841183088ebfe3ca4f38575605a</tree>
  <committer>
    <name>Remco van 't Veer</name>
    <email>rwvtveer@xs4all.nl</email>
  </committer>
</commit>
