Completed
Push — master ( 439e92...54d259 )
by Peter
08:34
created

ExplicitEnum::serialize()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
c 0
b 0
f 0
ccs 1
cts 1
cp 1
rs 10
cc 1
eloc 2
nc 1
nop 0
crap 1
1
<?php
2
3
/**
4
 * GpsLab component.
5
 *
6
 * @author    Peter Gribanov <[email protected]>
7
 * @copyright Copyright (c) 2011, 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 Enum[]
24
     */
25
    private static $instances = [];
26
27
    /**
28
     * @param mixed $value
29
     */
30
    final private function __construct($value)
31
    {
32
        $this->value = $value;
33
    }
34
35 1
    /**
36
     * @param mixed $value
37 1
     *
38 1
     * @return Enum
39
     */
40
    final public static function byValue($value)
41
    {
42
        $key = get_called_class().'|'.$value;
43
44
        // limitation of count object instances
45 15
        if (!isset(self::$instances[$key])) {
46
            if (!array_key_exists($value, static::choices())) {
47 15
                throw OutOfEnumException::invalidValue($value, get_called_class());
48
            }
49
50 15
            self::$instances[$key] = new static($value);
51 2
        }
52 1
53
        return self::$instances[$key];
54
    }
55 1
56 1
    /**
57
     * @return mixed
58 14
     */
59
    final public function value()
60
    {
61
        return $this->value;
62
    }
63
64 7
    /**
65
     * Available values.
66 7
     *
67
     * @return Enum[]
68
     */
69
    final public static function values()
70
    {
71
        $values = [];
72
        foreach (static::choices() as $value => $label) {
73
            $values[$label] = self::byValue($value);
74 1
        }
75
76 1
        return $values;
77
    }
78 1
79 1
    /**
80 1
     * @param Enum $enum
81 1
     *
82 1
     * @return bool
83 1
     */
84
    final public function equals(Enum $enum)
85 1
    {
86
        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 6
     */
94
    public function __toString()
95 6
    {
96
        return static::choices()[$this->value()];
97
    }
98
99
    final public function __clone()
100
    {
101
        throw new \LogicException('Enumerations are not cloneable');
102
    }
103
104
    /**
105 5
     * @return mixed
106
     */
107 5
    public function serialize()
108
    {
109
        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
    }
119
}
120