ExplicitEnum::values()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 9
ccs 5
cts 5
cp 1
rs 9.9666
c 0
b 0
f 0
cc 2
nc 2
nop 0
crap 2
1
<?php
2
3
/**
4
 * GpsLab component.
5
 *
6
 * @author    Peter Gribanov <[email protected]>
7
 * @copyright Copyright (c) 2017, Peter Gribanov
8
 * @license   http://opensource.org/licenses/MIT
9
 */
10
11
namespace GpsLab\Component\Enum;
12
13
use GpsLab\Component\Enum\Exception\OutOfEnumException;
14
15
abstract class ExplicitEnum implements Enum, \Serializable
16
{
17
    /**
18
     * @var mixed
19
     */
20
    private $value;
21
22
    /**
23
     * @var self[]
24
     */
25
    private static $instances = [];
26
27
    /**
28
     * @param mixed $value
29
     */
30 1
    final private function __construct($value)
31
    {
32 1
        $this->value = $value;
33 1
    }
34
35
    /**
36
     * @param mixed $value
37
     *
38
     * @return self
39
     */
40 15
    final public static function byValue($value)
41
    {
42 15
        $key = get_called_class().'|'.$value;
43
44
        // limitation of count object instances
45 15
        if (!isset(self::$instances[$key])) {
46 2
            if (!array_key_exists($value, static::choices())) {
47 1
                throw OutOfEnumException::invalidValue($value, get_called_class());
48
            }
49
50 1
            self::$instances[$key] = new static($value);
51
        }
52
53 14
        return self::$instances[$key];
54
    }
55
56
    /**
57
     * @return mixed
58
     */
59 7
    final public function value()
60
    {
61 7
        return $this->value;
62
    }
63
64
    /**
65
     * Available values.
66
     *
67
     * @return self[]
68
     */
69 1
    final public static function values()
70
    {
71 1
        $values = [];
72 1
        foreach (static::choices() as $value => $label) {
73 1
            $values[$label] = self::byValue($value);
74
        }
75
76 1
        return $values;
77
    }
78
79
    /**
80
     * @param Enum $enum
81
     *
82
     * @return bool
83
     */
84 6
    final public function equals(Enum $enum)
85
    {
86 6
        return $this === $enum || ($this->value() === $enum->value() && get_called_class() === get_class($enum));
87
    }
88
89
    /**
90
     * Return readable value.
91
     *
92
     * @return string
93
     */
94 3
    public function __toString()
95
    {
96 3
        return static::choices()[$this->value()];
97
    }
98
99 1
    final public function __clone()
100
    {
101 1
        throw new \LogicException('Enumerations are not cloneable');
102
    }
103
104
    /**
105
     * @return mixed
106
     */
107 3
    public function serialize()
108
    {
109 3
        return serialize($this->value);
110
    }
111
112
    /**
113
     * @param mixed $data
114
     */
115 3
    public function unserialize($data)
116
    {
117 3
        static::byValue($this->value = unserialize($data));
118 3
    }
119
}
120