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