# File lib/after_commit/after_savepoint.rb, line 35
    def self.included(base)
      base.class_eval do
        def release_savepoint_with_callback
          increment_transaction_pointer
          committed = false
          begin
            trigger_before_commit_callbacks
            trigger_before_commit_on_create_callbacks
            trigger_before_commit_on_save_callbacks
            trigger_before_commit_on_update_callbacks
            trigger_before_commit_on_destroy_callbacks
            
            release_savepoint_without_callback
            committed = true
            
            trigger_after_commit_callbacks
            trigger_after_commit_on_create_callbacks
            trigger_after_commit_on_save_callbacks
            trigger_after_commit_on_update_callbacks
            trigger_after_commit_on_destroy_callbacks
          rescue
            unless committed
              decrement_transaction_pointer
              rollback_to_savepoint
              increment_transaction_pointer
            end
          ensure
            AfterCommit.cleanup(self)
            decrement_transaction_pointer
          end
        end 
        alias_method_chain :release_savepoint, :callback

        # In the event the transaction fails and rolls back, nothing inside
        # should recieve the after_commit callback, but do fire the after_rollback
        # callback for each record that failed to be committed.
        def rollback_to_savepoint_with_callback
          increment_transaction_pointer
          begin
            trigger_before_rollback_callbacks
            rollback_to_savepoint_without_callback
            trigger_after_rollback_callbacks
          ensure
            AfterCommit.cleanup(self)
          end
          decrement_transaction_pointer
        end
        alias_method_chain :rollback_to_savepoint, :callback
      end
    end