Completed
Push — master ( 6e4db0...a3fffb )
by Hong
01:52
created

ProcessorAwareTrait::getClassTree()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 10
rs 9.9332
c 0
b 0
f 0
cc 2
nc 2
nop 0
1
<?php
2
3
/**
4
 * Phoole (PHP7.2+)
5
 *
6
 * @category  Library
7
 * @package   Phoole\Logger
8
 * @copyright Copyright (c) 2019 Hong Zhang
9
 */
10
declare(strict_types=1);
11
12
namespace Phoole\Logger\Processor;
13
14
use Phoole\Base\Queue\UniquePriorityQueue;
15
16
/**
17
 * ProcessorAwareTrait
18
 *
19
 * @package Phoole\Logger
20
 */
21
trait ProcessorAwareTrait
22
{
23
    use VerifyCallableTrait;
24
25
    /**
26
     * @var bool
27
     */
28
    protected $isProcessed = FALSE;
29
30
    /**
31
     * @var UniquePriorityQueue[]
32
     */
33
    protected static $processors = [];
34
35
    /**
36
     * Execute all the processors
37
     *
38
     * @return $this
39
     */
40
    public function process()
41
    {
42
        if (!$this->isProcessed) {
43
            foreach (static::getProcessors() as $processor) {
44
                $processor($this);
45
            }
46
            $this->isProcessed = TRUE;
47
        }
48
        return $this;
49
    }
50
51
    /**
52
     * Set processors for THIS class
53
     *
54
     * @param  callable ...$callables
55
     * @return string called class name
56
     * @throws \LogicException if not valid processor found
57
     */
58
    public static function addProcessor(callable ...$callables): string
59
    {
60
        static::initProcessors();
61
62
        $class = \get_called_class();
63
        $queue = self::$processors[$class];
64
65
        foreach ($callables as $callable) {
66
            static::verifyCallable($callable);
67
            $queue->insert($callable);
68
        }
69
        return $class;
70
    }
71
72
    /**
73
     * get related processors
74
     *
75
     * @return iterable
76
     */
77
    protected static function getProcessors(): iterable
78
    {
79
        $queue = new UniquePriorityQueue();
80
81
        /** @var string $class */
82
        foreach (static::getClassTree() as $class) {
83
            if (\method_exists($class, 'initProcessors')) {
84
                $class::initProcessors();
85
            }
86
            $queue = $queue->combine(self::$processors[$class]);
87
        }
88
        return $queue;
89
    }
90
91
    /**
92
     * convert predefined processors from classProcessors()
93
     */
94
    protected static function initProcessors()
95
    {
96
        $class = \get_called_class();
97
        if (!isset(self::$processors[$class])) {
98
            self::$processors[$class] = new UniquePriorityQueue();
99
            foreach (static::classProcessors() as $processor) {
100
                static::addProcessor($processor);
101
            }
102
        }
103
    }
104
105
    /**
106
     * Define processors for THIS class
107
     *
108
     * @return array
109
     */
110
    protected static function classProcessors(): array
111
    {
112
        return [];
113
    }
114
115
    /**
116
     * @return array
117
     */
118
    protected static function getClassTree(): array
119
    {
120
        $tree = [];
121
        $class = \get_called_class();
122
        while ($class) {
123
            $tree[] = $class;
124
            $class = \get_parent_class($class);
125
        }
126
        return \array_reverse($tree);
127
    }
128
}