DelegatesAwareTrait   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 86
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Importance

Changes 0
Metric Value
wmc 10
lcom 1
cbo 0
dl 0
loc 86
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A setDelegates() 0 8 2
A addDelegate() 0 5 1
A prependDelegate() 0 5 1
A hasInDelegates() 0 9 3
A getInDelegates() 0 9 3
1
<?php
2
3
namespace Charcoal\Config;
4
5
/**
6
 * Provides an object with the ability to perform lookups in other objects.
7
 *
8
 * A "delegate object" acts as a fallback when the current object does not have a requested value.
9
 *
10
 * This is a full implementation of {@see DelegatesAwareInterface}.
11
 */
12
trait DelegatesAwareTrait
13
{
14
    /**
15
     * Holds a list of all delegate objects.
16
     *
17
     * @var EntityInterface[]
18
     */
19
    private $delegates = [];
20
21
    /**
22
     * Assigns a collection of delegare objects.
23
     *
24
     * @param  EntityInterface[] $delegates One or more delegate objects to register.
25
     * @return self
26
     */
27
    final public function setDelegates(array $delegates)
28
    {
29
        $this->delegates = [];
30
        foreach ($delegates as $delegate) {
31
            $this->addDelegate($delegate);
32
        }
33
        return $this;
34
    }
35
36
    /**
37
     * Appends a delegare object onto the delegate stack.
38
     *
39
     * @param  EntityInterface $delegate A delegate object to register.
40
     * @return self
41
     */
42
    final public function addDelegate(EntityInterface $delegate)
43
    {
44
        $this->delegates[] = $delegate;
45
        return $this;
46
    }
47
48
    /**
49
     * Prepends a delegare object onto the delegate stack.
50
     *
51
     * @param  EntityInterface $delegate A delegate object to register.
52
     * @return self
53
     */
54
    final public function prependDelegate(EntityInterface $delegate)
55
    {
56
        array_unshift($this->delegates, $delegate);
57
        return $this;
58
    }
59
60
    /**
61
     * Determines if a delegate object contains the specified key and if its value is not NULL.
62
     *
63
     * Iterates over each object in the delegate stack and stops on
64
     * the first match containing the specified key.
65
     *
66
     * @param  string $key The data key to check.
67
     * @return boolean TRUE if $key exists and has a value other than NULL, FALSE otherwise.
68
     */
69
    final protected function hasInDelegates($key)
70
    {
71
        foreach ($this->delegates as $delegate) {
72
            if (isset($delegate[$key])) {
73
                return true;
74
            }
75
        }
76
        return false;
77
    }
78
79
    /**
80
     * Returns the value from the specified key found on the first delegate object.
81
     *
82
     * Iterates over each object in the delegate stack and stops on
83
     * the first match containing a value that is not NULL.
84
     *
85
     * @param  string $key The data key to retrieve.
86
     * @return mixed Value of the requested $key on success, NULL if the $key is not set.
87
     */
88
    final protected function getInDelegates($key)
89
    {
90
        foreach ($this->delegates as $delegate) {
91
            if (isset($delegate[$key])) {
92
                return $delegate[$key];
93
            }
94
        }
95
        return null;
96
    }
97
}
98