protected final function visitOffsetUnset(O\Expression $expression)
 {
     $operationId = $this->getId('offset-unset');
     $indexId = $this->getId('unset-index');
     if ($expression instanceof O\MethodCallExpression) {
         $this->interpretation->interpretOffsetUnset($operationId, $indexId, $this->getArgumentValueAt(0, $expression));
         $this->interpretSourceAsScope($expression);
         return;
     } elseif ($expression instanceof O\UnsetExpression) {
         $unsetArguments = $expression->getValues();
         if (count($unsetArguments) === 1 && $unsetArguments[0] instanceof O\IndexExpression) {
             $this->interpretation->interpretOffsetUnset($operationId, $indexId, $this->getValue($unsetArguments[0]->getIndex()));
             $this->interpretSourceAsScope($unsetArguments[0]);
             return;
         }
     }
     throw new PinqException('Cannot interpret offset unset operation: invalid expression type, expecting %s, %s given', O\MethodCallExpression::getType() . ' or ' . O\IssetExpression::getType() . ' with a single parameter index', $expression->getType());
 }
 protected final function visitCount(O\Expression $expression)
 {
     $this->interpretation->interpretCount($this->getId('count'));
     if ($expression instanceof O\MethodCallExpression) {
         $this->interpretSourceAsScope($expression);
     } elseif ($expression instanceof O\FunctionCallExpression && count($expression->getArguments()) > 0) {
         $this->scopeInterpreter->interpretScope($expression->getArguments()[0]->getValue());
     } else {
         throw new PinqException('Cannot interpret count request: invalid expression type, expecting %s, %s given', O\MethodCallExpression::getType() . ' or ' . O\FunctionCallExpression::getType() . ' with at least one argument', $expression->getType());
     }
 }