1<?php
2
3namespace Metadata\Driver;
4
5final class DriverChain implements AdvancedDriverInterface
6{
7    private $drivers;
8
9    public function __construct(array $drivers = array())
10    {
11        $this->drivers = $drivers;
12    }
13
14    public function addDriver(DriverInterface $driver)
15    {
16        $this->drivers[] = $driver;
17    }
18
19    public function loadMetadataForClass(\ReflectionClass $class)
20    {
21        foreach ($this->drivers as $driver) {
22            if (null !== $metadata = $driver->loadMetadataForClass($class)) {
23                return $metadata;
24            }
25        }
26
27        return null;
28    }
29
30    /**
31     * {@inheritDoc}
32     */
33    public function getAllClassNames()
34    {
35        $classes = array();
36        foreach ($this->drivers as $driver) {
37            if (!$driver instanceof AdvancedDriverInterface) {
38                throw new \RuntimeException(
39                    sprintf(
40                        'Driver "%s" must be an instance of "AdvancedDriverInterface" to use '.
41                        '"DriverChain::getAllClassNames()".',
42                        get_class($driver)
43                    )
44                );
45            }
46            $driverClasses = $driver->getAllClassNames();
47            if (!empty($driverClasses)) {
48                $classes = array_merge($classes, $driverClasses);
49            }
50        }
51
52        return $classes;
53    }
54}
55