/**
  * Generate setters for class
  *
  * @param ClassDefinition $classDefinition
  * @param MethodDefinition $methodDefinition
  * @return string
  * @throws ReferenceNotImplementsException
  */
 protected function generateSetters(ClassDefinition $classDefinition, MethodDefinition $methodDefinition) : string
 {
     $className = $classDefinition->getClassName();
     $methodName = $methodDefinition->getMethodName();
     $arguments = $this->generateArguments($methodDefinition);
     // Call method by reflection
     if (!$methodDefinition->isPublic()) {
         $isEmptyArguments = count($methodDefinition->getParametersCollection()) === 0;
         return "\t\$method = (new \\ReflectionClass('{$className}'))->getMethod('{$methodName}');" . "\n\t\t\t\$method->setAccessible(true);" . "\n\t\t\t\$method->invoke(\$temp" . ($isEmptyArguments ? '' : ", {$arguments}") . ');' . "\n\t\t\t\$method->setAccessible(false);";
     } else {
         return "\t\$temp->{$methodName}({$arguments});";
     }
 }