Example #1
0
 /**
  * @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 . ')';
 }