class Knj::Event_handler

This class is used for event handeling.

Examples

events = Knj::Event_handler.new
events.add_event(:name => :test_event)
events.connect(:test_event) do |*args|
  print "Test-event called!\n"
end

events.call(:test_event) #=> prints "Test-event called!\n"

Public Class Methods

new(args = {}) click to toggle source

Sets various used variables.

# File lib/knj/event_handler.rb, line 12
def initialize(args = {})
  @args = args
  @events = {}
end

Public Instance Methods

add_event(event) click to toggle source

Adds information about a new event.

Examples

events.add_event(:name => :test_event)
# File lib/knj/event_handler.rb, line 20
def add_event(event)
  raise "No name given." if !event[:name]
  
  @events[event[:name]] = [] if !@events.key?(event[:name])
  @events[event[:name]] = {
    :event => event,
    :callbacks => {},
    :callbacks_count => 0
  }
end
add_events(*events) click to toggle source

Adds multiple events.

Examples

events.add_events(:test_event, :another_event, :a_third_event)
# File lib/knj/event_handler.rb, line 34
def add_events(*events)
  events.each do |event|
    self.add_event(:name => event)
  end
end
call(name, *args) click to toggle source

Calls an added event.

Examples

events.call(:test_event, {:data => 1})
# File lib/knj/event_handler.rb, line 92
def call(name, *args)
  raise "No such event: '#{name}'." if !@events.key?(name)
  event = @events[name]
  ret = nil
  event[:callbacks].clone.each do |callback_id, callback_hash|
    ret = callback_hash[:block].call(name, *args)
  end
  
  return ret
end
connect(name, &block) click to toggle source

Connects the given block to a given event.

Examples

events.connect(:test_event){ |*args| print "Test event!\n"}
# File lib/knj/event_handler.rb, line 43
def connect(name, &block)
  raise "No such event: '#{name}'." if !@events.key?(name)
  
  event = @events[name]
  
  if event[:event].key?(:connections_max) and event[:callbacks].length >= event[:event][:connections_max].to_i
    raise "The event '#{name}' has reached its maximum connections of '#{event[:event][:connections_max]}'"
  end
  
  event[:callbacks_count] += 1
  count = event[:callbacks_count]
  event[:callbacks][count] = {
    :block => block
  }
  
  return count
end
connected?(name) click to toggle source

Returns true if the given event is connected.

Examples

print "Test-event is connected!" if events.connected?(:test_event)
# File lib/knj/event_handler.rb, line 64
def connected?(name)
  raise "No such event." if !@events.key?(name)
  return !@events[name][:callbacks].empty?
end
count_connects(name) click to toggle source

Returns how many blocks have been connected to an event.

Examples

print "More than five connections to test-event!" if events.count_events(:test_event) > 5
# File lib/knj/event_handler.rb, line 84
def count_connects(name)
  raise "No such event." if !@events.key?(name)
  return @events[name][:callbacks].length
end
disconnect(name, callback_id) click to toggle source

Disconnects an event.

Examples

connection_id = events.connect(:test_event){print "test event!}
events.disconnect(:test_event, connection_id)
events.call(:test_event) #=> Doesnt print 'test event!'.
# File lib/knj/event_handler.rb, line 74
def disconnect(name, callback_id)
  raise "No such event: '#{name}'." if !@events.key?(name)
  raise "No such connection: '#{name}' --> '#{callback_id}' (#{@events[name]})" if !@events[name][:callbacks].key?(callback_id)
  @events[name][:callbacks][callback_id].clear
  @events[name][:callbacks].delete(callback_id)
end