module EventBus
Public Instance Methods
attach_listener(_listener, _class_event)
click to toggle source
# File lib/a-commons.rb, line 844 def attach_listener(_listener, _class_event) @@listeners = {} unless defined? @@listeners @@listeners[_class_event] = [] unless @@listeners.has_key?(_class_event) @@listeners[_class_event] << _listener end
attach_listeners_listener(_listener, _class_event)
click to toggle source
# File lib/a-commons.rb, line 850 def attach_listeners_listener(_listener, _class_event) @@listeners_listeners = {} unless defined? @@listeners_listeners @@listeners_listeners[_class_event] = [] unless @@listeners_listeners.has_key?(_class_event) @@listeners_listeners[_class_event] << _listener end
broadcast_event(_event)
click to toggle source
# File lib/a-commons.rb, line 740 def broadcast_event(_event) return _event if !defined?(@@listeners) event_classes = _event_class_stack(_event.class) event_classes.each do |_c| _broadcast_fase(_c, _event) end end
detach_listener(_listener, _class_event=nil)
click to toggle source
# File lib/a-commons.rb, line 831 def detach_listener(_listener, _class_event=nil) if _class_event != nil if @@listeners[_class_event] @@listeners[_class_event].delete(_listener) end else #delete all the issues of listenere @@listeners.each{|klass, header| header.delete(_listener) } end end
detach_listeners_listener(_listener, _class_event=nil)
click to toggle source
# File lib/a-commons.rb, line 856 def detach_listeners_listener(_listener, _class_event=nil) if _class_event != nil if @@listeners_listeners[_class_event] @@listeners_listeners[_class_event].delete(_listener) end else #delete all the issues of listenere @@listeners_listeners.each{|klass, header| header.delete(_listener) } end end
process_event(_event, _listeners=nil)
click to toggle source
# File lib/a-commons.rb, line 693 def process_event(_event, _listeners=nil) # _listener rapresent a filter on @@listeners if != nil return _event if !defined?(@@listeners) @@listeners_listeners = {} unless defined? @@listeners_listeners event_classes = _event_class_stack(_event.class) #before fase event_classes.each do |_c| if _listeners.nil? _process_fase(_c, _event, @@listeners[_c], @@listeners_listeners[_c], 'before') else listeners_to_process = [] _listeners.each{|lis| listeners_to_process << lis if @@listeners[_c] && @@listeners[_c].include?(lis) } _process_fase(_c, _event, listeners_to_process, @@listeners_listeners[_c], 'before') end break if _event.is_breaked? # not responding to this means "you need to pass in an instance, not a class name end unless _event.is_breaked? # fase event_classes.each do |_c| if _listeners.nil? _process_fase(_c, _event, @@listeners[_c], @@listeners_listeners[_c]) else listeners_to_process = [] _listeners.each{|lis| listeners_to_process << lis if @@listeners[_c] && @@listeners[_c].include?(lis) } _process_fase(_c, _event, listeners_to_process, @@listeners_listeners[_c]) end break if _event.is_breaked? end unless _event.is_breaked? #after fase event_classes.each do |_c| if _listeners.nil? _process_fase(_c, _event, @@listeners[_c], @@listeners_listeners[_c], 'after') else listeners_to_process = [] _listeners.each{|lis| listeners_to_process << lis if @@listeners[_c] && @@listeners[_c].include?(lis) } _process_fase(_c, _event, listeners_to_process, @@listeners_listeners[_c], 'after') end break if _event.is_breaked? end unless _event.is_breaked? _event end
Private Instance Methods
_broadcast_fase(_class, _event)
click to toggle source
# File lib/a-commons.rb, line 809 def _broadcast_fase(_class, _event) return if @@listeners[_class].nil? method_name = _method_name(_class) if _class != _event.class sub_method_name = _method_name(_event.class) @@listeners[_class].each do|_listener| if _listener.respond_to?(sub_method_name) Thread.new{_listener.send(sub_method_name, _event)} elsif _listener.respond_to?(method_name) Thread.new{_listener.send(method_name, _event)} end end else @@listeners[_class].each do|_listener| Thread.new{ _listener.send(method_name, _event) if _listener.respond_to?(method_name) } end end end
_event_class_stack(_class)
click to toggle source
# File lib/a-commons.rb, line 748 def _event_class_stack(_class) #p "------> chiamato _event_class_stack for class #{_class}" res = Array.new cur_class = _class while cur_class != Object #p "#{cur_class} son on #{cur_class.superclass}" res << cur_class cur_class = cur_class.superclass end return res end
_method_name(_class, _suf='')
click to toggle source
# File lib/a-commons.rb, line 800 def _method_name(_class, _suf='') _str = _class.to_s _pre = _str[0..1] _in = _str[2..-1] _suf = _suf+'_' if _suf.length >0 return 'on_'+(_suf+_pre+_in.gsub(/[A-Z]/){|s| '_'+s.to_s}).downcase.gsub('_event','') end
_process_fase(_class, _event, _listeners=nil, _listeners_listeners=nil, _fase_name = nil)
click to toggle source
# File lib/a-commons.rb, line 761 def _process_fase(_class, _event, _listeners=nil, _listeners_listeners=nil, _fase_name = nil) return if _listeners.nil? _fase_name.nil?? suf = '':suf = _fase_name method_name = _method_name(_class, suf) if _class != _event.class sub_method_name = _method_name(_event.class, suf) _listeners.each do|_listener| next if _listener.kind_of?(ArcadiaExtPlus) && !(_listener.active? || _class == ArcadiaSysEvent || _class.superclass == ArcadiaSysEvent || _event.class.kind_of?(ArcadiaSysEvent)) if _listener.respond_to?(sub_method_name) _listener.send(sub_method_name, _event) elsif _listener.respond_to?(method_name) _listener.send(method_name, _event) end if _listeners_listeners _listeners_listeners.each do |ll| if ll.respond_to?(sub_method_name) ll.send(sub_method_name, _event, _listener) elsif ll.respond_to?(method_name) ll.send(method_name, _event, _listener) end end end break if _event.is_breaked? end else _listeners.each do|_listener| next if _listener.kind_of?(ArcadiaExtPlus) && !(_listener.active? || (_event.kind_of?(ArcadiaSysEvent))) _listener.send(method_name, _event) if _listener.respond_to?(method_name) if _listeners_listeners _listeners_listeners.each do |ll| ll.send(method_name, _event, _listener) if ll.respond_to?(method_name) end end break if _event.is_breaked? end end end