Skip to main content

mixins_with_callbacks

⚙️ Implementing Callbacks in Mixins

Create callback hooks inside modules so including classes can register methods to run at specific points. This pattern is common in ORMs and event-driven architectures.

module Callbacks
def self.included(base)
base.extend ClassMethods
end

module ClassMethods
def before(action, method)
@callbacks ||= {}
@callbacks[action] ||= []
@callbacks[action] << method
end

def run_callbacks(action, *args)
(@callbacks[action] || []).each { |m| send(m, *args) }
end
end

def run(action)
self.class.run_callbacks(action, self)
end
end

class Job
include Callbacks
before :run, :setup

def setup(job)
puts "Setup \\#{job.class}"
end
end