Skip to main content

dynamic_callbacks

⏰ Building a Callback System

Implement custom callbacks to hook into your object’s lifecycle. Use metaprogramming to register and trigger callback methods dynamically.

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

module ClassMethods
def define_callback(name)
@callbacks ||= {}
@callbacks[name] = []

define_method("on_#{name}") do |&block|
self.class.instance_variable_get(:@callbacks)[name] << block
end
end

def callbacks
@callbacks || {}
end
end

def trigger(name)
self.class.callbacks[name].each { |cb| cb.call(self) }
end
end

class Task
include Callbackable
define_callback :start

on_start { |task| puts "Task started: \\#{task}" }

def run
trigger(:start)
end
end

Task.new.run # => "Task started: #<Task:0x...>"