class DomainEvents
def initialize
@subscribers = Hash.new { |h, k| h[k] = [] }
end
def subscribe(name, &block)
@subscribers[name] << block
end
def publish(name, payload)
@subscribers[name].each { |sub| sub.call(payload) }
end
end
class Registrations::Create
def initialize(events: Rails.configuration.domain_events)
@events = events
end
def call(params)
member = Member.create!(params)
@events.publish('member.created', member_id: member.id)
member
end
end
Callback chains become spooky action at a distance. A simple in-app event bus keeps side effects explicit and testable. This isn’t about Kafka—it’s about clarity and seams.