/**
  * @param string                                  $methodBody         the body of the previously generated code.
  *                                                                    It MUST assign the return value to a variable
  *                                                                    `$returnValue` instead of directly returning
  * @param \ProxyManager\Generator\MethodGenerator $method
  * @param \Zend\Code\Generator\PropertyGenerator  $prefixInterceptors
  * @param \Zend\Code\Generator\PropertyGenerator  $suffixInterceptors
  *
  * @return string
  */
 public static function createInterceptedMethodBody(string $methodBody, MethodGenerator $method, PropertyGenerator $prefixInterceptors, PropertyGenerator $suffixInterceptors) : string
 {
     $name = var_export($method->getName(), true);
     $prefixInterceptors = $prefixInterceptors->getName();
     $suffixInterceptors = $suffixInterceptors->getName();
     $params = [];
     foreach ($method->getParameters() as $parameter) {
         $parameterName = $parameter->getName();
         $params[] = var_export($parameterName, true) . ' => $' . $parameter->getName();
     }
     $paramsString = 'array(' . implode(', ', $params) . ')';
     return "if (isset(\$this->{$prefixInterceptors}" . "[{$name}])) {\n" . "    \$returnEarly       = false;\n" . "    \$prefixReturnValue = \$this->{$prefixInterceptors}" . "[{$name}]->__invoke(" . "\$this, \$this, {$name}, {$paramsString}, \$returnEarly);\n\n" . "    if (\$returnEarly) {\n" . "        return \$prefixReturnValue;\n" . "    }\n" . "}\n\n" . $methodBody . "\n\n" . "if (isset(\$this->{$suffixInterceptors}" . "[{$name}])) {\n" . "    \$returnEarly       = false;\n" . "    \$suffixReturnValue = \$this->{$suffixInterceptors}" . "[{$name}]->__invoke(" . "\$this, \$this, {$name}, {$paramsString}, \$returnValue, \$returnEarly);\n\n" . "    if (\$returnEarly) {\n" . "        return \$suffixReturnValue;\n" . "    }\n" . "}\n\n" . "return \$returnValue;";
 }