Module: Emittable
- Defined in:
- lib/emittable.rb,
lib/emittable/error.rb
Defined Under Namespace
Classes: Error
Instance Method Summary collapse
- #initialize(*args) ⇒ Object
- #off(event_name, callback) ⇒ Object
-
#on(event_name, &callback) ⇒ Object
Register a handler for the given event name.
-
#trigger(event_name, *args) ⇒ Object
Trigger the given event name and passes all args to each handler for this event.
Instance Method Details
#initialize(*args) ⇒ Object
6 7 8 9 10 11 |
# File 'lib/emittable.rb', line 6 def initialize(*args) @emittable_setup = true @emittable_events = {} @emittable_mutex = Mutex.new super end |
#off(event_name, callback) ⇒ Object
31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/emittable.rb', line 31 def off(event_name, callback) check_emittable_setup raise ArgumentError, "event name must respond to 'to_s'" unless event_name.respond_to?(:to_s) event_name = event_name.to_s @emittable_mutex.synchronize do callbacks = @emittable_events[event_name] raise Error, 'no callbacks found for that event' unless callbacks raise Error, 'callback not found' unless callbacks.include?(callback) callbacks.delete(callback) @emittable_events.delete(event_name) if callbacks.empty? end nil end |
#on(event_name, &callback) ⇒ Object
Register a handler for the given event name.
obj.on(:foo) { puts "foo was called" }
19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/emittable.rb', line 19 def on(event_name, &callback) check_emittable_setup raise ArgumentError, "event name must respond to 'to_s'" unless event_name.respond_to?(:to_s) event_name = event_name.to_s @emittable_mutex.synchronize do @emittable_events[event_name] ||= [] callbacks = @emittable_events[event_name] callbacks << callback end nil end |
#trigger(event_name, *args) ⇒ Object
Trigger the given event name and passes all args to each handler for this event.
obj.trigger(:foo)
obj.trigger(:foo, 1, 2, 3)
52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/emittable.rb', line 52 def trigger(event_name, *args) check_emittable_setup raise ArgumentError, "event name must respond to 'to_s'" unless event_name.respond_to?(:to_s) event_name = event_name.to_s callbacks = nil @emittable_mutex.synchronize do callbacks = @emittable_events[event_name].to_a callbacks = callbacks.dup # in case the array changes as we are iterating through the callbacks end # we are outside of the mutex so any callbacks are able to trigger an event from # this class without deadlock callbacks.each { |callback| callback.call(*args) } nil end |