<?php

namespace Symfony\Bundle\SwiftmailerBundle\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Compiler\AbstractRecursivePass;
use Symfony\Component\DependencyInjection\Definition;

/**
 * Ensures that autoloading of Swiftmailer classes is not optimized by the hot path optimization.
 *
 * Swiftmailer has a special autoloader triggering the initialization of the library lazily.
 * Bypassing the autoloader would thus break the library.
 * This logic allows to keep applying the autoloading optimization on the container, forcing an
 * opt-out only for the Swiftmailer classes, which is better than disabling the optimization
 * entirely.
 *
 * @author Christophe Coevoet <stof@notk.org>
 */
class EnsureNoHotPathPass extends AbstractRecursivePass
{
    protected function processValue($value, $isRoot = false)
    {
        if ($value instanceof Definition && null !== ($class = $value->getClass()) && 0 === strpos($class, 'Swift_')) {
            $value->clearTag('container.hot_path');
        }

        return parent::processValue($value, $isRoot);
    }
}
