/**
  * Registers a new event with this manager under a specific event name.
  * If you attempt to register already registered event nothing happens unless
  * the classes mismatch. In that case an exception is thrown.
  * @param string  $eventName Name of the event that is being registered.
  * @param RegisteredEvent $registeredEvent The class instance to use for this event.
  * @throws EventAlreadyRegisteredException on critical failure
  * @return bool True on success, false on failure.
  */
 public function register($eventName, RegisteredEvent $registeredEvent)
 {
     self::assertValidName($registeredEvent->getClassName(), 'Event registration failed: Invalid event class name.');
     // check if it is registered first - it also validates the name, no need to do that twice
     if ($this->isRegistered($eventName)) {
         // check whether the event we are registering is the same class (or subclass) of what we have already registered
         if (is_a($registeredEvent->getClassName(), $this->events[$eventName]->getClassName(), true)) {
             $this->log('Event {name} has been previously registered, skipping request.', array('name' => $eventName), LogLevels::DEBUG);
         } else {
             throw new EventAlreadyRegisteredException('Event registration failed: Event ' . $eventName . ' has been previously registered with a different class name (' . $this->events[$eventName]->getClassName() . ').');
         }
         return false;
     }
     $this->events[$eventName] = $registeredEvent;
     $this->log('Registered event {name} (with class {class}).', array('name' => $eventName, 'class' => $registeredEvent->getClassName()), LogLevels::DEBUG);
     return true;
 }
 public function assertValidClass(IEvent $event)
 {
     return parent::assertValidClass($event) || is_a($event, $this->className);
 }