CoreTrait   A
last analyzed

Complexity

Total Complexity 26

Size/Duplication

Total Lines 177
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 26
eloc 61
dl 0
loc 177
ccs 67
cts 67
cp 1
rs 10
c 0
b 0
f 0

10 Methods

Rating   Name   Duplication   Size   Complexity  
A CoreTrait_getCoreObject() 0 5 1
A cleanTraits() 0 7 2
A CoreTrait_fireEvents() 0 16 3
A CoreTrait_fireStartup() 0 11 3
A CoreTrait_require() 0 7 3
A CoreTrait_processTriggers() 0 15 4
A CoreTrait_registerEvent() 0 8 2
A CoreTrait_setCoreObject() 0 8 2
A CoreTrait_buildTriggers() 0 19 4
A getAllTraits() 0 9 2
1
<?php
2
3
4
declare(strict_types=1);
5
6
namespace Mcneely\Core\Traits;
7
8
use Mcneely\Core\CoreObject;
9
10
trait CoreTrait
11
{
12
    /** @var CoreObject */
13
    private $CoreTrait_CoreObject = null;
14
15
    /** @var bool $CoreTrait_hasSetUp */
16
    private $CoreTrait_hasSetUp = false;
17
18
    /** @var array $CoreTrait_events */
19
    private $CoreTrait_events = [];
20
21
    /**
22
     * @return CoreObject
23
     */
24 8
    protected function CoreTrait_getCoreObject(): CoreObject
25
    {
26 8
        $this->CoreTrait_fireEvents($this, __CLASS__, __METHOD__, __TRAIT__);
27
28 8
        return $this->CoreTrait_CoreObject;
29
    }
30
31
    /**
32
     * @param object $eventClassObject    -- object as function type not introduced until 7.2
33
     * @param string $eventImmediateClass
34
     * @param string $eventMethod
35
     * @param string $eventTrait
36
     *
37
     * @return self
38
     */
39 11
    protected function CoreTrait_fireEvents(
40
        /* @noinspection PhpUnusedParameterInspection */
41
        $eventClassObject,
42
        ?string $eventImmediateClass = '',
43
        ?string $eventMethod = '',
44
        ?string $eventTrait = ''
45
    ): self {
46 11
        if (!$this->CoreTrait_hasSetUp) {
47 11
            $this->CoreTrait_fireStartup($eventClassObject, $eventImmediateClass);
48
        }
49
50 11
        $eventMethodArray = !empty($eventMethod) ? explode('::', $eventMethod) : [];
51 11
        $eventMethodShort = array_pop($eventMethodArray);
52 11
        $triggers         = $this->CoreTrait_buildTriggers($eventClassObject, $eventMethodShort); /**/
53
54 11
        return $this->CoreTrait_processTriggers($triggers, $eventClassObject, $eventMethodShort);
55
    }
56
57
    /**
58
     * @param object $eventClassObject
59
     * @param string $eventImmediateClass
60
     */
61 11
    private function CoreTrait_fireStartup($eventClassObject, $eventImmediateClass): void
62
    {
63 11
        $this->CoreTrait_hasSetUp = true;
64 11
        $traits                   = array_merge(class_uses($eventImmediateClass), class_uses($eventClassObject));
65 11
        $traits                   = $this->cleanTraits($traits);
66
67 11
        $methods = preg_grep('/^__setUp_/', get_class_methods(get_class($eventClassObject)));
68
69 11
        foreach ($methods as $method) {
70 1
            if (in_array(substr($method, 8), $traits)) {
71 1
                $eventClassObject->$method();
72
            }
73
        }
74 11
    }
75
76 11
    protected function cleanTraits(array $traits): array
77
    {
78 11
        foreach ($traits as $key => $trait) {
79 11
            $traits[$key] = basename(str_replace('\\', '/', $trait));
80
        }
81
82 11
        return $traits;
83
    }
84
85
    /**
86
     * @param object $eventClassObject
87
     * @param string $eventMethodShort
88
     *
89
     * @return array
90
     */
91 11
    protected function CoreTrait_buildTriggers($eventClassObject, ?string $eventMethodShort): array
92
    {
93 11
        $beforeMethod = '__fireBefore_'.$eventMethodShort;
94 11
        $triggers     = [];
95
96 11
        if (method_exists($eventClassObject, $beforeMethod)) {
97 1
            $triggers[] = [
98 1
                'method'  => $beforeMethod,
99
                'exclude' => [],
100
            ];
101
        }
102
103 11
        $functionTriggers = array_key_exists(
104 11
            $eventMethodShort,
105 11
            $this->CoreTrait_events
106 11
        ) ? $this->CoreTrait_events[$eventMethodShort] : [];
107 11
        $wildCardTriggers = array_key_exists('*', $this->CoreTrait_events) ? $this->CoreTrait_events['*'] : [];
108
109 11
        return array_merge($triggers, $functionTriggers, $wildCardTriggers);
110
    }
111
112
    /**
113
     * @param array       $triggers
114
     * @param object      $eventClassObject
115
     * @param string|null $eventMethodShort
116
     *
117
     * @return self
118
     */
119 11
    protected function CoreTrait_processTriggers(array $triggers, $eventClassObject, ?string $eventMethodShort): self
120
    {
121 11
        foreach ($triggers as $trigger) {
122 2
            if (!in_array($eventMethodShort, $trigger['exclude'])) {
123 2
                $method = $trigger['method'];
124 2
                if ($method instanceof \Closure) {
125 1
                    $closure = \Closure::bind($method, $eventClassObject);
126 1
                    $closure();
127
                } else {
128 2
                    $eventClassObject->$method();
129
                }
130
            }
131
        }
132
133 11
        return $this;
134
    }
135
136
    /**
137
     * @param mixed $object
138
     *
139
     * @return self
140
     */
141 11
    protected function CoreTrait_setCoreObject($object = null): self
142
    {
143 11
        $this->CoreTrait_hasSetUp   = false;
144 11
        $this->CoreTrait_events     = [];
145 11
        $this->CoreTrait_CoreObject = ($object instanceof CoreObject) ? $object : new CoreObject($object);
146 11
        $this->CoreTrait_fireEvents($this, __CLASS__, __METHOD__, __TRAIT__);
147
148 11
        return $this;
149
    }
150
151 3
    protected function CoreTrait_registerEvent($onFunction, $triggerMethod, array $exclude = []): self
152
    {
153 3
        $this->CoreTrait_events[$onFunction][] = [
154 3
            'method'  => $triggerMethod,
155 3
            'exclude' => ('*' === $onFunction) ? $exclude : [],
156
        ];
157
158 3
        return $this;
159
    }
160
161
    /**
162
     * @param array $traits
163
     * @param       $currentTrait
164
     *
165
     * @throws \Exception
166
     */
167 1
    protected function CoreTrait_require(array $traits, $currentTrait)
168
    {
169 1
        $classTraits = $this->getAllTraits($this);
170
171 1
        foreach ($traits as $trait) {
172 1
            if (!in_array($trait, $classTraits)) {
173 1
                throw new \Exception("{$currentTrait} requires trait {$trait}");
174
            }
175
        }
176 1
    }
177
178 1
    protected function getAllTraits($object)
179
    {
180 1
        $objects = array_merge([$object], class_parents($object));
181 1
        $traits  = [];
182 1
        foreach ($objects as $object) {
0 ignored issues
show
introduced by
$object is overwriting one of the parameters of this function.
Loading history...
183 1
            $traits = array_merge(class_uses($object), $traits);
184
        }
185
186 1
        return array_unique($traits);
187
    }
188
}
189