MapBuilder   A
last analyzed

Complexity

Total Complexity 16

Size/Duplication

Total Lines 129
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 8

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 129
wmc 16
lcom 1
cbo 8
ccs 44
cts 44
cp 1
rs 10

12 Methods

Rating   Name   Duplication   Size   Complexity  
A from() 0 4 1
A to() 0 4 1
A add() 0 9 1
A addMapping() 0 5 1
A addEmbedded() 0 5 1
A addResolver() 0 5 1
A getMap() 0 4 1
A resolveFromRef() 0 4 1
A resolveToRef() 0 4 1
A isValidReferenceType() 0 10 2
A resolveFieldReference() 0 11 3
A setReferenceType() 0 12 2
1
<?php
2
3
namespace Cascade\Mapper\Map;
4
5
use Cascade\Mapper\Field\Reference\ArrayReference;
6
use Cascade\Mapper\Field\Reference\MutatorReference;
7
use Cascade\Mapper\Field\Reference\PropertyReference;
8
use Cascade\Mapper\Field\Reference\ReferenceInterface;
9
use Cascade\Mapper\Map\Exception\InvalidReferenceTypeException;
10
use Cascade\Mapper\Mapping\EmbeddedMapping;
11
use Cascade\Mapper\Mapping\Mapping;
12
use Cascade\Mapper\Mapping\MappingInterface;
13
use Cascade\Mapper\Mapping\ResolverMapping;
14
use Cascade\Mapper\Value\Resolver\ValueResolverInterface;
15
16
class MapBuilder implements MapBuilderInterface
17
{
18
    /**
19
     * @var string
20
     */
21
    private $from = self::REF_ARRAY;
22
23
    /**
24
     * @var MappingInterface[]
25
     */
26
    private $mappings = [];
27
28
    /**
29
     * @var string
30
     */
31
    private $to = self::REF_ARRAY;
32
33 6
    public function from($from)
34
    {
35 6
        return $this->setReferenceType('from', $from);
36
    }
37
38 6
    public function to($to)
39
    {
40 6
        return $this->setReferenceType('to', $to);
41
    }
42
43 3
    public function add($toField, $fromField)
44
    {
45 3
        $destinationReference = $this->resolveToRef($toField);
46 3
        $sourceReference = $this->resolveFromRef($fromField);
47
48 3
        $this->addMapping(new Mapping($destinationReference, $sourceReference));
49
50 3
        return $this;
51
    }
52
53 4
    public function addMapping(MappingInterface $mapping)
54
    {
55 4
        $this->mappings[] = $mapping;
56 4
        return $this;
57
    }
58
59 2
    public function addEmbedded($fromField, MapInterface $map)
60
    {
61 2
        $this->addMapping(new EmbeddedMapping($this->resolveFromRef($fromField), $map));
62 2
        return $this;
63
    }
64
65 2
    public function addResolver($toField, ValueResolverInterface $resolver)
66
    {
67 2
        $this->addMapping(new ResolverMapping($this->resolveToRef($toField), $resolver));
68 2
        return $this;
69
    }
70
71 4
    public function getMap()
72
    {
73 4
        return new Map($this->mappings);
74
    }
75
76
    /**
77
     * @param string $field
78
     * @return ReferenceInterface
79
     */
80 3
    protected function resolveFromRef($field)
81
    {
82 3
        return $this->resolveFieldReference($this->from, $field);
83
    }
84
85
    /**
86
     * @param string $field
87
     * @return ReferenceInterface
88
     */
89 4
    protected function resolveToRef($field)
90
    {
91 4
        return $this->resolveFieldReference($this->to, $field);
92
    }
93
94
    /**
95
     * @param string $referenceType
96
     * @return bool
97
     */
98 8
    private function isValidReferenceType($referenceType)
99
    {
100 8
        $validReferenceTypes = [self::REF_ARRAY, self::REF_CLASS_PROPERTIES, self::REF_CLASS_MUTATORS];
101
102 8
        if (in_array($referenceType, $validReferenceTypes, true)) {
103 6
            return true;
104
        }
105
106 2
        return false;
107
    }
108
109
    /**
110
     * @param string $refType
111
     * @param string $field
112
     * @return ReferenceInterface
113
     */
114 4
    private function resolveFieldReference($refType, $field)
115
    {
116
        switch ($refType) {
117 4
            case self::REF_CLASS_PROPERTIES:
118 2
                return new PropertyReference($field);
119 4
            case self::REF_CLASS_MUTATORS:
120 4
                return new MutatorReference($field);
121 3
            default:
122 3
                return new ArrayReference($field);
123 3
        }
124
    }
125
126
    /**
127
     * @param string $target
128
     * @param string $reference
129
     * @return $this
130
     * @throws InvalidReferenceTypeException
131
     */
132 8
    private function setReferenceType($target, $reference)
133
    {
134 8
        if ($this->isValidReferenceType($reference)) {
135 6
            $this->{$target} = $reference;
136 6
            return $this;
137
        }
138
139 2
        throw new InvalidReferenceTypeException(sprintf(
140 2
            'Reference type "%s" is not valid',
141
            $reference
142 2
        ));
143
    }
144
}
145