Passed
Push — master ( c81098...521ad8 )
by Paul
02:34
created

CoreTrait::cleanTraits()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 3
nc 2
nop 1
dl 0
loc 6
ccs 4
cts 4
cp 1
crap 2
rs 10
c 0
b 0
f 0
1
<?php /** @noinspection ALL */
2
3
declare(strict_types=1);
4
5
namespace Mcneely\Core\Traits;
6
7
use Mcneely\Core\CoreObject;
8
9
trait CoreTrait
10
{
11
    /** @var CoreObject */
12
    private $CoreTrait_CoreObject = null;
13
14
    /** @var bool $CoreTrait_hasSetUp */
15
    private $CoreTrait_hasSetUp = false;
16
17
    /** @var array $CoreTrait_events */
18
    private $CoreTrait_events = [];
19
20
    /**
21
     * @return CoreObject
22
     */
23 8
    protected function CoreTrait_getCoreObject(): CoreObject
24
    {
25 8
        $this->CoreTrait_fireEvents($this, __CLASS__, __METHOD__, __TRAIT__);
26
27 8
        return $this->CoreTrait_CoreObject;
28
    }
29
30
    /** @noinspection PhpUnusedParameterInspection */
31
32
    /**
33
     * @param object $eventClassObject    -- object as function type not introduced until 7.2
34
     * @param string $eventImmediateClass
35
     * @param string $eventMethod
36
     * @param string $eventTrait
37
     *
38
     * @return self
39
     */
40 11
    protected function CoreTrait_fireEvents(
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
        $beforeMethod     = '__fireBefore_'.$eventMethodShort;
53 11
        $triggers         = [];
54
55 11
        if (method_exists($eventClassObject, $beforeMethod)) {
56 1
            $triggers[] = [
57 1
                'method'  => $beforeMethod,
58
                'exclude' => [],
59
            ];
60
        }
61
62 11
        $functionTriggers = array_key_exists(
63 11
            $eventMethodShort,
64 11
            $this->CoreTrait_events
65 11
        ) ? $this->CoreTrait_events[$eventMethodShort] : [];
66 11
        $wildCardTriggers = array_key_exists('*', $this->CoreTrait_events) ? $this->CoreTrait_events['*'] : [];
67 11
        $triggers         = array_merge($triggers, $functionTriggers, $wildCardTriggers);
68
69 11
        foreach ($triggers as $trigger) {
70 2
            if (!in_array($eventMethodShort, $trigger['exclude'])) {
71 2
                $method = $trigger['method'];
72 2
                if ($method instanceof \Closure) {
73 1
                    $closure = \Closure::bind($method, $eventClassObject);
74 1
                    $closure();
75
                } else {
76 2
                    $eventClassObject->$method();
77
                }
78
            }
79
        }
80
81 11
        return $this;
82
    }
83
84
    /**
85
     * @param object $eventClassObject
86
     * @param string $eventImmediateClass
87
     */
88 11
    private function CoreTrait_fireStartup($eventClassObject, $eventImmediateClass): void
89
    {
90 11
        $this->CoreTrait_hasSetUp = true;
91 11
        $traits                   = array_merge(class_uses($eventImmediateClass), class_uses($eventClassObject));
92 11
        $traits = $this->cleanTraits($traits);
93
94 11
        $methods = preg_grep('/^__setUp_/', get_class_methods(get_class($eventClassObject)));
95
96 11
        foreach ($methods as $method) {
97 1
            if (in_array(substr($method, 8), $traits)) {
98 1
                $eventClassObject->$method();
99
            }
100
        }
101 11
    }
102
103 11
    protected function cleanTraits(array $traits): array {
104 11
        foreach ($traits as $key => $trait) {
105 11
            $traits[$key] = basename(str_replace('\\', '/', $trait));
106
        }
107
108 11
        return $traits;
109
    }
110
111
    /**
112
     * @param mixed $object
113
     *
114
     * @return self
115
     */
116 11
    protected function CoreTrait_setCoreObject($object = null): self
117
    {
118 11
        $this->CoreTrait_hasSetUp   = false;
119 11
        $this->CoreTrait_events     = [];
120 11
        $this->CoreTrait_CoreObject = ($object instanceof CoreObject) ? $object : new CoreObject($object);
121 11
        $this->CoreTrait_fireEvents($this, __CLASS__, __METHOD__, __TRAIT__);
122
123 11
        return $this;
124
    }
125
126 3
    protected function CoreTrait_registerEvent($onFunction, $triggerMethod, array $exclude = []): self
127
    {
128 3
        $this->CoreTrait_events[$onFunction][] = [
129 3
            'method'  => $triggerMethod,
130 3
            'exclude' => ('*' === $onFunction) ? $exclude : [],
131
        ];
132
133 3
        return $this;
134
    }
135
136 1
    protected function CoreTrait_require(array $traits, $currentTrait) {
137 1
        $classTraits = class_uses($this);
138
139 1
        foreach ($traits as $trait) {
140 1
            if(!in_array($trait, $classTraits)) {
141 1
                throw new \Exception("{$currentTrait} requaires trait {$trait}");
142
            }
143
        }
144
145 1
    }
146
}
147