event_dispatcher 0.0.2.pre
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/event_dispatcher.rb +2 -0
- data/lib/event_dispatcher/dispatcher.rb +75 -0
- data/lib/event_dispatcher/event.rb +15 -0
- metadata +49 -0
@@ -0,0 +1,75 @@
|
|
1
|
+
module EventDispatcher
|
2
|
+
class Dispatcher
|
3
|
+
def initialize
|
4
|
+
@listeners = {}
|
5
|
+
@sorted = {}
|
6
|
+
end
|
7
|
+
|
8
|
+
def get_listeners( event_name = nil )
|
9
|
+
if event_name
|
10
|
+
sort_listeners!( event_name ) if @sorted[event_name].nil?
|
11
|
+
|
12
|
+
return @sorted[event_name]
|
13
|
+
end
|
14
|
+
|
15
|
+
@listeners.each_key { |event_name| sort_listeners!( event_name ) if @sorted[event_name].nil? }
|
16
|
+
|
17
|
+
return @sorted
|
18
|
+
end
|
19
|
+
|
20
|
+
def has_listeners?( event_name = nil )
|
21
|
+
get_listeners( event_name ).count > 0 ? true : false
|
22
|
+
end
|
23
|
+
|
24
|
+
def add_listener( event_name, listener, priority = 0 )
|
25
|
+
@listeners[event_name] ||= {}
|
26
|
+
@listeners[event_name][priority] ||= []
|
27
|
+
@listeners[event_name][priority].push(listener)
|
28
|
+
|
29
|
+
@sorted[event_name].clear unless @sorted[event_name].nil?
|
30
|
+
end
|
31
|
+
|
32
|
+
def remove_listener( event_name, listener )
|
33
|
+
return if @listeners[event_name].nil?
|
34
|
+
|
35
|
+
@listeners[event_name].each_pair do |priority, listeners|
|
36
|
+
listeners.delete_if { |item| p listener == item }
|
37
|
+
end
|
38
|
+
|
39
|
+
@sorted[event_name].clear unless @sorted[event_name].nil?
|
40
|
+
end
|
41
|
+
|
42
|
+
def dispatch( event_name, event = nil )
|
43
|
+
return if @listeners[event_name].nil? || event.nil?
|
44
|
+
|
45
|
+
do_dispatch( get_listeners( event_name ), event )
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def sort_listeners!( event_name )
|
52
|
+
@sorted[event_name] = {}
|
53
|
+
|
54
|
+
if @listeners[event_name]
|
55
|
+
@sorted[event_name] = @listeners[event_name].sort
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def do_dispatch( listeners, event )
|
61
|
+
listeners.each do |priority|
|
62
|
+
priority[1].each do |listener|
|
63
|
+
if listener.is_a?(Hash)
|
64
|
+
listener[:object].send( listener[:method], event )
|
65
|
+
elsif listener.respond_to?(:call)
|
66
|
+
listener.call( event )
|
67
|
+
else
|
68
|
+
raise ArgumentError.new("Listener must be a Hash or Block")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: event_dispatcher
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2.pre
|
5
|
+
prerelease: 6
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Amine Asli
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-10-01 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: EventDispatcher implements a lightweight version of the Observer design
|
15
|
+
pattern. It's a ruby port of the well known Symfony EventDispatcher
|
16
|
+
email: phobosapp@yahoo.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- lib/event_dispatcher.rb
|
22
|
+
- lib/event_dispatcher/dispatcher.rb
|
23
|
+
- lib/event_dispatcher/event.rb
|
24
|
+
homepage: https://github.com/ThatAmine/event_dispatcher
|
25
|
+
licenses:
|
26
|
+
- LGPL
|
27
|
+
post_install_message:
|
28
|
+
rdoc_options: []
|
29
|
+
require_paths:
|
30
|
+
- lib
|
31
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
32
|
+
none: false
|
33
|
+
requirements:
|
34
|
+
- - ! '>='
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '0'
|
37
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ! '>'
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 1.3.1
|
43
|
+
requirements: []
|
44
|
+
rubyforge_project:
|
45
|
+
rubygems_version: 1.8.11
|
46
|
+
signing_key:
|
47
|
+
specification_version: 3
|
48
|
+
summary: EventDispatcher implements a lightweight version of the Observer design pattern.
|
49
|
+
test_files: []
|