I wrote simple gem named Inferno. It gives object the ability to bind and trigger custom named events. Events do not have to be declared before they are bound, and may take passed arguments.

Super simple example

events = Inferno::Event.new

notifications.on("hello.world", self) { |payload| puts "Received: #{payload}" }
notifications.trigger("hello.world")