Class: Featurevisor::Emitter

Inherits:
Object
  • Object
show all
Defined in:
lib/featurevisor/emitter.rb

Overview

Event emitter class for handling event subscriptions and triggers

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeEmitter

Initialize a new emitter



12
13
14
# File 'lib/featurevisor/emitter.rb', line 12

def initialize
  @listeners = {}
end

Instance Attribute Details

#listenersObject (readonly)

Returns the value of attribute listeners.



9
10
11
# File 'lib/featurevisor/emitter.rb', line 9

def listeners
  @listeners
end

Instance Method Details

#clear_allObject

Clear all event listeners



56
57
58
# File 'lib/featurevisor/emitter.rb', line 56

def clear_all
  @listeners = {}
end

#on(event_name, callback) ⇒ Proc

Subscribe to an event

Parameters:

  • event_name (String)

    Name of the event to listen to

  • callback (Proc)

    Callback function to execute when event is triggered

Returns:

  • (Proc)

    Unsubscribe function



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/featurevisor/emitter.rb', line 20

def on(event_name, callback)
  @listeners[event_name] ||= []
  listeners = @listeners[event_name]
  listeners << callback

  is_active = true

  # Return unsubscribe function
  -> do
    return unless is_active

    is_active = false
    index = listeners.index(callback)
    listeners.delete_at(index) if index && index >= 0
  end
end

#trigger(event_name, details = {}) ⇒ Object

Trigger an event with optional details

Parameters:

  • event_name (String)

    Name of the event to trigger

  • details (Hash) (defaults to: {})

    Optional details to pass to event handlers



40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/featurevisor/emitter.rb', line 40

def trigger(event_name, details = {})
  listeners = @listeners[event_name]

  return unless listeners

  listeners.each do |listener|
    begin
      listener.call(details)
    rescue => err
      # Log error but don't stop execution
      warn "Error in event listener: #{err.message}"
    end
  end
end