@@ 7-69 (lines=63) @@ | ||
4 | /** |
|
5 | * @author Tomasz Kowalczyk <[email protected]> |
|
6 | */ |
|
7 | final class HydratorContainer implements HydratorContainerInterface |
|
8 | { |
|
9 | private $handlers = array(); |
|
10 | private $interfaces = array(); |
|
11 | private $aliases = array(); |
|
12 | ||
13 | public function add($class, $root, $handler) |
|
14 | { |
|
15 | if(false === is_callable($handler)) { |
|
16 | throw new \RuntimeException(sprintf('Invalid handler for class %s!', $class)); |
|
17 | } |
|
18 | ||
19 | if(class_exists($class)) { |
|
20 | $this->aliases[$class] = $root; |
|
21 | $this->handlers[$class] = $handler; |
|
22 | } elseif(interface_exists($class)) { |
|
23 | $this->aliases[$class] = $root; |
|
24 | $this->interfaces[$class] = $handler; |
|
25 | } else { |
|
26 | throw new \RuntimeException(sprintf('Given value %s is neither class nor interface name!', $class)); |
|
27 | } |
|
28 | } |
|
29 | ||
30 | public function addAlias($alias, $class) |
|
31 | { |
|
32 | $handler = $this->getHandler($class); |
|
33 | ||
34 | if(null === $handler) { |
|
35 | throw new \RuntimeException(sprintf('Handler for class %s does not exist!', $class)); |
|
36 | } |
|
37 | ||
38 | $this->handlers[$alias] = $handler; |
|
39 | $this->aliases[$alias] = $this->aliases[$class]; |
|
40 | } |
|
41 | ||
42 | public function getRoot($class) |
|
43 | { |
|
44 | return $this->aliases[$class]; |
|
45 | } |
|
46 | ||
47 | public function getHandler($class) |
|
48 | { |
|
49 | if(array_key_exists($class, $this->handlers)) { |
|
50 | return $this->handlers[$class]; |
|
51 | } |
|
52 | ||
53 | $parents = array_intersect(array_keys($this->handlers), class_parents($class)); |
|
54 | if($parents) { |
|
55 | return $this->handlers[array_pop($parents)]; |
|
56 | } |
|
57 | ||
58 | $interfaces = array_intersect(array_keys($this->interfaces), array_values(class_implements($class))); |
|
59 | if($interfaces) { |
|
60 | if(count($interfaces) > 1) { |
|
61 | throw new \RuntimeException(sprintf('Class %s implements interfaces with colliding handlers!', $class)); |
|
62 | } |
|
63 | ||
64 | return $this->interfaces[$interfaces[0]]; |
|
65 | } |
|
66 | ||
67 | return null; |
|
68 | } |
|
69 | } |
|
70 |
@@ 7-69 (lines=63) @@ | ||
4 | /** |
|
5 | * @author Tomasz Kowalczyk <[email protected]> |
|
6 | */ |
|
7 | final class NormalizerContainer implements NormalizerContainerInterface |
|
8 | { |
|
9 | private $handlers = array(); |
|
10 | private $interfaces = array(); |
|
11 | private $aliases = array(); |
|
12 | ||
13 | public function add($class, $root, $handler) |
|
14 | { |
|
15 | if(false === is_callable($handler)) { |
|
16 | throw new \RuntimeException(sprintf('Invalid handler for class %s!', $class)); |
|
17 | } |
|
18 | ||
19 | if(class_exists($class)) { |
|
20 | $this->aliases[$class] = $root; |
|
21 | $this->handlers[$class] = $handler; |
|
22 | } elseif(interface_exists($class)) { |
|
23 | $this->aliases[$class] = $root; |
|
24 | $this->interfaces[$class] = $handler; |
|
25 | } else { |
|
26 | throw new \RuntimeException(sprintf('Given value %s is neither class nor interface name!', $class)); |
|
27 | } |
|
28 | } |
|
29 | ||
30 | public function addAlias($alias, $class) |
|
31 | { |
|
32 | $handler = $this->getHandler($class); |
|
33 | ||
34 | if(null === $handler) { |
|
35 | throw new \RuntimeException(sprintf('Handler for class %s does not exist!', $class)); |
|
36 | } |
|
37 | ||
38 | $this->handlers[$alias] = $handler; |
|
39 | $this->aliases[$alias] = $this->aliases[$class]; |
|
40 | } |
|
41 | ||
42 | public function getRoot($class) |
|
43 | { |
|
44 | return $this->aliases[$class]; |
|
45 | } |
|
46 | ||
47 | public function getHandler($class) |
|
48 | { |
|
49 | if(array_key_exists($class, $this->handlers)) { |
|
50 | return $this->handlers[$class]; |
|
51 | } |
|
52 | ||
53 | $parents = array_intersect(array_keys($this->handlers), class_parents($class)); |
|
54 | if($parents) { |
|
55 | return $this->handlers[array_pop($parents)]; |
|
56 | } |
|
57 | ||
58 | $interfaces = array_intersect(array_keys($this->interfaces), array_values(class_implements($class))); |
|
59 | if($interfaces) { |
|
60 | if(count($interfaces) > 1) { |
|
61 | throw new \RuntimeException(sprintf('Class %s implements interfaces with colliding handlers!', $class)); |
|
62 | } |
|
63 | ||
64 | return $this->interfaces[$interfaces[0]]; |
|
65 | } |
|
66 | ||
67 | return null; |
|
68 | } |
|
69 | } |
|
70 |