Skip to content

Commit a04386e

Browse files
committed
EnumMap allows only enums of the same type as given on constructor
1 parent 3dc462f commit a04386e

File tree

1 file changed

+36
-31
lines changed

1 file changed

+36
-31
lines changed

src/MabeEnum/EnumMap.php

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,84 +3,89 @@
33
namespace MabeEnum;
44

55
use SplObjectStorage;
6+
use InvalidArgumentException;
67

78
class EnumMap extends SplObjectStorage
89
{
910

1011
public function __construct($enumClass)
1112
{
13+
if (!is_subclass_of($enumClass, 'MabeEnum\Enum')) {
14+
throw new InvalidArgumentException(
15+
"This EnumMap can only handle subclasses of 'MabeEnum\Enum'"
16+
);
17+
}
1218
$this->enumClass = $enumClass;
1319
}
1420

1521
public function attach($enum, $data = null)
1622
{
17-
if (!($enum instanceof $this->enumClass)) {
18-
$enum = call_user_func(array($this->enumClass, 'get'), $enum);
19-
}
20-
23+
$this->initEnum($enum);
2124
parent::attach($enum, $data);
2225
}
2326

2427
public function contains($enum)
2528
{
26-
if (!($enum instanceof $this->enumClass)) {
27-
$enum = call_user_func(array($this->enumClass, 'get'), $enum);
28-
}
29-
29+
$this->initEnum($enum);
3030
return parent::contains($enum);
3131
}
3232

3333
public function detach($enum)
3434
{
35-
if (!($enum instanceof $this->enumClass)) {
36-
$enum = call_user_func(array($this->enumClass, 'get'), $enum);
37-
}
38-
35+
$this->initEnum($enum);
3936
parent::detach($enum);
4037
}
4138

4239
public function getHash($enum)
4340
{
44-
if (!($enum instanceof $this->enumClass)) {
45-
$enum = call_user_func(array($this->enumClass, 'get'), $enum);
46-
}
47-
41+
$this->initEnum($enum);
4842
return parent::getHash($enum);
4943
}
5044

5145
public function offsetExists($enum)
5246
{
53-
if (!($enum instanceof $this->enumClass)) {
54-
$enum = call_user_func(array($this->enumClass, 'get'), $enum);
55-
}
56-
47+
$this->initEnum($enum);
5748
return parent::offsetExists($enum);
5849
}
5950

6051
public function offsetGet($enum)
6152
{
62-
if (!($enum instanceof $this->enumClass)) {
63-
$enum = call_user_func(array($this->enumClass, 'get'), $enum);
64-
}
65-
53+
$this->initEnum($enum);
6654
return parent::offsetGet($enum);
6755
}
6856

6957
public function offsetSet($enum, $data = null)
7058
{
71-
if (!($enum instanceof $this->enumClass)) {
72-
$enum = call_user_func(array($this->enumClass, 'get'), $enum);
73-
}
74-
59+
$this->initEnum($enum);
7560
parent::offsetSet($enum, $data);
7661
}
7762

7863
public function offsetUnset($enum)
7964
{
80-
if (!($enum instanceof $this->enumClass)) {
81-
$enum = call_user_func(array($this->enumClass, 'get'), $enum);
65+
$this->initEnum($enum);
66+
parent::offsetUnset($enum, $data);
67+
}
68+
69+
private function initEnum(&$enum)
70+
{
71+
// auto instantiate
72+
if (is_scalar($enum)) {
73+
$enumClass = $this->enumClass;
74+
$enum = $enumClass::get($enum);
75+
return;
8276
}
8377

84-
parent::offsetUnset($enum, $data);
78+
// allow only enums of the same type
79+
// (don't allow instance of)
80+
$enumClass = get_class($enum);
81+
if ($enumClass && strcasecmp($enumClass, $this->enumClass) === 0) {
82+
return;
83+
}
84+
85+
throw new InvalidArgumentException(sprintf(
86+
"The given enum of type '%s' isn't same as the required type '%s'",
87+
get_class($enum) ?: gettype($enum),
88+
$this->enumClass
89+
));
8590
}
8691
}

0 commit comments

Comments
 (0)