module MongoMapper module Plugins if defined?(ActiveModel) # Rails 3 stuff module Callbacks def self.configure(model) model.class_eval do extend ActiveModel::Callbacks define_model_callbacks :create, :save, :update, :destroy, :validation, :validation_on_create, :validation_on_update end end module InstanceMethods def valid? action = new? ? 'create' : 'update' result = nil _run_validation_callbacks do self.send("_run_validation_on_#{action}_callbacks") do result = super end end result end def destroy result = nil _run_destroy_callbacks do result = super end result end private def create_or_update(*args) result = nil _run_save_callbacks do result = super end result end def create(*args) result = nil _run_create_callbacks do result = super end result end def update(*args) result = nil _run_update_callbacks do result = super end result end end end else module Callbacks def self.configure(model) model.class_eval do include ActiveSupport::Callbacks define_callbacks( :before_save, :after_save, :before_create, :after_create, :before_update, :after_update, :before_validation, :after_validation, :before_validation_on_create, :after_validation_on_create, :before_validation_on_update, :after_validation_on_update, :before_destroy, :after_destroy ) end end module InstanceMethods def valid? action = new? ? 'create' : 'update' run_callbacks(:before_validation) run_callbacks("before_validation_on_#{action}".to_sym) result = super run_callbacks("after_validation_on_#{action}".to_sym) run_callbacks(:after_validation) result end def destroy run_callbacks(:before_destroy) result = super run_callbacks(:after_destroy) result end private def create_or_update(*args) run_callbacks(:before_save) if result = super run_callbacks(:after_save) end result end def create(*args) run_callbacks(:before_create) result = super run_callbacks(:after_create) result end def update(*args) run_callbacks(:before_update) result = super run_callbacks(:after_update) result end end end end end end