Completed
Pull Request — master (#3)
by
unknown
12:00
created

Enum::line()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
dl 0
loc 8
ccs 0
cts 0
cp 0
rs 10
c 0
b 0
f 0
cc 3
nc 2
nop 0
crap 12
1
<?php
2
3
namespace DavidIanBonner\Enumerated;
4
5
use Exception;
6
use Illuminate\Support\Collection;
7
use Illuminate\Support\Facades\Lang;
8
use ReflectionClass;
9
10
abstract class Enum
11
{
12
    /** @var string */
13
    private $value;
14
15
    /** @var array */
16
    private static $loaded = [];
17
18
    /** @var array */
19
    protected static $values = [];
20
21
    /**
22
     * @param string $value
23 6
     */
24
    public function __construct($value)
25 6
    {
26 3
        $this->validateValue($value);
27 3
        $this->value = $value;
28
    }
29
30
    /**
31
     * Return the enumerators values.
32
     *
33
     * @param bool $keys
34
     * @return array
35 24
     */
36
    public static function allValues($keys = false): array
37 24
    {
38
        $caller = get_called_class();
39 24
40 9
        if (! isset(static::$values[$caller])) {
41
            static::$values[$caller] = static::getDeclaredConstants();
42
        }
43 24
44
        return $keys ? static::$values[$caller] : array_values(static::$values[$caller]);
45
    }
46
47
    /**
48
     * Return a collection of the declared values.
49
     *
50
     * @param  bool $keys
51
     * @return Illuminate\Support\Collection
52 3
     */
53
    public static function collect($keys = false): Collection
54 3
    {
55
        return Collection::make(static::allValues($keys));
56
    }
57
58
    /**
59
     * Return an instance of a desired value.
60
     *
61
     * @param  string $value
62
     * @return DavidIanBonner\Enumerated\Enum
63 6
     */
64
    public static function ofType($value): self
65 6
    {
66
        $key = get_called_class().':'.$value;
67 6
68 6
        if (! isset(self::$loaded[$key])) {
69
            self::$loaded[$key] = new static($value);
70
        }
71
72
        // We can safely return the instance from the loaded array as
73
        // validation is carried out in the constructor and the
74
        // $loaded property is private.
75 3
76
        return self::$loaded[$key];
77
    }
78
79
    /**
80
     * Return the value.
81
     *
82
     * @return string
83 3
     */
84
    public function value(): string
85 3
    {
86
        return $this->value;
87
    }
88
89
    /**
90
     * Validate the value.
91
     *
92
     * @param  mixed $value
93
     * @throws DavidIanBonner\Enumerated\EnumNotValidException
94
     * @return void
95 12
     */
96
    public static function validateValue($value)
97 12
    {
98 6
        if (! in_array($value, static::allValues())) {
99
            throw new EnumNotValidException("The value [{$value}] is not a valid type.");
100 9
        }
101
    }
102
103
    /**
104
     * Check the value is valid and return a bool.
105
     *
106
     * @param  mixed  $value
107
     * @return bool
108 3
     */
109
    public static function isValid($value): bool
110
    {
111 3
        try {
112 3
            static::validateValue($value);
113 3
        } catch (Exception $e) {
114
            return false;
115
        }
116 3
117
        return true;
118
    }
119
120
    /**
121
     * Get the declared constants.
122
     *
123
     * @return array
124 6
     */
125
    protected static function getDeclaredConstants(): array
126 6
    {
127
        $reflection = new ReflectionClass(get_called_class());
128 6
129
        return (array) $reflection->getConstants();
130
    }
131
132
    /**
133
     * @return array
134
     */
135
    public static function toSelect(): array
136
    {
137
        return static::collect()
138
            ->mapWithKeys(function ($key) {
139
                $outcome = self::ofType($key);
140
141
                return [$outcome->value() => $outcome->line()];
142
            })
143
            ->toArray();
144
    }
145
146
    /**
147
     * @return string
148
     */
149
    public function line(): string
150
    {
151
        $vendor = $this->vendor() ?: null;
152
153
        return Lang::get(
154
            ($vendor ? $vendor.'::' : '').'enum.'.$this->langKey().'.'.str_replace('_', '-', $this->value())
155
        );
156
    }
157
158
    public abstract function langKey(): string;
159
160
    public function vendor()
161
    {}
162
}
163