Completed
Push — master ( 1e2cfa...28995d )
by Eric
04:38
created

VisitorRegistry::create()   B

Complexity

Conditions 4
Paths 8

Size

Total Lines 25
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 18
CRAP Score 4

Importance

Changes 0
Metric Value
dl 0
loc 25
ccs 18
cts 18
cp 1
rs 8.5806
c 0
b 0
f 0
cc 4
eloc 20
nc 8
nop 4
crap 4
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\AccessorInterface;
15
use Ivory\Serializer\Accessor\ReflectionAccessor;
16
use Ivory\Serializer\Direction;
17
use Ivory\Serializer\Format;
18
use Ivory\Serializer\Instantiator\DoctrineInstantiator;
19
use Ivory\Serializer\Instantiator\InstantiatorInterface;
20
use Ivory\Serializer\Mutator\MutatorInterface;
21
use Ivory\Serializer\Mutator\ReflectionMutator;
22
use Ivory\Serializer\Visitor\Csv\CsvDeserializationVisitor;
23
use Ivory\Serializer\Visitor\Csv\CsvSerializationVisitor;
24
use Ivory\Serializer\Visitor\Json\JsonDeserializationVisitor;
25
use Ivory\Serializer\Visitor\Json\JsonSerializationVisitor;
26
use Ivory\Serializer\Visitor\VisitorInterface;
27
use Ivory\Serializer\Visitor\Xml\XmlDeserializationVisitor;
28
use Ivory\Serializer\Visitor\Xml\XmlSerializationVisitor;
29
use Ivory\Serializer\Visitor\Yaml\YamlDeserializationVisitor;
30
use Ivory\Serializer\Visitor\Yaml\YamlSerializationVisitor;
31
32
/**
33
 * @author GeLo <[email protected]>
34
 */
35
class VisitorRegistry implements VisitorRegistryInterface
36
{
37
    /**
38
     * @var VisitorInterface[][]
39
     */
40
    private $visitors = [];
41
42
    /**
43
     * @param VisitorInterface[][] $visitors
44
     */
45 1492
    public function __construct(array $visitors = [])
46
    {
47 1492
        foreach ($visitors as $direction => $formattedVisitors) {
48 1492
            foreach ($formattedVisitors as $format => $visitor) {
49 1492
                $this->registerVisitor($direction, $format, $visitor);
50 746
            }
51 746
        }
52 1492
    }
53
54
    /**
55
     * @param VisitorInterface[][]       $visitors
56
     * @param InstantiatorInterface|null $instantiator
57
     * @param AccessorInterface|null     $accessor
58
     * @param MutatorInterface|null      $mutator
59
     *
60
     * @return VisitorRegistryInterface
61
     */
62 1492
    public static function create(
63
        array $visitors = [],
64
        InstantiatorInterface $instantiator = null,
65
        AccessorInterface $accessor = null,
66
        MutatorInterface $mutator = null
67
    ) {
68 1492
        $instantiator = $instantiator ?: new DoctrineInstantiator();
69 1492
        $accessor = $accessor ?: new ReflectionAccessor();
70 1492
        $mutator = $mutator ?: new ReflectionMutator();
71
72 1492
        return new static(array_replace_recursive([
73 1120
            Direction::SERIALIZATION => [
74 1492
                Format::CSV  => new CsvSerializationVisitor($accessor),
75 1492
                Format::JSON => new JsonSerializationVisitor($accessor),
76 1492
                Format::XML  => new XmlSerializationVisitor($accessor),
77 1492
                Format::YAML => new YamlSerializationVisitor($accessor),
78 746
            ],
79 1119
            Direction::DESERIALIZATION => [
80 1492
                Format::CSV  => new CsvDeserializationVisitor($instantiator, $mutator),
81 1492
                Format::JSON => new JsonDeserializationVisitor($instantiator, $mutator),
82 1492
                Format::XML  => new XmlDeserializationVisitor($instantiator, $mutator),
83 1492
                Format::YAML => new YamlDeserializationVisitor($instantiator, $mutator),
84 746
            ],
85 746
        ], $visitors));
86
    }
87
88
    /**
89
     * {@inheritdoc}
90
     */
91 1492
    public function registerVisitor($direction, $format, VisitorInterface $visitor)
92
    {
93 1492
        if (!isset($this->visitors[$direction])) {
94 1492
            $this->visitors[$direction] = [];
95 746
        }
96
97 1492
        $this->visitors[$direction][$format] = $visitor;
98 1492
    }
99
100
    /**
101
     * {@inheritdoc}
102
     */
103 1476
    public function getVisitor($direction, $format)
104
    {
105 1476
        if (!isset($this->visitors[$direction]) || !isset($this->visitors[$direction][$format])) {
106 4
            throw new \InvalidArgumentException(sprintf(
107 4
                'The visitor for direction "%s" and format "%s" does not exist.',
108 4
                $direction === Direction::SERIALIZATION ? 'serialization' : 'deserialization',
109
                $format
110 2
            ));
111
        }
112
113 1472
        return $this->visitors[$direction][$format];
114
    }
115
}
116