phossa2/event

View on GitHub
src/Event/StaticEventDispatcher.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
/**
 * Phossa Project
 *
 * PHP version 5.4
 *
 * @category  Library
 * @package   Phossa2\Event
 * @copyright Copyright (c) 2016 phossa.com
 * @license   http://mit-license.org/ MIT License
 * @link      http://www.phossa.com/
 */
/*# declare(strict_types=1); */

namespace Phossa2\Event;

use Phossa2\Event\Message\Message;
use Phossa2\Shared\Base\StaticAbstract;
use Phossa2\Event\Exception\BadMethodCallException;
use Phossa2\Event\Interfaces\EventManagerInterface;

/**
 * StaticEventDispatcher
 *
 * A static wrapper of EventDispatcher
 *
 * ```php
 * // attach
 * StaticEventDispatcher::attach('test', function() { echo 'test'; });
 *
 * // trigger
 * StaticEventDispatcher::trigger('test');
 * ```
 *
 * @package Phossa2\Event
 * @author  Hong Zhang <phossa@126.com>
 * @version 2.1.0
 * @since   2.0.0 added
 * @since   2.1.0 updated
 */
class StaticEventDispatcher extends StaticAbstract
{
    /**
     * slave event manager
     *
     * @var    EventManagerInterface[]
     * @access protected
     * @staticvar
     */
    protected static $event_manager = [];

    /**
     * default static scope
     *
     * @var    string
     * @access protected
     * @staticvar
     */
    protected static $static_scope = '__STATIC__';

    /**
     * Provides a static interface for event dispatcher's dynamic methods
     *
     * @param  string $name method name
     * @param  array $arguments arguments
     * @return mixed
     * @throws BadMethodCallException if method not found
     * @access public
     * @static
     * @internal
     */
    public static function __callStatic($name, array $arguments)
    {
        $mgr = static::getEventManager();
        if (method_exists($mgr, $name)) {
            return call_user_func_array([$mgr, $name], $arguments);
        }

        throw new BadMethodCallException(
            Message::get(
                Message::MSG_METHOD_NOTFOUND,
                $name,
                get_called_class()
            ),
            Message::MSG_METHOD_NOTFOUND
        );
    }

    /**
     * Set the inner event manager
     *
     * @param  EventManagerInterface $eventManager
     * @access public
     * @api
     * @static
     */
    public static function setEventManager(EventManagerInterface $eventManager)
    {
        self::$event_manager[get_called_class()] = $eventManager;
    }

    /**
     * Get the inner event manager
     *
     * @return EventManagerInterface $eventManager
     * @access public
     * @api
     * @static
     */
    public static function getEventManager()
    {
        if (!isset(self::$event_manager[get_called_class()])) {
            self::$event_manager[get_called_class()] =
                EventDispatcher::getShareable(static::$static_scope);
        }
        return self::$event_manager[get_called_class()];
    }
}