Set::getPhpDocHint()   A
last analyzed

Complexity

Conditions 4
Paths 3

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 10
c 0
b 0
f 0
rs 9.2
cc 4
eloc 5
nc 3
nop 2
1
<?php
2
3
namespace Saxulum\Accessor\Accessors;
4
5
use Saxulum\Accessor\CallbackBag;
6
use Saxulum\Accessor\Prop;
7
8
class Set extends AbstractWrite
9
{
10
    const PREFIX = 'set';
11
12
    /**
13
     * @var array
14
     */
15
    protected static $remoteToPrefixMapping = array(
16
        Prop::REMOTE_ONE => array(Set::PREFIX, Set::PREFIX),
17
        Prop::REMOTE_MANY => array(Remove::PREFIX, Add::PREFIX),
18
    );
19
20
    /**
21
     * @return string
22
     */
23
    public function getPrefix()
24
    {
25
        return self::PREFIX;
26
    }
27
28
    /**
29
     * @param CallbackBag $callbackBag
30
     */
31
    protected function propertyDefault(CallbackBag $callbackBag) {}
32
33
    /**
34
     * @param CallbackBag $callbackBag
35
     */
36
    protected function updateProperty(CallbackBag $callbackBag)
37
    {
38
        if (!$callbackBag->getProp()->hasMethod(Add::PREFIX) && !$callbackBag->getProp()->hasMethod(Remove::PREFIX)) {
39
            $this->updateSimpleProperty($callbackBag);
40
        } else {
41
            $this->updateCollectionProperty($callbackBag);
42
        }
43
    }
44
45
    /**
46
     * @param CallbackBag $callbackBag
47
     */
48
    protected function updateSimpleProperty(CallbackBag $callbackBag)
49
    {
50
        $prefixes = $this->getPrefixByProp($callbackBag->getProp());
51
        $removePrefix = $prefixes[0];
52
        $addPrefix = $prefixes[1];
53
        $value = $callbackBag->getArgument(0);
54
55
        if (null !== $prefixes && !$callbackBag->getArgument(1, false)) {
56
            $mappedBy = $callbackBag->getMappedBy();
57
            $removeMethod = $removePrefix. ucfirst($mappedBy);
58
            $addMethod = $addPrefix. ucfirst($mappedBy);
59
            if (!is_null($callbackBag->getProperty())) {
60
                $callbackBag->getProperty()->$removeMethod(Set::PREFIX !== $removePrefix ? $callbackBag->getObject() : null, true);
61
            }
62
            if (!is_null($value)) {
63
                $value->$addMethod($callbackBag->getObject(), true);
64
            }
65
        }
66
67
        $callbackBag->setProperty($value);
68
    }
69
70
    /**
71
     * @param CallbackBag $callbackBag
72
     */
73
    protected function updateCollectionProperty(CallbackBag $callbackBag)
74
    {
75
        $object = $callbackBag->getObject();
76
        $propertyName = $callbackBag->getName();
77
        $oldValues = $callbackBag->getProperty();
78
        $newValues = $callbackBag->getArgument(0);
79
        $addMethod = Add::PREFIX . ucfirst($propertyName);
80
        $removeMethod = Remove::PREFIX . ucfirst($propertyName);
81
82
        foreach ($oldValues as $oldValue) {
83
            $object->$removeMethod($oldValue);
84
        }
85
86
        foreach ($newValues as $newValue) {
87
            $object->$addMethod($newValue);
88
        }
89
    }
90
91
    /**
92
     * @param  Prop   $prop
93
     * @param  string $namespace
94
     * @return string
95
     */
96
    protected static function getPhpDocHint(Prop $prop, $namespace)
97
    {
98
        if ($prop->hasMethod(Add::PREFIX) || $prop->hasMethod(Remove::PREFIX)) {
99
            return 'array ';
100
        }
101
102
        $hint = $prop->getPhpDocHint($namespace);
103
104
        return '' === $hint ? $hint : $hint . ' ';
105
    }
106
}
107