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.
@@ -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: []