Completed
Push — master ( d10f54...00ced4 )
by
unknown
05:32
created

CollectionReference::convertValueToReference()   C

Complexity

Conditions 8
Paths 8

Size

Total Lines 24
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 18
CRAP Score 8

Importance

Changes 0
Metric Value
dl 0
loc 24
rs 5.7377
c 0
b 0
f 0
ccs 18
cts 18
cp 1
cc 8
eloc 19
nc 8
nop 1
crap 8
1
<?php declare(strict_types = 1);
2
/**
3
 * Created by PhpStorm.
4
 * User: root
5
 * Date: 02.08.16
6
 * Time: 0:46.
7
 */
8
namespace samsonframework\container\definition\reference;
9
10
use samsonframework\container\definition\builder\exception\ReferenceNotImplementsException;
11
12
/**
13
 * Class CollectionReference
14
 *
15
 * @author Ruslan Molodyko <[email protected]>
16
 */
17
class CollectionReference implements ReferenceInterface
18
{
19
    /** @var array Value of reference */
20
    protected $collection =  [];
21
22
    /**
23
     * CollectionReference constructor.
24
     *
25
     * @param array|CollectionReference $collection
26
     * @throws \InvalidArgumentException
27
     * @throws ReferenceNotImplementsException
28
     */
29 18
    public function __construct($collection = null)
30
    {
31 18
        if ($collection) {
32 6
            $this->merge($collection);
33
        }
34 18
    }
35
36
    /**
37
     * Merge collections
38
     *
39
     * @param $collection
40
     * @throws \InvalidArgumentException
41
     * @throws ReferenceNotImplementsException
42
     */
43 9
    public function merge($collection)
44
    {
45 9
        if (is_array($collection)) {
46 7
            $this->merge(self::convertArrayToCollection($collection));
47
        } elseif ($collection instanceof CollectionReference) {
48 8
            $this->collection = array_merge($this->collection, $collection->getCollection());
49
        } else {
50 1
            throw new \InvalidArgumentException(sprintf('Wrong type "%s" of collection', gettype($collection)));
51
        }
52 8
    }
53
54
    /**
55
     * Get collection
56
     *
57
     * @return CollectionItem[]
58
     * @throws ReferenceNotImplementsException
59
     */
60 16
    public function getCollection()
61
    {
62 16
        return $this->collection;
63
    }
64
65
    /**
66
     * Add item to collection
67
     *
68
     * @param CollectionItem $collectionItem
69
     * @return CollectionReference
70
     */
71 16
    public function addItem(CollectionItem $collectionItem): CollectionReference
72
    {
73 16
        $this->collection[] = $collectionItem;
74
75 16
        return $this;
76
    }
77
78
    /**
79
     * Convert array to collection reference
80
     *
81
     * @param array $array
82
     * @return CollectionReference
83
     * @throws ReferenceNotImplementsException
84
     * @throws \InvalidArgumentException
85
     */
86 12
    public static function convertArrayToCollection(array $array)
87
    {
88 12
        $collection = new CollectionReference();
89 12
        foreach ($array as $key => $value) {
90 12
            if ($value instanceof CollectionItem) {
91 4
                $collection->addItem($value);
92
            } else {
93
                // Add item to collection
94 10
                $collection->addItem(new CollectionItem(
95 10
                    self::convertValueToReference($key),
96 12
                    self::convertValueToReference($value)
97
                ));
98
            }
99
        }
100 12
        return $collection;
101
    }
102
103
    /**
104
     * Convert value to reference instance
105
     *
106
     * @param $value
107
     * @return ReferenceInterface
108
     * @throws \InvalidArgumentException
109
     * @throws ReferenceNotImplementsException
110
     */
111 18
    public static function convertValueToReference($value)
112
    {
113
        // Convert type to appropriate reference instance
114 18
        if ($value instanceof ReferenceInterface) {
115 6
            $reference = $value;
116 18
        } elseif ($value === null) {
117 1
            $reference = new NullReference();
118 18
        } elseif (is_string($value)) {
119 15
            $reference = new StringReference($value);
120 9
        } elseif (is_int($value)) {
121 8
            $reference = new IntegerReference($value);
122 5
        } elseif (is_float($value)) {
123 1
            $reference = new FloatReference($value);
124 5
        } elseif (is_bool($value)) {
125 2
            $reference = new BoolReference($value);
126 4
        } elseif (is_array($value)) {
127 3
            $reference = new CollectionReference($value);
128
        } else {
129 1
            throw new ReferenceNotImplementsException(sprintf(
130 1
                'Value "%s" does not have convert implementation', gettype($value)
131
            ));
132
        }
133 17
        return $reference;
134
    }
135
}
136