CompileClassMetaInfo::__invoke()   A
last analyzed

Complexity

Conditions 4
Paths 4

Size

Total Lines 25
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 15
c 1
b 0
f 0
dl 0
loc 25
rs 9.7666
cc 4
nc 4
nop 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace BEAR\Package\Compiler;
6
7
use BEAR\Resource\Exception\ParameterException;
8
use BEAR\Resource\NamedParameterInterface;
9
use Doctrine\Common\Annotations\Reader;
10
use ReflectionClass;
11
12
use function in_array;
13
use function is_callable;
14
use function sprintf;
15
use function str_starts_with;
16
17
final class CompileClassMetaInfo
18
{
19
    /**
20
     * Save annotation and method meta information
21
     *
22
     * @param class-string<T> $className
0 ignored issues
show
Documentation Bug introduced by
The doc comment class-string<T> at position 0 could not be parsed: Unknown type name 'class-string' at position 0 in class-string<T>.
Loading history...
23
     *
24
     * @template T of object
25
     */
26
    public function __invoke(Reader $reader, NamedParameterInterface $namedParams, string $className): void
27
    {
28
        $class = new ReflectionClass($className);
29
        $instance = $class->newInstanceWithoutConstructor();
30
31
        $reader->getClassAnnotations($class);
32
        $methods = $class->getMethods();
33
        $log = sprintf('M %s:', $className);
34
        foreach ($methods as $method) {
35
            $methodName = $method->getName();
36
            if ($this->isMagicMethod($methodName)) {
37
                continue;
38
            }
39
40
            if (str_starts_with($methodName, 'on')) {
41
                $log .= sprintf(' %s', $methodName);
42
                $this->saveNamedParam($namedParams, $instance, $methodName);
43
            }
44
45
            // method annotation
46
            $reader->getMethodAnnotations($method);
47
            $log .= sprintf('@ %s', $methodName);
48
        }
49
50
        unset($log); // break here to see the $log
51
    }
52
53
    private function isMagicMethod(string $method): bool
54
    {
55
        return in_array($method, ['__sleep', '__wakeup', 'offsetGet', 'offsetSet', 'offsetExists', 'offsetUnset', 'count', 'ksort', 'asort', 'jsonSerialize'], true);
56
    }
57
58
    private function saveNamedParam(NamedParameterInterface $namedParameter, object $instance, string $method): void
59
    {
60
        // named parameter
61
        if (! in_array($method, ['onGet', 'onPost', 'onPut', 'onPatch', 'onDelete', 'onHead'], true)) {
62
            return;  // @codeCoverageIgnore
63
        }
64
65
        $callable = [$instance, $method];
66
        if (! is_callable($callable)) {
67
            return;  // @codeCoverageIgnore
68
        }
69
70
        try {
71
            $namedParameter->getParameters($callable, []);
72
        } catch (ParameterException) {
73
            return;
74
        }
75
    }
76
}
77