# File lib/after_commit/active_record.rb, line 3
    def self.included(base)
      base.class_eval do
        class << self
          def establish_connection_with_after_commit(spec = nil)
            result = establish_connection_without_after_commit spec
            include_after_commit_extensions
            result
          end
          alias_method_chain :establish_connection, :after_commit
          
          def include_after_commit_extensions
            base = ::ActiveRecord::ConnectionAdapters::AbstractAdapter
            Object.subclasses_of(base).each do |klass|
              include_after_commit_extension klass
            end
            
            if defined?(JRUBY_VERSION) and defined?(JdbcSpec::MySQL)
              include_after_commit_extension JdbcSpec::MySQL
            end
          end
          
          private
          
          def include_after_commit_extension(adapter)
            additions = AfterCommit::ConnectionAdapters
            unless adapter.included_modules.include?(additions)
              adapter.send :include, additions
            end
          end
        end
        
        define_callbacks  :after_commit,
                          :after_commit_on_create,
                          :after_commit_on_update,
                          :after_commit_on_save,
                          :after_commit_on_destroy,
                          :after_rollback,
                          :before_commit,
                          :before_commit_on_create,
                          :before_commit_on_update,
                          :before_commit_on_save,
                          :before_commit_on_destroy,
                          :before_rollback
        
        after_create  :add_committed_record_on_create
        after_update  :add_committed_record_on_update
        after_save    :add_committed_record_on_save
        after_destroy :add_committed_record_on_destroy
        
        def add_committed_record
          if have_callback? :before_commit, :after_commit, :before_rollback, :after_rollback
            AfterCommit.record(self.class.connection, self)
          end
        end
        
        def add_committed_record_on_create
          add_committed_record
          if have_callback? :before_commit_on_create, :after_commit_on_create
            AfterCommit.record_created(self.class.connection, self)
          end
        end
        
        def add_committed_record_on_update
          add_committed_record
          if have_callback? :before_commit_on_update, :after_commit_on_update
            AfterCommit.record_updated(self.class.connection, self)
          end
        end
        
        def add_committed_record_on_save
          if have_callback? :before_commit_on_save, :after_commit_on_save
            AfterCommit.record_saved(self.class.connection, self)
          end
        end
        
        def add_committed_record_on_destroy
          add_committed_record
          if have_callback? :before_commit_on_destroy, :after_commit_on_destroy
            AfterCommit.record_destroyed(self.class.connection, self)
          end
        end
      end
    end