package util

class Connectable(listeners)
   #
   # Helper method to create and fire an Event object from the given parameters.
   #
   method fire(type, param)
      local e
      if /type then stop("null type to fire")
      e := Event(self, type, param)
      return fire_event(e)
   end

   #
   # Fire the given event to the listeners
   #
   method fire_event(e)
      every (!listeners).maybe_fire(e)
      return e
   end

   #
   # Create and connect a Listener to this object.
   # @return the Listener created and added.
   #
   method connect(obj, meth, type)
      local l
      l := Listener(obj, meth, type)
      put(listeners, l)
      return l
   end

   #
   # Remove a Listener previously returned by {connect}
   #
   method disconnect(l)
      delete(listeners, l)
   end

   initially
      listeners := []
end