Completed
Branch BUG-10738-inconsistency-in-ses... (a1eed8)
by
unknown
24:27 queued 12:29
created

ContextChecker   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 148
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

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

8 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
A setIdentifier() 0 4 1
A setAcceptableValues() 0 4 1
A setEvaluationCallback() 0 8 2
A identifier() 0 4 1
A acceptableValues() 0 7 1
A evaluationCallback() 0 4 1
A isAllowed() 0 13 1
1
<?php
2
3
namespace EventEspresso\core\services\context;
4
5
use Closure;
6
use EventEspresso\core\domain\entities\Context;
7
8
defined('EVENT_ESPRESSO_VERSION') || exit;
9
10
11
12
/**
13
 * Class ContextChecker
14
 * Variation of the Specification pattern that compares an incoming Context class slug
15
 * against a preset list of acceptable values and returns true if a match is found.
16
 * A callback can be provided for performing this evaluation externally.
17
 *
18
 * @package EventEspresso\core\services
19
 * @author  Brent Christensen
20
 * @since   $VID:$
21
 */
22
class ContextChecker
23
{
24
25
    /**
26
     * A unique string used to identify where this ContextChecker is being employed
27
     * Is currently only used within the hook name for the filterable return value of isAllowed().
28
     *
29
     * @var string $identifier
30
     */
31
    private $identifier;
32
33
    /**
34
     * A list of values to be compared against the slug of the Context class passed to isAllowed()
35
     *
36
     * @var array $acceptable_values
37
     */
38
    private $acceptable_values;
39
40
    /**
41
     * Closure that will be called to perform the evaluation within isAllowed().
42
     * If none is provided, then a simple type sensitive in_array() check will be used
43
     * and return true if the incoming Context::slug() is found within the array of $acceptable_values.
44
     *
45
     * @var Closure $evaluation_callback
46
     */
47
    private $evaluation_callback;
48
49
50
    /**
51
     * ContextChecker constructor.
52
     *
53
     * @param string       $identifier
54
     * @param array        $acceptable_values
55
     * @param Closure|null $evaluation_callback [optional]
56
     */
57
    public function __construct($identifier, array $acceptable_values, Closure $evaluation_callback = null)
58
    {
59
        $this->setIdentifier($identifier);
60
        $this->setAcceptableValues($acceptable_values);
61
        $this->setEvaluationCallback($evaluation_callback);
62
    }
63
64
65
    /**
66
     * @param string $identifier
67
     */
68
    private function setIdentifier($identifier)
69
    {
70
        $this->identifier = sanitize_key($identifier);
71
    }
72
73
74
    /**
75
     * @param array $acceptable_values
76
     */
77
    private function setAcceptableValues(array $acceptable_values)
78
    {
79
        $this->acceptable_values = $acceptable_values;
80
    }
81
82
83
    /**
84
     * @param Closure $evaluation_callback
85
     */
86
    private function setEvaluationCallback(Closure $evaluation_callback = null)
87
    {
88
        $this->evaluation_callback = $evaluation_callback instanceof Closure
0 ignored issues
show
Bug introduced by
The class Closure does not exist. Is this class maybe located in a folder that is not analyzed, or in a newer version of your dependencies than listed in your composer.lock/composer.json?
Loading history...
89
            ? $evaluation_callback
90
            : function (Context $context, $acceptable_values) {
91
                return in_array($context->slug(), $acceptable_values, true);
92
            };
93
    }
94
95
96
    /**
97
     * @return string
98
     */
99
    protected function identifier()
100
    {
101
        return $this->identifier;
102
    }
103
104
105
    /**
106
     * @return array
107
     */
108
    protected function acceptableValues()
109
    {
110
        return apply_filters(
111
            "FHEE__EventEspresso_core_domain_entities_context_ContextChecker__{$this->identifier}__acceptableValues",
112
            $this->acceptable_values
113
        );
114
    }
115
116
117
    /**
118
     * @return Closure
119
     */
120
    protected function evaluationCallback()
121
    {
122
        return $this->evaluation_callback;
123
    }
124
125
126
127
    /**
128
     * Returns true if the incoming Context class slug matches one of the preset acceptable values.
129
     * The result is filterable using the identifier for this ContextChecker.
130
     * example:
131
     * If this ContextChecker's $identifier was set to "registration-checkout-type",
132
     * then the filter here would be named:
133
     *  "FHEE__EventEspresso_core_domain_entities_context_ContextChecker__registration-checkout-type__isAllowed".
134
     * Other code could hook into the filter in isAllowed() using the above name
135
     * and test for additional acceptable values.
136
     * So if the set of $acceptable_values was: [ "initial-visit",  "revisit" ]
137
     * then adding a filter to
138
     *  "FHEE__EventEspresso_core_domain_entities_context_ContextChecker__registration-checkout-type__isAllowed",
139
     * would allow you to perform your own conditional and allow "wait-list-checkout" as an acceptable value.
140
     *  example:
141
     *      add_filter(
142
     *          'FHEE__EventEspresso_core_domain_entities_context_ContextChecker__registration-checkout-type__isAllowed',
143
     *          function ($is_allowed, Context $context) {
144
     *              return $context->slug() === 'wait-list-checkout'
145
     *                  ? true
146
     *                  : $is_allowed;
147
     *          },
148
     *          10,
149
     *          2
150
     *      );
151
     *
152
     * @param Context $context
153
     * @return boolean
154
     */
155
    public function isAllowed(Context $context)
156
    {
157
        $evaluation_callback = $this->evaluationCallback();
158
        return filter_var(
159
            apply_filters(
160
                "FHEE__EventEspresso_core_domain_entities_context_ContextChecker__{$this->identifier}__isAllowed",
161
                $evaluation_callback($context, $this->acceptableValues()),
162
                $context,
163
                $this
164
            ),
165
            FILTER_VALIDATE_BOOLEAN
166
        );
167
    }
168
169
}
170