Your IP : 216.73.216.196


Current Path : /home/eolienneia/www/templates/yootheme/vendor/yootheme/application/src/Application/
Upload File :
Current File : /home/eolienneia/www/templates/yootheme/vendor/yootheme/application/src/Application/EventLoader.php

<?php

namespace YOOtheme\Application;

use YOOtheme\Container;
use YOOtheme\Event;
use YOOtheme\EventDispatcher;

class EventLoader
{
    /**
     * @var EventDispatcher
     */
    protected $dispatcher;

    /**
     * Constructor.
     *
     * @param EventDispatcher $dispatcher
     */
    public function __construct($dispatcher = null)
    {
        $this->dispatcher = $dispatcher ?: Event::getDispatcher();
    }

    /**
     * Load event listeners.
     *
     * @param Container $container
     * @param array     $configs
     */
    public function __invoke(Container $container, array $configs)
    {
        foreach ($configs as $events) {
            foreach ($events as $event => $listeners) {
                foreach ($listeners as $class => $parameters) {
                    $parameters = (array) $parameters;

                    if (is_string($parameters[0])) {
                        $parameters = [$parameters];
                    }

                    foreach ($parameters as $params) {
                        $this->addListener($container, $event, $class, ...$params);
                    }
                }
            }
        }
    }

    /**
     * Adds a listener.
     *
     * @param Container $container
     * @param string    $event
     * @param string    $class
     * @param string    $method
     * @param array     $params
     */
    public function addListener(Container $container, $event, $class, $method, ...$params)
    {
        $this->dispatcher->addListener(
            $event,
            static function (...$arguments) use ($container, $class, $method) {
                $callback = [$class, $method];

                if ($method[0] === '@') {
                    $callback = join($callback);
                }

                return $container->call($callback, $arguments);
            },
            ...$params
        );
    }
}