public function process($eventListeners, Event $event, $resultType = null, $limit = null)
    {

        $eventListeners = $this->orderByPriority($eventListeners);

        $results = [];

        /* @var $eventListener EventListener */
        foreach ($eventListeners as $eventListener) {

            $handler = $eventListener->getHandler();
            if ($this->isNull($handler)) {
                continue;
            }

            $method = $eventListener->getMethod();

            if ($this->isCallable($handler)) {
                /** @var $handler \Closure */
                $result = $handler($event);
            } else {
                $result = call_user_func_array([
                    $handler,
                    $method
                ], [$event]);
            }

            if ($this->isNull($resultType) || (!$this->isNull($resultType) && $this->isInstanceOf($result, $resultType))) {
                $results[] = $result;

                if ($limit === 1 && count($results) === 1) {
                    return $results[0];
                }

                if (count($results) === $limit) {
                    return $results;
                }
            }

            if ($event->isPropagationStopped()) {
                break;
            }
        }

        return $results;
    }