namespace Illuminate\Events;

use Exception;
use ReflectionClass;
use Illuminate\Support\Str;
use Illuminate\Container\Container;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
use Illuminate\Contracts\Events\Dispatcher as DispatcherContract;
use Illuminate\Contracts\Container\Container as ContainerContract;
// use namespace
class Dispatcher implements DispatcherContract
{// a Dispatcher implements Dispatcher Contract
    /**
     * The IoC container instance.
     *
     * @var \Illuminate\Contracts\Container\Container
     */
    protected $container;// The Ioc container instance.

    /**
     * The registered event listeners.
     *
     * @var array
     */
    protected $listeners = [];// listeners be registered

    /**
     * The wildcard listeners.
     *
     * @var array
     */
    protected $wildcards = [];// The wildcard listeners. like store

    /**
     * The sorted event listeners.
     *
     * @var array
     */
    protected $sorted = [];// The sorted event listeners.

    /**
     * The event firing stack.
     *
     * @var array
     */
    protected $firing = [];//The event firing stack.

    /**
     * The queue resolver instance.
     *
     * @var callable
     */
    protected $queueResolver;// The queue resolver instance.

   // at last ,we find to instance ,some listeners

    /**
     * Create a new event dispatcher instance.
     *
     * @param  \Illuminate\Contracts\Container\Container|null  $container
     * @return void
     */
   // dispathcer is use to make it like you want
    public function __construct(ContainerContract $container = null)
    {
        $this->container = $container ?: new Container;
    }// ContainerContract is $contanier