/** * @param Tokenizer $tokens * @param Template $tpl * @return string */ public static function call(Tokenizer $tokens, Template $tpl) { $callable = array($tokens->skip('.')->need(Tokenizer::MACRO_STRING)->getAndNext()); while ($tokens->is('.')) { $callable[] = $tokens->next()->need(Tokenizer::MACRO_STRING)->getAndNext(); } $callable = implode('\\', $callable); if ($tokens->is(T_DOUBLE_COLON)) { $callable .= '::' . $tokens->next()->need(Tokenizer::MACRO_STRING)->getAndNext(); } $call_filter = $tpl->getStorage()->call_filters; if ($call_filter) { foreach ($call_filter as $filter) { if (!fnmatch(addslashes($filter), $callable)) { throw new \LogicException("Callback " . str_replace('\\', '.', $callable) . " is not available by settings"); } } } if (!is_callable($callable)) { throw new \RuntimeException("PHP method " . str_replace('\\', '.', $callable) . ' does not exists.'); } if ($tokens->is('(')) { $arguments = 'array' . $tpl->parseArgs($tokens) . ''; } else { $arguments = 'array()'; } return 'call_user_func_array(' . var_export($callable, true) . ', ' . $arguments . ')'; }