/**
  * @param  ClassInfo   $classInfo
  * @param  string      $callback
  * @param  string      $callbackMethod
  * @param  string|null $value
  * @return Expr
  */
 protected function prepareCallbackNode(ClassInfo $classInfo, $callback, $callbackMethod, $value = null)
 {
     // controller as service callback
     if (preg_match('/^([^:]+):([^:]+)$/', $callback, $matches) === 1) {
         if ($matches[1] == '__self') {
             $matches[1] = $classInfo->getServiceId();
         }
         return $this->{$callbackMethod}($matches[1], $matches[2], $value);
     } elseif (preg_match('/^([^:]+)::([^:]+)$/', $callback, $matches) === 1) {
         if ($matches[1] == '__self') {
             $matches[1] = $classInfo->getName();
         }
         return new String_($matches[1] . '::' . $matches[2]);
     } else {
         return new String_($callback);
     }
 }
 /**
  * @param  ClassInfo $classInfo
  * @param  array     $statements
  * @return Assign
  */
 protected function prepareNode(ClassInfo $classInfo, array $statements)
 {
     return new Assign(new ArrayDimFetch(new Variable('app'), new String_($classInfo->getServiceId())), new MethodCall(new Variable('app'), 'share', array(new Arg(new Closure(array('uses' => array(new ClosureUse('app')), 'stmts' => $statements))))));
 }