Passed
Push — master ( 921f98...8e8597 )
by Alain
02:39
created

AbstractFinder   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 209
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 83.33%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 16
c 2
b 0
f 0
lcom 1
cbo 4
dl 0
loc 209
ccs 35
cts 42
cp 0.8333
rs 10

12 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 1
A registerFindables() 0 6 2
A registerNullObject() 0 4 1
A getNullObject() 0 6 1
A getFindablesConfigKey() 0 4 1
A getNullObjectConfigKey() 0 4 1
A initializeNullObject() 0 4 1
A initializeFindables() 0 6 1
A initializeFindable() 0 4 1
A maybeInstantiateFindable() 0 21 4
A instantiateFindableFromString() 0 4 1
A instantiateFindableFromCallable() 0 4 1
1
<?php
2
/**
3
 * Bright Nucleus View Component.
4
 *
5
 * @package   BrightNucleus\View
6
 * @author    Alain Schlesser <[email protected]>
7
 * @license   MIT
8
 * @link      http://www.brightnucleus.com/
9
 * @copyright 2016 Alain Schlesser, Bright Nucleus
10
 */
11
12
namespace BrightNucleus\View\Support;
13
14
use BrightNucleus\Config\ConfigInterface;
15
use BrightNucleus\Config\ConfigTrait;
16
use BrightNucleus\Config\Exception\FailedToProcessConfigException;
17
use BrightNucleus\View\Exception\FailedToInstantiateFindableException;
18
19
/**
20
 * Abstract class AbstractFinder.
21
 *
22
 * @since   0.1.0
23
 *
24
 * @package BrightNucleus\View\Support
25
 * @author  Alain Schlesser <[email protected]>
26
 */
27
abstract class AbstractFinder implements FinderInterface
28
{
29
30
    use ConfigTrait;
31
32
    /**
33
     * Findable collection that the Finder can iterate through to find a match.
34
     *
35
     * @since 0.1.0
36
     *
37
     * @var FindableCollection
38
     */
39
    protected $findables;
40
41
    /**
42
     * NullObject that is returned if the Finder could not find a match.
43
     *
44
     * @since 0.1.0
45
     *
46
     * @var NullObject
47
     */
48
    protected $nullObject;
49
50
    /**
51
     * Instantiate an AbstractFinder object.
52
     *
53
     * @since 0.1.0
54
     *
55
     * @param ConfigInterface $config Configuration of the AbstractFinder.
56
     *
57
     * @throws FailedToProcessConfigException If the config could not be processed.
58
     */
59 8
    public function __construct(ConfigInterface $config)
60
    {
61 8
        $this->processConfig($config);
62 8
        $this->findables = new FindableCollection();
63 8
        $this->registerFindables($this->config);
64 8
        $this->registerNullObject($this->config);
65 8
    }
66
67
    /**
68
     * Register the Findables defined in the given configuration.
69
     *
70
     * @since 0.1.0
71
     *
72
     * @param ConfigInterface $config Configuration to register the Findables from.
73
     */
74 8
    public function registerFindables(ConfigInterface $config)
75
    {
76 8
        foreach ($config->getKey($this->getFindablesConfigKey()) as $findableKey => $findableObject) {
77 8
            $this->findables->set($findableKey, $findableObject);
78
        }
79 8
    }
80
81
    /**
82
     * Register the NullObject defined in the given configuration.
83
     *
84
     * @since 0.1.0
85
     *
86
     * @param ConfigInterface $config Configuration to register the NullObject from.
87
     */
88 8
    public function registerNullObject(ConfigInterface $config)
89
    {
90 8
        $this->nullObject = $config->getKey($this->getNullObjectConfigKey());
91 8
    }
92
93
    /**
94
     * Get the NullObject.
95
     *
96
     * @since 0.1.1
97
     *
98
     * @return NullObject NullObject for the current Finder.
99
     */
100 1
    public function getNullObject()
101
    {
102 1
        $this->initializeNullObject();
103
104 1
        return $this->nullObject;
105
    }
106
107
    /**
108
     * Get the config key for the Findables definitions.
109
     *
110
     * @since 0.1.0
111
     *
112
     * @return string Config key use to define the Findables.
113
     */
114
    protected function getFindablesConfigKey()
115
    {
116
        return 'Findables';
117
    }
118
119
    /**
120
     * Get the config key for the NullObject definitions.
121
     *
122
     * @since 0.1.0
123
     *
124
     * @return string Config key use to define the NullObject.
125
     */
126 8
    protected function getNullObjectConfigKey()
127
    {
128 8
        return 'NullObject';
129
    }
130
131
    /**
132
     * Initialize the NullObject.
133
     *
134
     * @since 0.1.1
135
     *
136
     * @param mixed $arguments Optional. Arguments to use.
137
     */
138 1
    protected function initializeNullObject($arguments = null)
139
    {
140 1
        $this->nullObject = $this->maybeInstantiateFindable($this->nullObject, $arguments);
0 ignored issues
show
Documentation Bug introduced by
It seems like $this->maybeInstantiateF...nullObject, $arguments) of type object<BrightNucleus\View\Support\Findable> is incompatible with the declared type object<BrightNucleus\View\Support\NullObject> of property $nullObject.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
141 1
    }
142
143
    /**
144
     * Initialize the Findables that can be iterated.
145
     *
146
     * @param mixed $arguments Optional. Arguments to use.
147
     *
148
     * @since 0.1.0
149
     *
150
     */
151
    protected function initializeFindables($arguments = null)
152
    {
153 18
        $this->findables = $this->findables->map(function ($findable) use ($arguments) {
154 18
            return $this->initializeFindable($findable, $arguments);
155 18
        });
156 18
    }
157
158
    /**
159
     * Initialize a single findable by instantiating class name strings and calling closures.
160
     *
161
     * @since 0.1.0
162
     *
163
     * @param mixed $findable  Findable to instantiate.
164
     * @param mixed $arguments Optional. Arguments to use.
165
     *
166
     * @return Findable Instantiated findable.
167
     */
168 18
    protected function initializeFindable($findable, $arguments = null)
169
    {
170 18
        return $this->maybeInstantiateFindable($findable, $arguments);
171
    }
172
173
    /**
174
     * Maybe instantiate a Findable if it is not yet an object.
175
     *
176
     * @since 0.1.1
177
     *
178
     * @param mixed $findable  Findable to instantiate.
179
     * @param mixed $arguments Optional. Arguments to use.
180
     *
181
     * @return Findable Instantiated findable.
182
     * @throws FailedToInstantiateFindableException If the findable could not be instantiated.
183
     */
184 18
    protected function maybeInstantiateFindable($findable, $arguments = null)
185
    {
186 18
        if (is_string($findable)) {
187 8
            $findable = $this->instantiateFindableFromString($findable, $arguments);
188
        }
189
190 18
        if (is_callable($findable)) {
191
            $findable = $this->instantiateFindableFromCallable($findable, $arguments);
192
        }
193
194 18
        if (! $findable instanceof Findable) {
195
            throw new FailedToInstantiateFindableException(
196
                sprintf(
197
                    _('Could not instantiate Findable "%s".'),
198
                    serialize($findable)
199
                )
200
            );
201
        }
202
203 18
        return $findable;
204
    }
205
206
    /**
207
     * Instantiate a Findable from a string.
208
     *
209
     * @since 0.1.1
210
     *
211
     * @param string $string    String to use for instantiation.
212
     * @param mixed  $arguments Optional. Arguments to use for instantiation.
213
     *
214
     * @return mixed
0 ignored issues
show
Documentation introduced by
Consider making the return type a bit more specific; maybe use object.

This check looks for the generic type array as a return type and suggests a more specific type. This type is inferred from the actual code.

Loading history...
215
     */
216 8
    protected function instantiateFindableFromString($string, $arguments = null)
217
    {
218 8
        return new $string(...$arguments);
219
    }
220
221
    /**
222
     * Instantiate a Findable from a callable.
223
     *
224
     * @since 0.1.1
225
     *
226
     * @param callable $callable  Callable to use for instantiation.
227
     * @param mixed    $arguments Optional. Arguments to use for instantiation.
228
     *
229
     * @return mixed
230
     */
231
    protected function instantiateFindableFromCallable($callable, $arguments = null)
232
    {
233
        return $callable(...$arguments);
234
    }
235
}
236