public function dispatch($eventName, $shortEventClassName, array $eventArgs = array())
    {
        $className = class_exists($shortEventClassName) ? 
            $shortEventClassName:
            "Claroline\CoreBundle\Event\\{$shortEventClassName}Event";

        if (!class_exists($className)) {
            throw new MissingEventClassException(
                "No event class matches the short name '{$shortEventClassName}' (looked for '{$className})"
            );
        }

        $rEvent = new \ReflectionClass($className);
        $event = $rEvent->newInstanceArgs($eventArgs);

        if ($event instanceof MandatoryEventInterface && !$this->eventDispatcher->hasListeners($eventName)) {
            throw new MandatoryEventException("No listener is attached to the '{$eventName}' event");
        }

        $this->eventDispatcher->dispatch($eventName, $event);

        if ($event instanceof DataConveyorEventInterface && !$event->isPopulated()) {
            throw new NotPopulatedEventException("Event object for '{$eventName}' was not populated as expected");
        }

        return $event;
    }