Module: Emittable

Defined in:
lib/emittable.rb,
lib/emittable/error.rb

Defined Under Namespace

Classes: Error

Instance Method Summary collapse

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

Raises:

  • (ArgumentError)


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" }

Parameters:

  • name (String, Symbol)

    event name

Returns:

  • handler

Raises:

  • (ArgumentError)


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)

Parameters:

  • name (String, Symbol)

    event name to trigger

Raises:

  • (ArgumentError)


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