module Tilia::Event::EventEmitterTrait

Event Emitter Trait

This trait contains all the basic functions to implement an EventEmitterInterface.

Using the trait + interface allows you to add EventEmitter capabilities without having to change your base-class.

Public Class Methods

new(*args) click to toggle source

Initializes the instance variables of the trait

Do not forget to call super when initializing classes including this module

Calls superclass method
# File lib/tilia/event/event_emitter_trait.rb, line 15
def initialize(*args)
  @listeners = {}
  super
end

Public Instance Methods

emit(event_name, arguments = [], continue_call_back = nil) click to toggle source

(see EventEmitterInterface#emit)

# File lib/tilia/event/event_emitter_trait.rb, line 41
def emit(event_name, arguments = [], continue_call_back = nil)
  if !continue_call_back.is_a?(Proc)

    listeners(event_name).each do |listener|
      result = listener.call(*arguments)
      return false if result == false
    end
  else
    my_listeners = listeners(event_name)
    counter = my_listeners.size

    my_listeners.each do |listener|
      counter -= 1
      result = listener.call(*arguments)

      return false if result == false

      break if counter > 0 && !continue_call_back.call
    end
  end

  true
end
listeners(event_name) click to toggle source

(see EventEmitterInterface#listeners)

# File lib/tilia/event/event_emitter_trait.rb, line 66
def listeners(event_name)
  return [] unless @listeners.key? event_name

  # The list is not sorted
  unless @listeners[event_name][0]
    # Sorting
    # array_multisort with ruby
    joined = (0...@listeners[event_name][1].size).map do |i|
      [@listeners[event_name][1][i], @listeners[event_name][2][i]]
    end
    sorted = joined.sort do |a, b|
      a[0] <=> b[0]
    end
    sorted.each_with_index do |data, i|
      @listeners[event_name][1][i] = data[0]
      @listeners[event_name][2][i] = data[1]
    end

    # Marking the listeners as sorted
    @listeners[event_name][0] = true
  end

  @listeners[event_name][2]
end
on(event_name, call_back, priority = 100) click to toggle source

(see EventEmitterInterface#on)

# File lib/tilia/event/event_emitter_trait.rb, line 21
def on(event_name, call_back, priority = 100)
  @listeners[event_name] ||= [false, [], []]

  @listeners[event_name][0] = @listeners[event_name][1].size == 0
  @listeners[event_name][1] << priority
  @listeners[event_name][2] << call_back
end
once(event_name, call_back, priority = 100) click to toggle source

(see EventEmitterInterface#once)

# File lib/tilia/event/event_emitter_trait.rb, line 30
def once(event_name, call_back, priority = 100)
  wrapper = nil
  wrapper = lambda do |*arguments|
    remove_listener(event_name, wrapper)
    call_back.call(*arguments)
  end

  on(event_name, wrapper, priority)
end
remove_all_listeners(event_name = nil) click to toggle source

(see EventEmitterInterface#remove_all_listeners)

# File lib/tilia/event/event_emitter_trait.rb, line 106
def remove_all_listeners(event_name = nil)
  if event_name
    @listeners.delete(event_name)
  else
    @listeners = {}
  end
end
remove_listener(event_name, listener) click to toggle source

(see EventEmitterInterface#remove_listener)

# File lib/tilia/event/event_emitter_trait.rb, line 92
def remove_listener(event_name, listener)
  return false unless @listeners.key?(event_name)

  @listeners[event_name][2].each_with_index do |check, index|
    next unless check == listener

    @listeners[event_name][1].delete_at(index)
    @listeners[event_name][2].delete_at(index)
    return true
  end
  false
end