public function addWidget( $widget, $service, $priority = null )
    {
        if ( ! isset( $this->widgets[$widget] ) )
        {
            $this->widgets[$widget] = new PriorityQueue;
        }

        if ( ! is_a( $service, static::WIDGET_INTERFACE, true ) )
        {
            throw new \InvalidArgumentException( sprintf(
                '%s: $service must implement "%s"',
                __METHOD__,
                static::WIDGET_INTERFACE
            ) );
        }

        $this->widgets[$widget]->insert(
            $service,
            null === $priority ? 1 : (int) $priority
        );

        return $this;
    }