/**
  * @param Expr\Assign $node
  *
  * @return string
  */
 public function convert(Expr\Assign $node, $extract = true)
 {
     $type = 'Expr_Assign';
     $leftNode = $node->var;
     $operatorString = ' = ';
     $rightNode = $node->expr;
     list($precedence, $associativity) = $this->dispatcher->getPrecedenceMap($type);
     if ($rightNode instanceof Expr\Array_) {
         $this->logger->trace(self::getType() . ' ' . __LINE__, $node, $this->dispatcher->getMetadata()->getFullQualifiedNameClass());
         $collect = $this->dispatcher->pExpr_Array($rightNode, true);
         return ($extract === true ? $collect->getCollected() : '') . 'let ' . $this->dispatcher->pPrec($leftNode, $precedence, $associativity, -1) . $operatorString . ' ' . $collect->getExpr();
     } elseif (($rightNode instanceof Expr\MethodCall || $rightNode instanceof Expr\FuncCall) && $leftNode instanceof Expr\List_ === false) {
         $collected = $this->convertCall($node, new ArrayDto());
         return $collected['extracted']->getCollected() . 'let ' . $this->dispatcher->pPrec($leftNode, $precedence, $associativity, -1) . $operatorString . ' ' . $this->dispatcher->p($collected['node']->expr);
     } elseif ($rightNode instanceof Expr\BinaryOp\Concat) {
         $collected = $this->convertConcat($node->expr, new ArrayDto());
         return $collected['extracted']->getCollected() . 'let ' . $this->dispatcher->pPrec($leftNode, $precedence, $associativity, -1) . $operatorString . ' ' . $this->dispatcher->p($collected['node']);
     } elseif ($rightNode instanceof Expr\Ternary) {
         $collect = $this->dispatcher->pExpr_Ternary($rightNode, true);
         return $collect->getCollected() . 'let ' . $this->dispatcher->pPrec($leftNode, $precedence, $associativity, -1) . $operatorString . ' ' . $collect->getExpr();
     } elseif ($leftNode instanceof Expr\List_) {
         return $this->convertListStmtToAssign($node);
     } elseif ($leftNode instanceof Expr\ArrayDimFetch || $rightNode instanceof Expr\ArrayDimFetch) {
         return $this->arrayDimFetchCase($node, $leftNode, $rightNode, $operatorString, $precedence, $associativity, $extract);
     } elseif ($rightNode instanceof Expr\Assign) {
         // multiple assign
         $valueToAssign = ' = ' . $this->dispatcher->p($this->findValueToAssign($rightNode));
         $vars = array($this->dispatcher->pPrec($leftNode, $precedence, $associativity, -1));
         foreach ($this->findVarToAssign($rightNode) as $nodeAssigned) {
             $vars[] = $nodeAssigned;
         }
         $toReturn = '';
         foreach ($vars as $var) {
             $toReturn .= 'let ' . $var . $valueToAssign . ";\n";
         }
         return $toReturn;
     } elseif ($rightNode instanceof Variable || $rightNode instanceof Scalar || $rightNode instanceof Array_) {
         $this->logger->trace(self::getType() . ' ' . __LINE__, $node, $this->dispatcher->getMetadata()->getFullQualifiedNameClass());
         return 'let ' . $this->dispatcher->pPrec($leftNode, $precedence, $associativity, -1) . $operatorString . $this->dispatcher->pPrec($rightNode, $precedence, $associativity, 1);
     } else {
         $this->logger->trace(self::getType() . ' ' . __LINE__, $node, $this->dispatcher->getMetadata()->getFullQualifiedNameClass());
         return 'let ' . $this->dispatcher->pPrec($leftNode, $precedence, $associativity, -1) . $operatorString . ' ' . $this->dispatcher->p($rightNode);
     }
 }