public function listen($eventName, EventListener $eventListener = null)
{
if (!$this->isString($eventName) || $this->str($eventName)->length() == 0) {
throw new EventManagerException(EventManagerException::INVALID_EVENT_NAME);
}
if ($this->isNull($eventListener)) {
$eventListener = new EventListener();
}
$eventListeners = $this->events->key($eventName, [], true);
$eventListeners[] = $eventListener;
$this->events->key($eventName, $eventListeners);
return $eventListener;
}