Completed
Pull Request — master (#11)
by Eric
21:21 queued 18:00
created

VisitorRegistry::getVisitor()   A

Complexity

Conditions 4
Paths 2

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 6.9849

Importance

Changes 0
Metric Value
dl 0
loc 12
ccs 3
cts 7
cp 0.4286
rs 9.2
c 0
b 0
f 0
cc 4
eloc 7
nc 2
nop 2
crap 6.9849
1
<?php
2
3
/*
4
 * This file is part of the Ivory Serializer package.
5
 *
6
 * (c) Eric GELOEN <[email protected]>
7
 *
8
 * For the full copyright and license information, please read the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Ivory\Serializer\Registry;
13
14
use Ivory\Serializer\Accessor\ReflectionAccessor;
15
use Ivory\Serializer\Direction;
16
use Ivory\Serializer\Format;
17
use Ivory\Serializer\Inflector\DoctrineInflector;
18
use Ivory\Serializer\Instantiator\DoctrineInstantiator;
19
use Ivory\Serializer\Mutator\ReflectionMutator;
20
use Ivory\Serializer\Visitor\Csv\CsvDeserializationVisitor;
21
use Ivory\Serializer\Visitor\Csv\CsvSerializationVisitor;
22
use Ivory\Serializer\Visitor\Json\JsonDeserializationVisitor;
23
use Ivory\Serializer\Visitor\Json\JsonSerializationVisitor;
24
use Ivory\Serializer\Visitor\VisitorInterface;
25
use Ivory\Serializer\Visitor\Xml\XmlDeserializationVisitor;
26
use Ivory\Serializer\Visitor\Xml\XmlSerializationVisitor;
27
use Ivory\Serializer\Visitor\Yaml\YamlDeserializationVisitor;
28
use Ivory\Serializer\Visitor\Yaml\YamlSerializationVisitor;
29
30
/**
31
 * @author GeLo <[email protected]>
32
 */
33
class VisitorRegistry implements VisitorRegistryInterface
34
{
35
    /**
36
     * @var VisitorInterface[][]
37
     */
38
    private $visitors = [];
39
40
    /**
41
     * @param VisitorInterface[][] $visitors
42
     */
43 1032
    public function __construct(array $visitors = [])
44
    {
45 1032
        foreach ($visitors as $direction => $formattedVisitors) {
46 1032
            foreach ($formattedVisitors as $format => $visitor) {
47 1032
                $this->registerVisitor($direction, $format, $visitor);
48 688
            }
49 688
        }
50 1032
    }
51
52
    /**
53
     * @param VisitorInterface[][] $visitors
54
     *
55
     * @return VisitorRegistryInterface
56
     */
57 1032
    public static function create(array $visitors = [])
58 2
    {
59 1032
        $instantiator = new DoctrineInstantiator();
60 1032
        $inflector = new DoctrineInflector();
61 1032
        $accessor = new ReflectionAccessor();
62 1032
        $mutator = new ReflectionMutator();
63
64 1032
        return new static(array_replace_recursive([
65 1032
            Direction::SERIALIZATION => [
66 1032
                Format::CSV  => new CsvSerializationVisitor($accessor),
67 1032
                Format::JSON => new JsonSerializationVisitor($accessor),
68 1032
                Format::XML  => new XmlSerializationVisitor($accessor, $inflector),
69 1032
                Format::YAML => new YamlSerializationVisitor($accessor),
70 688
            ],
71 1032
            Direction::DESERIALIZATION => [
72 1032
                Format::CSV  => new CsvDeserializationVisitor($instantiator, $mutator),
73 1032
                Format::JSON => new JsonDeserializationVisitor($instantiator, $mutator),
74 1032
                Format::XML  => new XmlDeserializationVisitor($instantiator, $mutator, $inflector),
75 1032
                Format::YAML => new YamlDeserializationVisitor($instantiator, $mutator),
76 688
            ],
77 688
        ], $visitors));
78
    }
79
80
    /**
81
     * {@inheritdoc}
82
     */
83 1032
    public function registerVisitor($direction, $format, VisitorInterface $visitor)
84
    {
85 1032
        if (!isset($this->visitors[$direction])) {
86 1032
            $this->visitors[$direction] = [];
87 688
        }
88
89 1032
        $this->visitors[$direction][$format] = $visitor;
90 1032
    }
91
92
    /**
93
     * {@inheritdoc}
94
     */
95 1032
    public function getVisitor($direction, $format)
96
    {
97 1032
        if (!isset($this->visitors[$direction]) || !isset($this->visitors[$direction][$format])) {
98
            throw new \InvalidArgumentException(sprintf(
99
                'The visitor for direction "%s" and format "%s" does not exist.',
100
                $direction === Direction::SERIALIZATION ? 'serialization' : 'deserialization',
101
                $format
102
            ));
103
        }
104
105 1032
        return $this->visitors[$direction][$format];
106
    }
107
}
108