event_dispatcher 0.0.2.pre

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,2 @@
1
+ require 'event_dispatcher/dispatcher'
2
+ require 'event_dispatcher/event'
@@ -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
@@ -0,0 +1,15 @@
1
+ module EventDispatcher
2
+ module Event
3
+ def propagation_stopped
4
+ @propagation_stopped ||= false
5
+ end
6
+
7
+ def stop_propagation
8
+ @propagation_stopped = true
9
+ end
10
+
11
+ def propagation_stopped?
12
+ propagation_stopped
13
+ end
14
+ end
15
+ 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: []