public function fire($event, array $data = [])
   {
      if (is_string($event)) {
         $event = new Event($event);
         $event->setData($data);
      }
      else if ($event instanceof Event) {
         if ($data) {
            $event->addData($data);
         }
      }
      else {
         throw new InvalidArgumentException(
            "invalid value provided for 'event'; ".
            "expecting an event name as string"
         );
      }

      $type = $event->getType();
      $namespace = $event->getNamespace();
      foreach ($this->eventHandlers as $handler) {
         if (
            $handler->canHandle($type, $namespace) && 
            $handler->handle($event) === false
         ) {
            return false;
         }
      }
      return true;
   }