This part makes it very ugly IMO. There is no need to pass the dispatcher from the dispatch call

    $dispatcher->dispatch('foo', $event, $dispatcher)

because the original point was to make the dispatcher that calls the event available to the event listener. This can be done as you have already done in the final `call_user_func($listener, $event, $dispatcher ?: $this, $eventName);`