<?php
namespace Avh\Utility;

abstract class ShortcodesAbstract
{
    private $shortcode_map;

    /**
     * Method that's always called for the shortcode
     *
     * @param  array  $atts
     * @param  string $content
     * @param  string $tag
     *
     * @return string
     */
    public function bootstrap($atts, $content, $tag)
    {
        $method = $this->shortcode_map[$tag];
        ob_start();
        $html = '';
        if (is_callable(array($this, $method))) {
            $html = $this->$method($atts, $content, $tag);
            $html .= ob_get_clean();
        }

        return $html;
    }

    public function register($tag, $class)
    {
        $this->shortcode_map[$tag] = $class;
        add_shortcode($tag, array($this, 'bootstrap'));
    }
}

<?php
namespace Avh\Utility;

abstract class ShortcodesAbstract
{
    private $shortcode_map;
    private $shortcode_controller;

    /**
     * @param mixed $shortcode_controller
     */
    public function setShortcodeController($shortcode_controller)
    {
        $this->shortcode_controller = $shortcode_controller;
    }

    /**
     * Method that's always called for the shortcode
     *
     * @param  array  $atts
     * @param  string $content
     * @param  string $tag
     *
     * @return string
     */
    public function bootstrap($atts, $content, $tag)
    {
        $method = $this->shortcode_map[$tag];
        ob_start();
        $html = '';
        if (is_callable(array($this->shortcode_controller, $method))) {
            $html = $this->shortcode_controller->$method($atts, $content, $tag);
            $html .= ob_get_clean();
        }

        return $html;
    }

    public function register($tag, $class)
    {
        $this->shortcode_map[$tag] = $class;
        add_shortcode($tag, array($this, 'bootstrap'));
    }
}

Add more control for shortcode implementation
Add more control for shortcode implementation
