Completed
Push — master ( dcbe42...49c9b4 )
by Joe
03:56
created

class_traits()   A

Complexity

Conditions 4
Paths 8

Size

Total Lines 17
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

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