require "active_support/callbacks" module ActionMailbox module Callbacks extend ActiveSupport::Concern include ActiveSupport::Callbacks TERMINATOR = ->(mailbox, chain) do chain.call mailbox.finished_processing? end included do define_callbacks :process, terminator: TERMINATOR, skip_after_callbacks_if_terminated: true end module ClassMethods def before_processing(*methods, &block) set_callback(:process, :before, *methods, &block) end def after_processing(*methods, &block) set_callback(:process, :after, *methods, &block) end def around_processing(*methods, &block) set_callback(:process, :around, *methods, &block) end end end end