Class: Knj::Event_handler

Inherits:
Object show all
Defined in:
lib/knj/event_handler.rb

Overview

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”

Instance Method Summary collapse

Constructor Details

#initialize(args = {}) ⇒ Event_handler

Sets various used variables.



12
13
14
15
# File 'lib/knj/event_handler.rb', line 12

def initialize(args = {})
  @args = args
  @events = {}
end

Instance Method Details

#add_event(event) ⇒ Object

Adds information about a new event.

Examples

events.add_event(:name => :test_event)



20
21
22
23
24
25
26
27
28
29
# 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) ⇒ Object

Adds multiple events.

Examples

events.add_events(:test_event, :another_event, :a_third_event)



34
35
36
37
38
# 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) ⇒ Object

Calls an added event.

Examples

events.call(:test_event, => 1)



92
93
94
95
96
97
98
99
100
101
# 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) ⇒ Object

Connects the given block to a given event.

Examples

events.connect(:test_event){ |*args| print “Test event!n”}



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 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) ⇒ Boolean

Returns true if the given event is connected.

Examples

print “Test-event is connected!” if events.connected?(:test_event)

Returns:

  • (Boolean)


64
65
66
67
# 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) ⇒ Object

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



84
85
86
87
# 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) ⇒ Object

Disconnects an event.

Examples

connection_id = events.connect(:test_event)“test event! events.disconnect(:test_event, connection_id) events.call(:test_event) #=> Doesnt print ‘test event!’.



74
75
76
77
78
79
# 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