/
Attribute.php
101 lines (74 loc) · 2.27 KB
/
Attribute.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<?php
namespace Livewire\Features\SupportAttributes;
use Livewire\Component;
abstract class Attribute
{
protected Component $component;
protected $subTarget;
protected $subName;
protected AttributeLevel $level;
protected $levelName;
function __boot($component, AttributeLevel $level, $name = null, $subName = null, $subTarget = null)
{
$this->component = $component;
$this->subName = $subName;
$this->subTarget = $subTarget;
$this->level = $level;
$this->levelName = $name;
}
function getComponent()
{
return $this->component;
}
function getSubTarget()
{
return $this->subTarget;
}
function getSubName()
{
return $this->subName;
}
function getLevel()
{
return $this->level;
}
function getName()
{
return $this->levelName;
}
function getValue()
{
if ($this->level !== AttributeLevel::PROPERTY) {
throw new \Exception('Can\'t set the value of a non-property attribute.');
}
return data_get($this->component->all(), $this->levelName);
}
function setValue($value)
{
if ($this->level !== AttributeLevel::PROPERTY) {
throw new \Exception('Can\'t set the value of a non-property attribute.');
}
if ($enum = $this->tryingToSetStringOrIntegerToEnum($value)) {
$value = $enum::from($value);
}
data_set($this->component, $this->levelName, $value);
}
protected function tryingToSetStringOrIntegerToEnum($subject)
{
if (! is_string($subject) && ! is_int($subject)) return;
$target = $this->subTarget ?? $this->component;
$name = $this->subName ?? $this->levelName;
$property = str($name)->before('.')->toString();
$reflection = new \ReflectionProperty($target, $property);
$type = $reflection->getType();
// If the type is available, display its name
if ($type instanceof \ReflectionNamedType) {
$name = $type->getName();
// If the type is a BackedEnum then return it's name
if (is_subclass_of($name, \BackedEnum::class)) {
return $name;
}
}
return false;
}
}