public static function renderAnnotation($annotation)
{
$annotationAsString = '@\\' . get_class($annotation);
$optionNames = get_class_vars(get_class($annotation));
$optionsAsStrings = [];
foreach ($optionNames as $optionName => $optionDefault) {
$optionValue = $annotation->{$optionName};
$optionValueAsString = '';
if (is_object($optionValue)) {
$optionValueAsString = self::renderAnnotation($optionValue);
} elseif (is_scalar($optionValue) && is_string($optionValue)) {
$optionValueAsString = '"' . $optionValue . '"';
} elseif (is_bool($optionValue)) {
$optionValueAsString = $optionValue ? 'true' : 'false';
} elseif (is_scalar($optionValue)) {
$optionValueAsString = $optionValue;
} elseif (is_array($optionValue)) {
$optionValueAsString = self::renderOptionArrayValueAsString($optionValue);
}
switch ($optionName) {
case 'value':
$optionsAsStrings[] = $optionValueAsString;
break;
default:
if ($optionValue === $optionDefault) {
continue;
}
$optionsAsStrings[] = $optionName . '=' . $optionValueAsString;
}
}
return $annotationAsString . ($optionsAsStrings !== [] ? '(' . implode(', ', $optionsAsStrings) . ')' : '');
}