public function transform(StreamMetaData $metadata = null)
{
if (strpos($metadata->source, 'new ') === false) {
return;
}
$tokenStream = token_get_all($metadata->source);
$transformedSource = '';
$isWaitingClass = false;
$isWaitingEnd = false;
$isClassName = true;
$classNamePosition = 0;
foreach ($tokenStream as $index => $token) {
list($token, $tokenValue) = (array) $token + array(1 => $token);
if ($isWaitingClass && $token !== T_WHITESPACE && $token !== T_COMMENT) {
$classNamePosition++;
if ($token === T_VARIABLE && $classNamePosition === 1) {
$isWaitingEnd = true;
$isWaitingClass = false;
}
if (in_array($tokenStream[$index + 1], array('(', ';', ')', '.'))) {
$isWaitingEnd = true;
$isWaitingClass = false;
}
if ($isClassName && $token !== T_NS_SEPARATOR && $token !== T_STRING && $token !== T_STATIC) {
$isClassName = false;
}
}
if ($token === T_NEW) {
$tokenValue = '\\' . __CLASS__ . '::getInstance()->{';
$isWaitingClass = true;
$isClassName = true;
$classNamePosition = 0;
}
$transformedSource .= $tokenValue;
if ($isWaitingEnd) {
$transformedSource .= $isClassName ? '::class' : '';
$transformedSource .= '}';
$isWaitingEnd = false;
}
}
$metadata->source = $transformedSource;
}