/**
  * Return array of tag/attributes of all tags used by an template
  *
  * @api  Smarty::getTags()
  * @link http://www.smarty.net/docs/en/api.get.tags.tpl
  *
  * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
  * @param null|string|Smarty_Internal_Template                            $template
  *
  * @return array of tag/attributes
  * @throws \SmartyException
  */
 public function getTags(Smarty_Internal_TemplateBase $obj, $template = null)
 {
     /* @var Smarty $smarty */
     $smarty = $obj->_getSmartyObj();
     if ($obj->_isTplObj() && !isset($template)) {
         $tpl = clone $obj;
     } elseif (isset($template) && $template->_isTplObj()) {
         $tpl = clone $template;
     } elseif (isset($template) && is_string($template)) {
         /* @var Smarty_Internal_Template $tpl */
         $tpl = new $smarty->template_class($template, $smarty);
         // checks if template exists
         if (!$tpl->source->exists) {
             throw new SmartyException("Unable to load template {$tpl->source->type} '{$tpl->source->name}'");
         }
     }
     if (isset($tpl)) {
         $tpl->smarty = clone $tpl->smarty;
         $tpl->smarty->_cache['get_used_tags'] = true;
         $tpl->_cache['used_tags'] = array();
         $tpl->smarty->merge_compiled_includes = false;
         $tpl->smarty->disableSecurity();
         $tpl->caching = false;
         $tpl->loadCompiler();
         $tpl->compiler->compileTemplate($tpl);
         return $tpl->_cache['used_tags'];
     }
     throw new SmartyException("Missing template specification");
 }