Skip to content

Instantly share code, notes, and snippets.

@onteria
Created July 24, 2011 14:08
Show Gist options
  • Save onteria/1102653 to your computer and use it in GitHub Desktop.
Save onteria/1102653 to your computer and use it in GitHub Desktop.
Ruby publisher/subscriber event model
module EventPublisher
attr_reader :events
attr_reader :subscribers
def register_events(events)
@subscribers = {}
@events = events
end
def publish_event(event)
@subscribers[event].each do | subscriber |
subscriber.call event
end
end
def event_subscribe(event_name, event_handler)
@subscribers[event_name] = [] if !@subscribers[event_name]
@subscribers[event_name] << event_handler
end
def event_unsubscribe(event_name, event_handler)
@subscribers[event_name].delete_if { |handler| handler == event_handler }
end
end
class MyEventPublisher
include EventPublisher
def initialize()
register_events :my_custom_event
end
def my_custom_event()
publish_event :my_custom_event
end
end
class MyEventSubscriber
def handle_event(event)
puts "Handled #{event}"
end
end
class MyOtherEventSubscriber
def handle_event(event)
puts "Also handled #{event}"
end
end
publisher = MyEventPublisher.new
subscriber = MyEventSubscriber.new
subscriber2 = MyOtherEventSubscriber.new
publisher.event_subscribe :my_custom_event, subscriber.method(:handle_event)
publisher.event_subscribe :my_custom_event, subscriber2.method(:handle_event)
publisher.my_custom_event
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment