<?php 
 
namespace Doctrine\Bundle\DoctrineBundle\Mapping; 
 
use Doctrine\ORM\Mapping\ClassMetadataInfo; 
use Doctrine\Persistence\Mapping\ClassMetadata; 
use Doctrine\Persistence\Mapping\Driver\MappingDriver as MappingDriverInterface; 
use Psr\Container\ContainerInterface; 
 
class MappingDriver implements MappingDriverInterface 
{ 
    private MappingDriverInterface $driver; 
    private ContainerInterface $idGeneratorLocator; 
 
    public function __construct(MappingDriverInterface $driver, ContainerInterface $idGeneratorLocator) 
    { 
        $this->driver             = $driver; 
        $this->idGeneratorLocator = $idGeneratorLocator; 
    } 
 
    /** 
     * {@inheritDoc} 
     */ 
    public function getAllClassNames() 
    { 
        return $this->driver->getAllClassNames(); 
    } 
 
    /** 
     * {@inheritDoc} 
     */ 
    public function isTransient($className): bool 
    { 
        return $this->driver->isTransient($className); 
    } 
 
    /** 
     * {@inheritDoc} 
     */ 
    public function loadMetadataForClass($className, ClassMetadata $metadata): void 
    { 
        $this->driver->loadMetadataForClass($className, $metadata); 
 
        if ( 
            ! $metadata instanceof ClassMetadataInfo 
            || $metadata->generatorType !== ClassMetadataInfo::GENERATOR_TYPE_CUSTOM 
            || ! isset($metadata->customGeneratorDefinition['class']) 
            || ! $this->idGeneratorLocator->has($metadata->customGeneratorDefinition['class']) 
        ) { 
            return; 
        } 
 
        $idGenerator = $this->idGeneratorLocator->get($metadata->customGeneratorDefinition['class']); 
        $metadata->setCustomGeneratorDefinition(['instance' => $idGenerator] + $metadata->customGeneratorDefinition); 
        $metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_NONE); 
    } 
 
    /** 
     * Returns the inner driver 
     */ 
    public function getDriver(): MappingDriverInterface 
    { 
        return $this->driver; 
    } 
}