Passed
Push — traitrefactor ( dd3c0f...b1122e )
by Joe
03:48
created

get_ancestor_property()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 7
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 2
1
<?php
2
3
namespace PhpWinTools\WmiScripting\Support {
4
5
    use PhpWinTools\WmiScripting\Collections\ArrayCollection;
6
    use PhpWinTools\WmiScripting\Connection;
7
    use PhpWinTools\WmiScripting\Configuration\Config;
8
    use PhpWinTools\WmiScripting\Configuration\Resolver;
9
    use PhpWinTools\WmiScripting\Exceptions\InvalidConnectionException;
10
    use ReflectionClass;
11
12
    /**
13
     * @param Config|null $config
14
     *
15
     * @return Config
16
     */
17
    function core(Config $config = null)
18
    {
19
        return $config ?? Config::instance();
20
    }
21
22
    /**
23
     * @param Connection|string|null $connection
24
     * @param Connection|string|null $default
25
     * @param Config|null            $config
26
     *
27
     * @return Connection|string|null
28
     */
29
    function connection($connection = null, $default = null, Config $config = null)
30
    {
31
        if (is_null($connection) && is_null($default)) {
32
            return core($config)->getConnection();
33
        }
34
35
        if (is_string($connection) && trim($connection) !== '') {
36
            $connection = core($config)->getConnection($connection);
37
        }
38
39
        if (!$connection instanceof Connection && $default) {
40
            return connection($default, null, core($config));
41
        }
42
43
        if (!$connection instanceof Connection) {
44
            throw InvalidConnectionException::new($connection);
45
        }
46
47
        return $connection;
48
    }
49
50
    /**
51
     * @param string|null $class
52
     * @param mixed       $parameters
53
     *
54
     * @return Resolver|mixed|null
55
     */
56
    function resolve(string $class = null, ...$parameters)
57
    {
58
        return core()($class, $parameters);
59
    }
60
61
    function get_ancestor_property($class, $property_name)
62
    {
63
        $class = is_object($class) ? get_class($class) : $class;
64
65
        return ArrayCollection::collect(class_parents($class))->map(function ($class) use ($property_name) {
66
            return (new ReflectionClass($class))->getDefaultProperties()[$property_name] ?? [];
67
        })->values()->collapse()->toArray();
68
    }
69
70
    /**
71
     * Expects either a class name or instance and will return if the given trait exists on the class.
72
     *
73
     * @param $class
74
     * @param $trait
75
     *
76
     * @return bool
77
     */
78
    function class_has_trait($class, $trait): bool
79
    {
80
        return array_key_exists($trait, class_traits(is_object($class) ? get_class($class) : $class));
81
    }
82
83
    /**
84
     * Returns all traits of the given class or instance. It also checks the traits for any used traits.
85
     *
86
     * @param $class
87
     *
88
     * @return array
89
     */
90
    function class_traits($class)
91
    {
92
        $class = is_object($class) ? get_class($class) : $class;
93
94
        $traits = class_uses($class);
95
96
        while ($class = get_parent_class($class)) {
97
            $traits += class_uses($class);
98
        }
99
100
        $trait_traits = [];
101
102
        foreach ($traits as $trait) {
103
            $trait_traits += trait_traits($trait);
104
        }
105
106
        return array_merge($trait_traits, $traits);
107
    }
108
109
    /**
110
     * Returns all of the traits that a trait uses including it's ancestors.
111
     *
112
     * @param $trait_name
113
     * @return array
114
     */
115
    function trait_traits($trait_name)
116
    {
117
        $traits = class_uses($trait_name);
118
119
        foreach ($traits as $trait) {
120
            $traits += trait_traits($trait);
121
        }
122
123
        return $traits;
124
    }
125
}
126