Completed
Branch FET/asset-manager (433489)
by
unknown
32:42 queued 18:11
created
core/services/Benchmark.php 2 patches
Indentation   +320 added lines, -320 removed lines patch added patch discarded remove patch
@@ -15,324 +15,324 @@
 block discarded – undo
15 15
 class Benchmark
16 16
 {
17 17
 
18
-    /**
19
-     * @var string $output
20
-     */
21
-    private static $output;
22
-
23
-    /**
24
-     * @var array $start_times array containing the start time for the timers
25
-     */
26
-    private static $start_times;
27
-
28
-    /**
29
-     * @var array $times array containing all the timer'd times, which can be outputted via show_times()
30
-     */
31
-    private static $times = array();
32
-
33
-    /**
34
-     * @var array $memory_usage
35
-     */
36
-    protected static $memory_usage = array();
37
-
38
-
39
-    /**
40
-     * @param string $output
41
-     * @param bool   $formatted
42
-     */
43
-    public static function addOutput($output, $formatted = true)
44
-    {
45
-        Benchmark::$output .= $formatted
46
-            ? "<br />{$output}"
47
-            : "\n{$output}";
48
-    }
49
-
50
-
51
-    /**
52
-     * @return void
53
-     */
54
-    public static function resetOutput()
55
-    {
56
-        Benchmark::$output = '';
57
-    }
58
-
59
-    /**
60
-     * whether to benchmark code or not
61
-     */
62
-    public static function doNotRun()
63
-    {
64
-        return ! WP_DEBUG || (defined('DOING_AJAX') && DOING_AJAX);
65
-    }
66
-
67
-
68
-    /**
69
-     * resetTimes
70
-     */
71
-    public static function resetTimes()
72
-    {
73
-        Benchmark::$times = array();
74
-    }
75
-
76
-
77
-    /**
78
-     * Add Benchmark::startTimer() before a block of code you want to measure the performance of
79
-     *
80
-     * @param null $timer_name
81
-     */
82
-    public static function startTimer($timer_name = null)
83
-    {
84
-        if (Benchmark::doNotRun()) {
85
-            return;
86
-        }
87
-        $timer_name = $timer_name !== '' ? $timer_name : get_called_class();
88
-        Benchmark::$start_times[ $timer_name ] = microtime(true);
89
-    }
90
-
91
-
92
-    /**
93
-     * Add Benchmark::stopTimer() after a block of code you want to measure the performance of
94
-     *
95
-     * @param string $timer_name
96
-     */
97
-    public static function stopTimer($timer_name = '')
98
-    {
99
-        if (Benchmark::doNotRun()) {
100
-            return;
101
-        }
102
-        $timer_name = $timer_name !== '' ? $timer_name : get_called_class();
103
-        if (isset(Benchmark::$start_times[ $timer_name ])) {
104
-            $start_time = Benchmark::$start_times[ $timer_name ];
105
-            unset(Benchmark::$start_times[ $timer_name ]);
106
-        } else {
107
-            $start_time = array_pop(Benchmark::$start_times);
108
-        }
109
-        Benchmark::$times[ $timer_name ] = number_format(microtime(true) - $start_time, 8);
110
-    }
111
-
112
-
113
-    /**
114
-     * Measure the memory usage by PHP so far.
115
-     *
116
-     * @param string  $label      The label to show for this time eg "Start of calling Some_Class::some_function"
117
-     * @param boolean $output_now whether to echo now, or wait until EEH_Debug_Tools::show_times() is called
118
-     * @param bool    $formatted
119
-     * @return void
120
-     */
121
-    public static function measureMemory($label = 'memory usage', $output_now = false, $formatted = true)
122
-    {
123
-        if (Benchmark::doNotRun()) {
124
-            return;
125
-        }
126
-        $memory_used = Benchmark::convert(memory_get_usage(true));
127
-        Benchmark::$memory_usage[ $label ] = $memory_used;
128
-        if ($output_now) {
129
-            echo $formatted
130
-                ? "<br>{$label} : {$memory_used}"
131
-                : "\n {$label} : {$memory_used}";
132
-        }
133
-    }
134
-
135
-
136
-    /**
137
-     * will display the benchmarking results at shutdown
138
-     *
139
-     * @param bool $formatted
140
-     * @return void
141
-     */
142
-    public static function displayResultsAtShutdown($formatted = true)
143
-    {
144
-        Benchmark::resetOutput();
145
-        add_action(
146
-            'shutdown',
147
-            function () use ($formatted) {
148
-                Benchmark::displayResults(true, $formatted);
149
-            },
150
-            999999
151
-        );
152
-    }
153
-
154
-
155
-    /**
156
-     * will display the benchmarking results at shutdown
157
-     *
158
-     * @param string $filepath
159
-     * @param bool   $formatted
160
-     * @param bool   $append
161
-     * @return void
162
-     */
163
-    public static function writeResultsAtShutdown($filepath = '', $formatted = true, $append = true)
164
-    {
165
-        Benchmark::resetOutput();
166
-        add_action(
167
-            'shutdown',
168
-            function () use ($filepath, $formatted, $append) {
169
-                Benchmark::writeResultsToFile($filepath, $formatted, $append);
170
-            },
171
-            999999
172
-        );
173
-    }
174
-
175
-
176
-    /**
177
-     * @param bool $formatted
178
-     * @return string
179
-     */
180
-    private static function generateResults($formatted = true)
181
-    {
182
-        if (Benchmark::doNotRun()) {
183
-            return '';
184
-        }
185
-        if (! empty(Benchmark::$times)) {
186
-            $total = 0;
187
-            Benchmark::$output .= $formatted
188
-                ? '<span style="color:#999999; font-size:.8em;">( time in milliseconds )</span><br />'
189
-                : '';
190
-            foreach (Benchmark::$times as $timer_name => $total_time) {
191
-                Benchmark::$output .= Benchmark::formatTime($timer_name, $total_time, $formatted);
192
-                Benchmark::$output .= $formatted ? '<br />' : "\n";
193
-                $total += $total_time;
194
-            }
195
-            if ($formatted) {
196
-                Benchmark::$output .= '<br />';
197
-                Benchmark::$output .= '<h4>TOTAL TIME</h4>';
198
-                Benchmark::$output .= Benchmark::formatTime('', $total, $formatted);
199
-                Benchmark::$output .= '<span style="color:#999999; font-size:.8em;"> milliseconds</span><br />';
200
-                Benchmark::$output .= '<br />';
201
-                Benchmark::$output .= '<h5>Performance scale (from best to worse)</h5>';
202
-                Benchmark::$output .= '<span style="color:mediumpurple">Like wow! How about a Scooby snack?</span><br />';
203
-                Benchmark::$output .= '<span style="color:deepskyblue">Like...no way man!</span><br />';
204
-                Benchmark::$output .= '<span style="color:limegreen">Like...groovy!</span><br />';
205
-                Benchmark::$output .= '<span style="color:gold">Ruh Oh</span><br />';
206
-                Benchmark::$output .= '<span style="color:darkorange">Zoinks!</span><br />';
207
-                Benchmark::$output .= '<span style="color:red">Like...HEEELLLP</span><br />';
208
-            }
209
-        }
210
-        if (! empty(Benchmark::$memory_usage)) {
211
-            Benchmark::$output .= $formatted
212
-                ? '<h5>Memory</h5>'
213
-                : "\nMemory";
214
-            foreach (Benchmark::$memory_usage as $label => $memory_usage) {
215
-                Benchmark::$output .= $formatted
216
-                    ? "<br />{$memory_usage} : {$label}"
217
-                    : "\n{$memory_usage} : {$label}";
218
-            }
219
-        }
220
-        if (empty(Benchmark::$output)) {
221
-            return '';
222
-        }
223
-        Benchmark::$output = $formatted
224
-            ? '<div style="border:1px solid #dddddd; background-color:#ffffff;'
225
-              . (is_admin()
226
-                ? ' margin:2em 2em 2em 180px;'
227
-                : ' margin:2em;')
228
-              . ' padding:2em;">'
229
-              . '<h4>BENCHMARKING</h4>'
230
-              . Benchmark::$output
231
-              . '</div>'
232
-            : Benchmark::$output;
233
-        return Benchmark::$output;
234
-    }
235
-
236
-
237
-    /**
238
-     * @param bool $echo
239
-     * @param bool $formatted
240
-     * @return string
241
-     */
242
-    public static function displayResults($echo = true, $formatted = true)
243
-    {
244
-        $results = Benchmark::generateResults($formatted);
245
-        if ($echo) {
246
-            echo $results;
247
-            $results = '';
248
-        }
249
-        return $results;
250
-    }
251
-
252
-
253
-    /**
254
-     * @param string $filepath
255
-     * @param bool   $formatted
256
-     * @param bool   $append
257
-     * @throws EE_Error
258
-     */
259
-    public static function writeResultsToFile($filepath = '', $formatted = true, $append = true)
260
-    {
261
-        $filepath = ! empty($filepath) && is_readable(dirname($filepath))
262
-            ? $filepath
263
-            : '';
264
-        if (empty($filepath)) {
265
-            $filepath = EVENT_ESPRESSO_UPLOAD_DIR . 'logs/benchmarking-' . date('Y-m-d') . '.html';
266
-        }
267
-        EEH_File::ensure_file_exists_and_is_writable($filepath);
268
-        file_put_contents(
269
-            $filepath,
270
-            "\n" . date('Y-m-d H:i:s') . Benchmark::generateResults($formatted),
271
-            $append ? FILE_APPEND | LOCK_EX : LOCK_EX
272
-        );
273
-    }
274
-
275
-
276
-    /**
277
-     * Converts a measure of memory bytes into the most logical units (eg kb, mb, etc)
278
-     *
279
-     * @param int $size
280
-     * @return string
281
-     */
282
-    public static function convert($size)
283
-    {
284
-        $unit = array('b', 'kb', 'mb', 'gb', 'tb', 'pb');
285
-        return round(
286
-            $size / pow(1024, $i = floor(log($size, 1024))),
287
-            2
288
-        ) . ' ' . $unit[ absint($i) ];
289
-    }
290
-
291
-
292
-    /**
293
-     * @param string $timer_name
294
-     * @param float  $total_time
295
-     * @param bool   $formatted
296
-     * @return string
297
-     */
298
-    public static function formatTime($timer_name, $total_time, $formatted = true)
299
-    {
300
-        $total_time *= 1000;
301
-        switch ($total_time) {
302
-            case $total_time > 12500:
303
-                $color = 'red';
304
-                $bold = 'bold';
305
-                break;
306
-            case $total_time > 2500:
307
-                $color = 'darkorange';
308
-                $bold = 'bold';
309
-                break;
310
-            case $total_time > 500:
311
-                $color = 'gold';
312
-                $bold = 'bold';
313
-                break;
314
-            case $total_time > 100:
315
-                $color = 'limegreen';
316
-                $bold = 'normal';
317
-                break;
318
-            case $total_time > 20:
319
-                $color = 'deepskyblue';
320
-                $bold = 'normal';
321
-                break;
322
-            default:
323
-                $color = 'mediumpurple';
324
-                $bold = 'normal';
325
-                break;
326
-        }
327
-        return $formatted
328
-            ? '<span style="min-width: 10px; margin:0 1em; color:'
329
-              . $color
330
-              . '; font-weight:'
331
-              . $bold
332
-              . '; font-size:1.2em;">'
333
-              . str_pad(number_format($total_time, 3), 9, '0', STR_PAD_LEFT)
334
-              . '</span> '
335
-              . $timer_name
336
-            : str_pad(number_format($total_time, 3), 9, '0', STR_PAD_LEFT);
337
-    }
18
+	/**
19
+	 * @var string $output
20
+	 */
21
+	private static $output;
22
+
23
+	/**
24
+	 * @var array $start_times array containing the start time for the timers
25
+	 */
26
+	private static $start_times;
27
+
28
+	/**
29
+	 * @var array $times array containing all the timer'd times, which can be outputted via show_times()
30
+	 */
31
+	private static $times = array();
32
+
33
+	/**
34
+	 * @var array $memory_usage
35
+	 */
36
+	protected static $memory_usage = array();
37
+
38
+
39
+	/**
40
+	 * @param string $output
41
+	 * @param bool   $formatted
42
+	 */
43
+	public static function addOutput($output, $formatted = true)
44
+	{
45
+		Benchmark::$output .= $formatted
46
+			? "<br />{$output}"
47
+			: "\n{$output}";
48
+	}
49
+
50
+
51
+	/**
52
+	 * @return void
53
+	 */
54
+	public static function resetOutput()
55
+	{
56
+		Benchmark::$output = '';
57
+	}
58
+
59
+	/**
60
+	 * whether to benchmark code or not
61
+	 */
62
+	public static function doNotRun()
63
+	{
64
+		return ! WP_DEBUG || (defined('DOING_AJAX') && DOING_AJAX);
65
+	}
66
+
67
+
68
+	/**
69
+	 * resetTimes
70
+	 */
71
+	public static function resetTimes()
72
+	{
73
+		Benchmark::$times = array();
74
+	}
75
+
76
+
77
+	/**
78
+	 * Add Benchmark::startTimer() before a block of code you want to measure the performance of
79
+	 *
80
+	 * @param null $timer_name
81
+	 */
82
+	public static function startTimer($timer_name = null)
83
+	{
84
+		if (Benchmark::doNotRun()) {
85
+			return;
86
+		}
87
+		$timer_name = $timer_name !== '' ? $timer_name : get_called_class();
88
+		Benchmark::$start_times[ $timer_name ] = microtime(true);
89
+	}
90
+
91
+
92
+	/**
93
+	 * Add Benchmark::stopTimer() after a block of code you want to measure the performance of
94
+	 *
95
+	 * @param string $timer_name
96
+	 */
97
+	public static function stopTimer($timer_name = '')
98
+	{
99
+		if (Benchmark::doNotRun()) {
100
+			return;
101
+		}
102
+		$timer_name = $timer_name !== '' ? $timer_name : get_called_class();
103
+		if (isset(Benchmark::$start_times[ $timer_name ])) {
104
+			$start_time = Benchmark::$start_times[ $timer_name ];
105
+			unset(Benchmark::$start_times[ $timer_name ]);
106
+		} else {
107
+			$start_time = array_pop(Benchmark::$start_times);
108
+		}
109
+		Benchmark::$times[ $timer_name ] = number_format(microtime(true) - $start_time, 8);
110
+	}
111
+
112
+
113
+	/**
114
+	 * Measure the memory usage by PHP so far.
115
+	 *
116
+	 * @param string  $label      The label to show for this time eg "Start of calling Some_Class::some_function"
117
+	 * @param boolean $output_now whether to echo now, or wait until EEH_Debug_Tools::show_times() is called
118
+	 * @param bool    $formatted
119
+	 * @return void
120
+	 */
121
+	public static function measureMemory($label = 'memory usage', $output_now = false, $formatted = true)
122
+	{
123
+		if (Benchmark::doNotRun()) {
124
+			return;
125
+		}
126
+		$memory_used = Benchmark::convert(memory_get_usage(true));
127
+		Benchmark::$memory_usage[ $label ] = $memory_used;
128
+		if ($output_now) {
129
+			echo $formatted
130
+				? "<br>{$label} : {$memory_used}"
131
+				: "\n {$label} : {$memory_used}";
132
+		}
133
+	}
134
+
135
+
136
+	/**
137
+	 * will display the benchmarking results at shutdown
138
+	 *
139
+	 * @param bool $formatted
140
+	 * @return void
141
+	 */
142
+	public static function displayResultsAtShutdown($formatted = true)
143
+	{
144
+		Benchmark::resetOutput();
145
+		add_action(
146
+			'shutdown',
147
+			function () use ($formatted) {
148
+				Benchmark::displayResults(true, $formatted);
149
+			},
150
+			999999
151
+		);
152
+	}
153
+
154
+
155
+	/**
156
+	 * will display the benchmarking results at shutdown
157
+	 *
158
+	 * @param string $filepath
159
+	 * @param bool   $formatted
160
+	 * @param bool   $append
161
+	 * @return void
162
+	 */
163
+	public static function writeResultsAtShutdown($filepath = '', $formatted = true, $append = true)
164
+	{
165
+		Benchmark::resetOutput();
166
+		add_action(
167
+			'shutdown',
168
+			function () use ($filepath, $formatted, $append) {
169
+				Benchmark::writeResultsToFile($filepath, $formatted, $append);
170
+			},
171
+			999999
172
+		);
173
+	}
174
+
175
+
176
+	/**
177
+	 * @param bool $formatted
178
+	 * @return string
179
+	 */
180
+	private static function generateResults($formatted = true)
181
+	{
182
+		if (Benchmark::doNotRun()) {
183
+			return '';
184
+		}
185
+		if (! empty(Benchmark::$times)) {
186
+			$total = 0;
187
+			Benchmark::$output .= $formatted
188
+				? '<span style="color:#999999; font-size:.8em;">( time in milliseconds )</span><br />'
189
+				: '';
190
+			foreach (Benchmark::$times as $timer_name => $total_time) {
191
+				Benchmark::$output .= Benchmark::formatTime($timer_name, $total_time, $formatted);
192
+				Benchmark::$output .= $formatted ? '<br />' : "\n";
193
+				$total += $total_time;
194
+			}
195
+			if ($formatted) {
196
+				Benchmark::$output .= '<br />';
197
+				Benchmark::$output .= '<h4>TOTAL TIME</h4>';
198
+				Benchmark::$output .= Benchmark::formatTime('', $total, $formatted);
199
+				Benchmark::$output .= '<span style="color:#999999; font-size:.8em;"> milliseconds</span><br />';
200
+				Benchmark::$output .= '<br />';
201
+				Benchmark::$output .= '<h5>Performance scale (from best to worse)</h5>';
202
+				Benchmark::$output .= '<span style="color:mediumpurple">Like wow! How about a Scooby snack?</span><br />';
203
+				Benchmark::$output .= '<span style="color:deepskyblue">Like...no way man!</span><br />';
204
+				Benchmark::$output .= '<span style="color:limegreen">Like...groovy!</span><br />';
205
+				Benchmark::$output .= '<span style="color:gold">Ruh Oh</span><br />';
206
+				Benchmark::$output .= '<span style="color:darkorange">Zoinks!</span><br />';
207
+				Benchmark::$output .= '<span style="color:red">Like...HEEELLLP</span><br />';
208
+			}
209
+		}
210
+		if (! empty(Benchmark::$memory_usage)) {
211
+			Benchmark::$output .= $formatted
212
+				? '<h5>Memory</h5>'
213
+				: "\nMemory";
214
+			foreach (Benchmark::$memory_usage as $label => $memory_usage) {
215
+				Benchmark::$output .= $formatted
216
+					? "<br />{$memory_usage} : {$label}"
217
+					: "\n{$memory_usage} : {$label}";
218
+			}
219
+		}
220
+		if (empty(Benchmark::$output)) {
221
+			return '';
222
+		}
223
+		Benchmark::$output = $formatted
224
+			? '<div style="border:1px solid #dddddd; background-color:#ffffff;'
225
+			  . (is_admin()
226
+				? ' margin:2em 2em 2em 180px;'
227
+				: ' margin:2em;')
228
+			  . ' padding:2em;">'
229
+			  . '<h4>BENCHMARKING</h4>'
230
+			  . Benchmark::$output
231
+			  . '</div>'
232
+			: Benchmark::$output;
233
+		return Benchmark::$output;
234
+	}
235
+
236
+
237
+	/**
238
+	 * @param bool $echo
239
+	 * @param bool $formatted
240
+	 * @return string
241
+	 */
242
+	public static function displayResults($echo = true, $formatted = true)
243
+	{
244
+		$results = Benchmark::generateResults($formatted);
245
+		if ($echo) {
246
+			echo $results;
247
+			$results = '';
248
+		}
249
+		return $results;
250
+	}
251
+
252
+
253
+	/**
254
+	 * @param string $filepath
255
+	 * @param bool   $formatted
256
+	 * @param bool   $append
257
+	 * @throws EE_Error
258
+	 */
259
+	public static function writeResultsToFile($filepath = '', $formatted = true, $append = true)
260
+	{
261
+		$filepath = ! empty($filepath) && is_readable(dirname($filepath))
262
+			? $filepath
263
+			: '';
264
+		if (empty($filepath)) {
265
+			$filepath = EVENT_ESPRESSO_UPLOAD_DIR . 'logs/benchmarking-' . date('Y-m-d') . '.html';
266
+		}
267
+		EEH_File::ensure_file_exists_and_is_writable($filepath);
268
+		file_put_contents(
269
+			$filepath,
270
+			"\n" . date('Y-m-d H:i:s') . Benchmark::generateResults($formatted),
271
+			$append ? FILE_APPEND | LOCK_EX : LOCK_EX
272
+		);
273
+	}
274
+
275
+
276
+	/**
277
+	 * Converts a measure of memory bytes into the most logical units (eg kb, mb, etc)
278
+	 *
279
+	 * @param int $size
280
+	 * @return string
281
+	 */
282
+	public static function convert($size)
283
+	{
284
+		$unit = array('b', 'kb', 'mb', 'gb', 'tb', 'pb');
285
+		return round(
286
+			$size / pow(1024, $i = floor(log($size, 1024))),
287
+			2
288
+		) . ' ' . $unit[ absint($i) ];
289
+	}
290
+
291
+
292
+	/**
293
+	 * @param string $timer_name
294
+	 * @param float  $total_time
295
+	 * @param bool   $formatted
296
+	 * @return string
297
+	 */
298
+	public static function formatTime($timer_name, $total_time, $formatted = true)
299
+	{
300
+		$total_time *= 1000;
301
+		switch ($total_time) {
302
+			case $total_time > 12500:
303
+				$color = 'red';
304
+				$bold = 'bold';
305
+				break;
306
+			case $total_time > 2500:
307
+				$color = 'darkorange';
308
+				$bold = 'bold';
309
+				break;
310
+			case $total_time > 500:
311
+				$color = 'gold';
312
+				$bold = 'bold';
313
+				break;
314
+			case $total_time > 100:
315
+				$color = 'limegreen';
316
+				$bold = 'normal';
317
+				break;
318
+			case $total_time > 20:
319
+				$color = 'deepskyblue';
320
+				$bold = 'normal';
321
+				break;
322
+			default:
323
+				$color = 'mediumpurple';
324
+				$bold = 'normal';
325
+				break;
326
+		}
327
+		return $formatted
328
+			? '<span style="min-width: 10px; margin:0 1em; color:'
329
+			  . $color
330
+			  . '; font-weight:'
331
+			  . $bold
332
+			  . '; font-size:1.2em;">'
333
+			  . str_pad(number_format($total_time, 3), 9, '0', STR_PAD_LEFT)
334
+			  . '</span> '
335
+			  . $timer_name
336
+			: str_pad(number_format($total_time, 3), 9, '0', STR_PAD_LEFT);
337
+	}
338 338
 }
Please login to merge, or discard this patch.
Spacing   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -85,7 +85,7 @@  discard block
 block discarded – undo
85 85
             return;
86 86
         }
87 87
         $timer_name = $timer_name !== '' ? $timer_name : get_called_class();
88
-        Benchmark::$start_times[ $timer_name ] = microtime(true);
88
+        Benchmark::$start_times[$timer_name] = microtime(true);
89 89
     }
90 90
 
91 91
 
@@ -100,13 +100,13 @@  discard block
 block discarded – undo
100 100
             return;
101 101
         }
102 102
         $timer_name = $timer_name !== '' ? $timer_name : get_called_class();
103
-        if (isset(Benchmark::$start_times[ $timer_name ])) {
104
-            $start_time = Benchmark::$start_times[ $timer_name ];
105
-            unset(Benchmark::$start_times[ $timer_name ]);
103
+        if (isset(Benchmark::$start_times[$timer_name])) {
104
+            $start_time = Benchmark::$start_times[$timer_name];
105
+            unset(Benchmark::$start_times[$timer_name]);
106 106
         } else {
107 107
             $start_time = array_pop(Benchmark::$start_times);
108 108
         }
109
-        Benchmark::$times[ $timer_name ] = number_format(microtime(true) - $start_time, 8);
109
+        Benchmark::$times[$timer_name] = number_format(microtime(true) - $start_time, 8);
110 110
     }
111 111
 
112 112
 
@@ -124,7 +124,7 @@  discard block
 block discarded – undo
124 124
             return;
125 125
         }
126 126
         $memory_used = Benchmark::convert(memory_get_usage(true));
127
-        Benchmark::$memory_usage[ $label ] = $memory_used;
127
+        Benchmark::$memory_usage[$label] = $memory_used;
128 128
         if ($output_now) {
129 129
             echo $formatted
130 130
                 ? "<br>{$label} : {$memory_used}"
@@ -144,7 +144,7 @@  discard block
 block discarded – undo
144 144
         Benchmark::resetOutput();
145 145
         add_action(
146 146
             'shutdown',
147
-            function () use ($formatted) {
147
+            function() use ($formatted) {
148 148
                 Benchmark::displayResults(true, $formatted);
149 149
             },
150 150
             999999
@@ -165,7 +165,7 @@  discard block
 block discarded – undo
165 165
         Benchmark::resetOutput();
166 166
         add_action(
167 167
             'shutdown',
168
-            function () use ($filepath, $formatted, $append) {
168
+            function() use ($filepath, $formatted, $append) {
169 169
                 Benchmark::writeResultsToFile($filepath, $formatted, $append);
170 170
             },
171 171
             999999
@@ -182,7 +182,7 @@  discard block
 block discarded – undo
182 182
         if (Benchmark::doNotRun()) {
183 183
             return '';
184 184
         }
185
-        if (! empty(Benchmark::$times)) {
185
+        if ( ! empty(Benchmark::$times)) {
186 186
             $total = 0;
187 187
             Benchmark::$output .= $formatted
188 188
                 ? '<span style="color:#999999; font-size:.8em;">( time in milliseconds )</span><br />'
@@ -207,7 +207,7 @@  discard block
 block discarded – undo
207 207
                 Benchmark::$output .= '<span style="color:red">Like...HEEELLLP</span><br />';
208 208
             }
209 209
         }
210
-        if (! empty(Benchmark::$memory_usage)) {
210
+        if ( ! empty(Benchmark::$memory_usage)) {
211 211
             Benchmark::$output .= $formatted
212 212
                 ? '<h5>Memory</h5>'
213 213
                 : "\nMemory";
@@ -262,12 +262,12 @@  discard block
 block discarded – undo
262 262
             ? $filepath
263 263
             : '';
264 264
         if (empty($filepath)) {
265
-            $filepath = EVENT_ESPRESSO_UPLOAD_DIR . 'logs/benchmarking-' . date('Y-m-d') . '.html';
265
+            $filepath = EVENT_ESPRESSO_UPLOAD_DIR.'logs/benchmarking-'.date('Y-m-d').'.html';
266 266
         }
267 267
         EEH_File::ensure_file_exists_and_is_writable($filepath);
268 268
         file_put_contents(
269 269
             $filepath,
270
-            "\n" . date('Y-m-d H:i:s') . Benchmark::generateResults($formatted),
270
+            "\n".date('Y-m-d H:i:s').Benchmark::generateResults($formatted),
271 271
             $append ? FILE_APPEND | LOCK_EX : LOCK_EX
272 272
         );
273 273
     }
@@ -285,7 +285,7 @@  discard block
 block discarded – undo
285 285
         return round(
286 286
             $size / pow(1024, $i = floor(log($size, 1024))),
287 287
             2
288
-        ) . ' ' . $unit[ absint($i) ];
288
+        ).' '.$unit[absint($i)];
289 289
     }
290 290
 
291 291
 
Please login to merge, or discard this patch.
core/services/container/CoffeeShop.php 2 patches
Indentation   +565 added lines, -565 removed lines patch added patch discarded remove patch
@@ -30,569 +30,569 @@
 block discarded – undo
30 30
 {
31 31
 
32 32
 
33
-    /**
34
-     * This was the best coffee related name I could think of to represent class name "aliases"
35
-     * So classes can be found via an alias identifier,
36
-     * that is revealed when it is run through... the filters... eh? get it?
37
-     *
38
-     * @var array $filters
39
-     */
40
-    private $filters;
41
-
42
-    /**
43
-     * These are the classes that will actually build the objects (to order of course)
44
-     *
45
-     * @var array $coffee_makers
46
-     */
47
-    private $coffee_makers;
48
-
49
-    /**
50
-     * where the instantiated "singleton" objects are stored
51
-     *
52
-     * @var CollectionInterface $carafe
53
-     */
54
-    private $carafe;
55
-
56
-    /**
57
-     * collection of Recipes that instruct us how to brew objects
58
-     *
59
-     * @var CollectionInterface $recipes
60
-     */
61
-    private $recipes;
62
-
63
-    /**
64
-     * collection of closures for brewing objects
65
-     *
66
-     * @var CollectionInterface $reservoir
67
-     */
68
-    private $reservoir;
69
-
70
-
71
-    /**
72
-     * CoffeeShop constructor
73
-     *
74
-     * @throws InvalidInterfaceException
75
-     */
76
-    public function __construct()
77
-    {
78
-        // array for storing class aliases
79
-        $this->filters = array();
80
-        // create collection for storing shared services
81
-        $this->carafe = new LooseCollection('');
82
-        // create collection for storing recipes that tell us how to build services and entities
83
-        $this->recipes = new Collection('EventEspresso\core\services\container\RecipeInterface');
84
-        // create collection for storing closures for constructing new entities
85
-        $this->reservoir = new Collection('Closure');
86
-        // create collection for storing the generators that build our services and entity closures
87
-        $this->coffee_makers = new Collection('EventEspresso\core\services\container\CoffeeMakerInterface');
88
-    }
89
-
90
-
91
-    /**
92
-     * Returns true if the container can return an entry for the given identifier.
93
-     * Returns false otherwise.
94
-     * `has($identifier)` returning true does not mean that `get($identifier)` will not throw an exception.
95
-     * It does however mean that `get($identifier)` will not throw a `ServiceNotFoundException`.
96
-     *
97
-     * @param string $identifier  Identifier of the entry to look for.
98
-     *                            Typically a Fully Qualified Class Name
99
-     * @return boolean
100
-     * @throws InvalidIdentifierException
101
-     */
102
-    public function has($identifier)
103
-    {
104
-        $identifier = $this->filterIdentifier($identifier);
105
-        return $this->carafe->has($identifier);
106
-    }
107
-
108
-
109
-    /**
110
-     * finds a previously brewed (SHARED) service and returns it
111
-     *
112
-     * @param  string $identifier Identifier for the entity class to be constructed.
113
-     *                            Typically a Fully Qualified Class Name
114
-     * @return mixed
115
-     * @throws InvalidIdentifierException
116
-     * @throws ServiceNotFoundException No service was found for this identifier.
117
-     */
118
-    public function get($identifier)
119
-    {
120
-        $identifier = $this->filterIdentifier($identifier);
121
-        if ($this->carafe->has($identifier)) {
122
-            return $this->carafe->get($identifier);
123
-        }
124
-        throw new ServiceNotFoundException($identifier);
125
-    }
126
-
127
-
128
-    /**
129
-     * returns an instance of the requested entity type using the supplied arguments.
130
-     * If a shared service is requested and an instance is already in the carafe, then it will be returned.
131
-     * If it is not already in the carafe, then the service will be constructed, added to the carafe, and returned
132
-     * If the request is for a new entity and a closure exists in the reservoir for creating it,
133
-     * then a new entity will be instantiated from the closure and returned.
134
-     * If a closure does not exist, then one will be built and added to the reservoir
135
-     * before instantiating the requested entity.
136
-     *
137
-     * @param  string $identifier Identifier for the entity class to be constructed.
138
-     *                            Typically a Fully Qualified Class Name
139
-     * @param array   $arguments  an array of arguments to be passed to the entity constructor
140
-     * @param string  $type
141
-     * @return mixed
142
-     * @throws OutOfBoundsException
143
-     * @throws InstantiationException
144
-     * @throws InvalidDataTypeException
145
-     * @throws InvalidClassException
146
-     * @throws InvalidIdentifierException
147
-     * @throws ServiceExistsException
148
-     * @throws ServiceNotFoundException No service was found for this identifier.
149
-     */
150
-    public function brew($identifier, $arguments = array(), $type = '')
151
-    {
152
-        // resolve any class aliases that may exist
153
-        $identifier = $this->filterIdentifier($identifier);
154
-        // is a shared service being requested and already exists in the carafe?
155
-        $brewed = $this->getShared($identifier, $type);
156
-        // then return whatever was found
157
-        if ($brewed !== false) {
158
-            return $brewed;
159
-        }
160
-        // if the reservoir doesn't have a closure already for the requested identifier,
161
-        // then neither a shared service nor a closure for making entities has been built yet
162
-        if (! $this->reservoir->has($identifier)) {
163
-            // so let's brew something up and add it to the proper collection
164
-            $brewed = $this->makeCoffee($identifier, $arguments, $type);
165
-        }
166
-        // did the requested class only require loading, and if so, was that successful?
167
-        if ($this->brewedLoadOnly($brewed, $identifier, $type) === true) {
168
-            return true;
169
-        }
170
-        // was the brewed item a callable factory function ?
171
-        if (is_callable($brewed)) {
172
-            // then instantiate a new entity from the cached closure
173
-            return $brewed($arguments);
174
-        }
175
-        if ($brewed) {
176
-            // requested object was a shared entity, so attempt to get it from the carafe again
177
-            // because if it wasn't there before, then it should have just been brewed and added,
178
-            // but if it still isn't there, then this time the thrown ServiceNotFoundException will not be caught
179
-            return $this->get($identifier);
180
-        }
181
-        // if identifier is for a non-shared entity,
182
-        // then either a cached closure already existed, or was just brewed
183
-        return $this->brewedClosure($identifier, $arguments);
184
-    }
185
-
186
-
187
-    /**
188
-     * @param string $identifier
189
-     * @param string $type
190
-     * @return bool|mixed
191
-     * @throws InvalidIdentifierException
192
-     */
193
-    protected function getShared($identifier, $type)
194
-    {
195
-        try {
196
-            if (empty($type) || $type === CoffeeMaker::BREW_SHARED) {
197
-                // if a shared service was requested and an instance is in the carafe, then return it
198
-                return $this->get($identifier);
199
-            }
200
-        } catch (ServiceNotFoundException $e) {
201
-            // if not then we'll just catch the ServiceNotFoundException but not do anything just yet,
202
-            // and instead, attempt to build whatever was requested
203
-        }
204
-        return false;
205
-    }
206
-
207
-
208
-    /**
209
-     * @param mixed  $brewed
210
-     * @param string $identifier
211
-     * @param string $type
212
-     * @return bool
213
-     * @throws InvalidClassException
214
-     * @throws InvalidDataTypeException
215
-     * @throws InvalidIdentifierException
216
-     * @throws OutOfBoundsException
217
-     * @throws ServiceExistsException
218
-     * @throws ServiceNotFoundException
219
-     */
220
-    protected function brewedLoadOnly($brewed, $identifier, $type)
221
-    {
222
-        if ($type === CoffeeMaker::BREW_LOAD_ONLY) {
223
-            if ($brewed !== true) {
224
-                throw new ServiceNotFoundException(
225
-                    sprintf(
226
-                        esc_html__(
227
-                            'The "%1$s" class could not be loaded.',
228
-                            'event_espresso'
229
-                        ),
230
-                        $identifier
231
-                    )
232
-                );
233
-            }
234
-            return true;
235
-        }
236
-        return false;
237
-    }
238
-
239
-
240
-    /**
241
-     * @param string $identifier
242
-     * @param array  $arguments
243
-     * @return mixed
244
-     * @throws InstantiationException
245
-     */
246
-    protected function brewedClosure($identifier, array $arguments)
247
-    {
248
-        $closure = $this->reservoir->get($identifier);
249
-        if (empty($closure)) {
250
-            throw new InstantiationException(
251
-                sprintf(
252
-                    esc_html__(
253
-                        'Could not brew an instance of "%1$s".',
254
-                        'event_espresso'
255
-                    ),
256
-                    $identifier
257
-                )
258
-            );
259
-        }
260
-        return $closure($arguments);
261
-    }
262
-
263
-
264
-    /**
265
-     * @param CoffeeMakerInterface $coffee_maker
266
-     * @param string               $type
267
-     * @return bool
268
-     * @throws InvalidIdentifierException
269
-     * @throws InvalidEntityException
270
-     */
271
-    public function addCoffeeMaker(CoffeeMakerInterface $coffee_maker, $type)
272
-    {
273
-        $type = CoffeeMaker::validateType($type);
274
-        return $this->coffee_makers->add($coffee_maker, $type);
275
-    }
276
-
277
-
278
-    /**
279
-     * @param string   $identifier
280
-     * @param callable $closure
281
-     * @return callable|null
282
-     * @throws InvalidIdentifierException
283
-     * @throws InvalidDataTypeException
284
-     */
285
-    public function addClosure($identifier, $closure)
286
-    {
287
-        if (! is_callable($closure)) {
288
-            throw new InvalidDataTypeException('$closure', $closure, 'Closure');
289
-        }
290
-        $identifier = $this->processIdentifier($identifier);
291
-        if ($this->reservoir->add($closure, $identifier)) {
292
-            return $closure;
293
-        }
294
-        return null;
295
-    }
296
-
297
-
298
-    /**
299
-     * @param string $identifier
300
-     * @return boolean
301
-     * @throws InvalidIdentifierException
302
-     */
303
-    public function removeClosure($identifier)
304
-    {
305
-        $identifier = $this->processIdentifier($identifier);
306
-        if ($this->reservoir->has($identifier)) {
307
-            return $this->reservoir->remove($this->reservoir->get($identifier));
308
-        }
309
-        return false;
310
-    }
311
-
312
-
313
-    /**
314
-     * @param  string $identifier Identifier for the entity class that the service applies to
315
-     *                            Typically a Fully Qualified Class Name
316
-     * @param mixed   $service
317
-     * @return bool
318
-     * @throws \EventEspresso\core\services\container\exceptions\InvalidServiceException
319
-     * @throws InvalidIdentifierException
320
-     */
321
-    public function addService($identifier, $service)
322
-    {
323
-        $identifier = $this->processIdentifier($identifier);
324
-        $service = $this->validateService($identifier, $service);
325
-        return $this->carafe->add($service, $identifier);
326
-    }
327
-
328
-
329
-    /**
330
-     * @param string $identifier
331
-     * @return boolean
332
-     * @throws InvalidIdentifierException
333
-     */
334
-    public function removeService($identifier)
335
-    {
336
-        $identifier = $this->processIdentifier($identifier);
337
-        if ($this->carafe->has($identifier)) {
338
-            return $this->carafe->remove($this->carafe->get($identifier));
339
-        }
340
-        return false;
341
-    }
342
-
343
-
344
-    /**
345
-     * Adds instructions on how to brew objects
346
-     *
347
-     * @param RecipeInterface $recipe
348
-     * @return mixed
349
-     * @throws InvalidIdentifierException
350
-     */
351
-    public function addRecipe(RecipeInterface $recipe)
352
-    {
353
-        $this->addAliases($recipe->identifier(), $recipe->filters());
354
-        $identifier = $this->processIdentifier($recipe->identifier());
355
-        return $this->recipes->add($recipe, $identifier);
356
-    }
357
-
358
-
359
-    /**
360
-     * @param string $identifier The Recipe's identifier
361
-     * @return boolean
362
-     * @throws InvalidIdentifierException
363
-     */
364
-    public function removeRecipe($identifier)
365
-    {
366
-        $identifier = $this->processIdentifier($identifier);
367
-        if ($this->recipes->has($identifier)) {
368
-            return $this->recipes->remove($this->recipes->get($identifier));
369
-        }
370
-        return false;
371
-    }
372
-
373
-
374
-    /**
375
-     * Get instructions on how to brew objects
376
-     *
377
-     * @param  string $identifier Identifier for the entity class that the recipe applies to
378
-     *                            Typically a Fully Qualified Class Name
379
-     * @param string  $type
380
-     * @return RecipeInterface
381
-     * @throws OutOfBoundsException
382
-     * @throws InvalidIdentifierException
383
-     */
384
-    public function getRecipe($identifier, $type = '')
385
-    {
386
-        $identifier = $this->processIdentifier($identifier);
387
-        if ($this->recipes->has($identifier)) {
388
-            return $this->recipes->get($identifier);
389
-        }
390
-        $default_recipes = $this->getDefaultRecipes();
391
-        $matches = array();
392
-        foreach ($default_recipes as $wildcard => $default_recipe) {
393
-            // is the wildcard recipe prefix in the identifier ?
394
-            if (strpos($identifier, $wildcard) !== false) {
395
-                // track matches and use the number of wildcard characters matched for the key
396
-                $matches[ strlen($wildcard) ] = $default_recipe;
397
-            }
398
-        }
399
-        if (count($matches) > 0) {
400
-            // sort our recipes by the number of wildcard characters matched
401
-            ksort($matches);
402
-            // then grab the last recipe form the list, since it had the most matching characters
403
-            $match = array_pop($matches);
404
-            // since we are using a default recipe, we need to set it's identifier and fqcn
405
-            return $this->copyDefaultRecipe($match, $identifier, $type);
406
-        }
407
-        if ($this->recipes->has(Recipe::DEFAULT_ID)) {
408
-            // since we are using a default recipe, we need to set it's identifier and fqcn
409
-            return $this->copyDefaultRecipe($this->recipes->get(Recipe::DEFAULT_ID), $identifier, $type);
410
-        }
411
-        throw new OutOfBoundsException(
412
-            sprintf(
413
-                __('Could not brew coffee because no recipes were found for class "%1$s".', 'event_espresso'),
414
-                $identifier
415
-            )
416
-        );
417
-    }
418
-
419
-
420
-    /**
421
-     * adds class name aliases to list of filters
422
-     *
423
-     * @param  string       $identifier Identifier for the entity class that the alias applies to
424
-     *                                  Typically a Fully Qualified Class Name
425
-     * @param  array|string $aliases
426
-     * @return void
427
-     * @throws InvalidIdentifierException
428
-     */
429
-    public function addAliases($identifier, $aliases)
430
-    {
431
-        if (empty($aliases)) {
432
-            return;
433
-        }
434
-        $identifier = $this->processIdentifier($identifier);
435
-        foreach ((array) $aliases as $alias) {
436
-            $this->filters[ $this->processIdentifier($alias) ] = $identifier;
437
-        }
438
-    }
439
-
440
-
441
-    /**
442
-     * Adds a service to one of the internal collections
443
-     *
444
-     * @param        $identifier
445
-     * @param array  $arguments
446
-     * @param string $type
447
-     * @return mixed
448
-     * @throws InvalidDataTypeException
449
-     * @throws InvalidClassException
450
-     * @throws OutOfBoundsException
451
-     * @throws InvalidIdentifierException
452
-     * @throws ServiceExistsException
453
-     */
454
-    private function makeCoffee($identifier, $arguments = array(), $type = '')
455
-    {
456
-        if ((empty($type) || $type === CoffeeMaker::BREW_SHARED) && $this->has($identifier)) {
457
-            throw new ServiceExistsException($identifier);
458
-        }
459
-        $identifier = $this->filterIdentifier($identifier);
460
-        $recipe = $this->getRecipe($identifier, $type);
461
-        $type = ! empty($type) ? $type : $recipe->type();
462
-        $coffee_maker = $this->getCoffeeMaker($type);
463
-        return $coffee_maker->brew($recipe, $arguments);
464
-    }
465
-
466
-
467
-    /**
468
-     * filters alias identifiers to find the real class name
469
-     *
470
-     * @param  string $identifier Identifier for the entity class that the filter applies to
471
-     *                            Typically a Fully Qualified Class Name
472
-     * @return string
473
-     * @throws InvalidIdentifierException
474
-     */
475
-    private function filterIdentifier($identifier)
476
-    {
477
-        $identifier = $this->processIdentifier($identifier);
478
-        return isset($this->filters[ $identifier ]) && ! empty($this->filters[ $identifier ])
479
-            ? $this->filters[ $identifier ]
480
-            : $identifier;
481
-    }
482
-
483
-
484
-    /**
485
-     * verifies and standardizes identifiers
486
-     *
487
-     * @param  string $identifier Identifier for the entity class
488
-     *                            Typically a Fully Qualified Class Name
489
-     * @return string
490
-     * @throws InvalidIdentifierException
491
-     */
492
-    private function processIdentifier($identifier)
493
-    {
494
-        if (! is_string($identifier)) {
495
-            throw new InvalidIdentifierException(
496
-                is_object($identifier) ? get_class($identifier) : gettype($identifier),
497
-                '\Fully\Qualified\ClassName'
498
-            );
499
-        }
500
-        return ltrim($identifier, '\\');
501
-    }
502
-
503
-
504
-    /**
505
-     * @param string $type
506
-     * @return CoffeeMakerInterface
507
-     * @throws OutOfBoundsException
508
-     * @throws InvalidDataTypeException
509
-     * @throws InvalidClassException
510
-     */
511
-    private function getCoffeeMaker($type)
512
-    {
513
-        if (! $this->coffee_makers->has($type)) {
514
-            throw new OutOfBoundsException(
515
-                __('The requested coffee maker is either missing or invalid.', 'event_espresso')
516
-            );
517
-        }
518
-        return $this->coffee_makers->get($type);
519
-    }
520
-
521
-
522
-    /**
523
-     * Retrieves all recipes that use a wildcard "*" in their identifier
524
-     * This allows recipes to be set up for handling
525
-     * legacy classes that do not support PSR-4 autoloading.
526
-     * for example:
527
-     * using "EEM_*" for a recipe identifier would target all legacy models like EEM_Attendee
528
-     *
529
-     * @return array
530
-     */
531
-    private function getDefaultRecipes()
532
-    {
533
-        $default_recipes = array();
534
-        $this->recipes->rewind();
535
-        while ($this->recipes->valid()) {
536
-            $identifier = $this->recipes->getInfo();
537
-            // does this recipe use a wildcard ? (but is NOT the global default)
538
-            if ($identifier !== Recipe::DEFAULT_ID && strpos($identifier, '*') !== false) {
539
-                // strip the wildcard and use identifier as key
540
-                $default_recipes[ str_replace('*', '', $identifier) ] = $this->recipes->current();
541
-            }
542
-            $this->recipes->next();
543
-        }
544
-        return $default_recipes;
545
-    }
546
-
547
-
548
-    /**
549
-     * clones a default recipe and then copies details
550
-     * from the incoming request to it so that it can be used
551
-     *
552
-     * @param RecipeInterface $default_recipe
553
-     * @param string          $identifier
554
-     * @param string          $type
555
-     * @return RecipeInterface
556
-     */
557
-    private function copyDefaultRecipe(RecipeInterface $default_recipe, $identifier, $type = '')
558
-    {
559
-        $recipe = clone $default_recipe;
560
-        if (! empty($type)) {
561
-            $recipe->setType($type);
562
-        }
563
-        // is this the base default recipe ?
564
-        if ($default_recipe->identifier() === Recipe::DEFAULT_ID) {
565
-            $recipe->setIdentifier($identifier);
566
-            $recipe->setFqcn($identifier);
567
-            return $recipe;
568
-        }
569
-        $recipe->setIdentifier($identifier);
570
-        foreach ($default_recipe->paths() as $path) {
571
-            $path = str_replace('*', $identifier, $path);
572
-            if (is_readable($path)) {
573
-                $recipe->setPaths($path);
574
-            }
575
-        }
576
-        $recipe->setFqcn($identifier);
577
-        return $recipe;
578
-    }
579
-
580
-
581
-    /**
582
-     * @param  string $identifier Identifier for the entity class that the service applies to
583
-     *                            Typically a Fully Qualified Class Name
584
-     * @param mixed   $service
585
-     * @return mixed
586
-     * @throws InvalidServiceException
587
-     */
588
-    private function validateService($identifier, $service)
589
-    {
590
-        if (! is_object($service)) {
591
-            throw new InvalidServiceException(
592
-                $identifier,
593
-                $service
594
-            );
595
-        }
596
-        return $service;
597
-    }
33
+	/**
34
+	 * This was the best coffee related name I could think of to represent class name "aliases"
35
+	 * So classes can be found via an alias identifier,
36
+	 * that is revealed when it is run through... the filters... eh? get it?
37
+	 *
38
+	 * @var array $filters
39
+	 */
40
+	private $filters;
41
+
42
+	/**
43
+	 * These are the classes that will actually build the objects (to order of course)
44
+	 *
45
+	 * @var array $coffee_makers
46
+	 */
47
+	private $coffee_makers;
48
+
49
+	/**
50
+	 * where the instantiated "singleton" objects are stored
51
+	 *
52
+	 * @var CollectionInterface $carafe
53
+	 */
54
+	private $carafe;
55
+
56
+	/**
57
+	 * collection of Recipes that instruct us how to brew objects
58
+	 *
59
+	 * @var CollectionInterface $recipes
60
+	 */
61
+	private $recipes;
62
+
63
+	/**
64
+	 * collection of closures for brewing objects
65
+	 *
66
+	 * @var CollectionInterface $reservoir
67
+	 */
68
+	private $reservoir;
69
+
70
+
71
+	/**
72
+	 * CoffeeShop constructor
73
+	 *
74
+	 * @throws InvalidInterfaceException
75
+	 */
76
+	public function __construct()
77
+	{
78
+		// array for storing class aliases
79
+		$this->filters = array();
80
+		// create collection for storing shared services
81
+		$this->carafe = new LooseCollection('');
82
+		// create collection for storing recipes that tell us how to build services and entities
83
+		$this->recipes = new Collection('EventEspresso\core\services\container\RecipeInterface');
84
+		// create collection for storing closures for constructing new entities
85
+		$this->reservoir = new Collection('Closure');
86
+		// create collection for storing the generators that build our services and entity closures
87
+		$this->coffee_makers = new Collection('EventEspresso\core\services\container\CoffeeMakerInterface');
88
+	}
89
+
90
+
91
+	/**
92
+	 * Returns true if the container can return an entry for the given identifier.
93
+	 * Returns false otherwise.
94
+	 * `has($identifier)` returning true does not mean that `get($identifier)` will not throw an exception.
95
+	 * It does however mean that `get($identifier)` will not throw a `ServiceNotFoundException`.
96
+	 *
97
+	 * @param string $identifier  Identifier of the entry to look for.
98
+	 *                            Typically a Fully Qualified Class Name
99
+	 * @return boolean
100
+	 * @throws InvalidIdentifierException
101
+	 */
102
+	public function has($identifier)
103
+	{
104
+		$identifier = $this->filterIdentifier($identifier);
105
+		return $this->carafe->has($identifier);
106
+	}
107
+
108
+
109
+	/**
110
+	 * finds a previously brewed (SHARED) service and returns it
111
+	 *
112
+	 * @param  string $identifier Identifier for the entity class to be constructed.
113
+	 *                            Typically a Fully Qualified Class Name
114
+	 * @return mixed
115
+	 * @throws InvalidIdentifierException
116
+	 * @throws ServiceNotFoundException No service was found for this identifier.
117
+	 */
118
+	public function get($identifier)
119
+	{
120
+		$identifier = $this->filterIdentifier($identifier);
121
+		if ($this->carafe->has($identifier)) {
122
+			return $this->carafe->get($identifier);
123
+		}
124
+		throw new ServiceNotFoundException($identifier);
125
+	}
126
+
127
+
128
+	/**
129
+	 * returns an instance of the requested entity type using the supplied arguments.
130
+	 * If a shared service is requested and an instance is already in the carafe, then it will be returned.
131
+	 * If it is not already in the carafe, then the service will be constructed, added to the carafe, and returned
132
+	 * If the request is for a new entity and a closure exists in the reservoir for creating it,
133
+	 * then a new entity will be instantiated from the closure and returned.
134
+	 * If a closure does not exist, then one will be built and added to the reservoir
135
+	 * before instantiating the requested entity.
136
+	 *
137
+	 * @param  string $identifier Identifier for the entity class to be constructed.
138
+	 *                            Typically a Fully Qualified Class Name
139
+	 * @param array   $arguments  an array of arguments to be passed to the entity constructor
140
+	 * @param string  $type
141
+	 * @return mixed
142
+	 * @throws OutOfBoundsException
143
+	 * @throws InstantiationException
144
+	 * @throws InvalidDataTypeException
145
+	 * @throws InvalidClassException
146
+	 * @throws InvalidIdentifierException
147
+	 * @throws ServiceExistsException
148
+	 * @throws ServiceNotFoundException No service was found for this identifier.
149
+	 */
150
+	public function brew($identifier, $arguments = array(), $type = '')
151
+	{
152
+		// resolve any class aliases that may exist
153
+		$identifier = $this->filterIdentifier($identifier);
154
+		// is a shared service being requested and already exists in the carafe?
155
+		$brewed = $this->getShared($identifier, $type);
156
+		// then return whatever was found
157
+		if ($brewed !== false) {
158
+			return $brewed;
159
+		}
160
+		// if the reservoir doesn't have a closure already for the requested identifier,
161
+		// then neither a shared service nor a closure for making entities has been built yet
162
+		if (! $this->reservoir->has($identifier)) {
163
+			// so let's brew something up and add it to the proper collection
164
+			$brewed = $this->makeCoffee($identifier, $arguments, $type);
165
+		}
166
+		// did the requested class only require loading, and if so, was that successful?
167
+		if ($this->brewedLoadOnly($brewed, $identifier, $type) === true) {
168
+			return true;
169
+		}
170
+		// was the brewed item a callable factory function ?
171
+		if (is_callable($brewed)) {
172
+			// then instantiate a new entity from the cached closure
173
+			return $brewed($arguments);
174
+		}
175
+		if ($brewed) {
176
+			// requested object was a shared entity, so attempt to get it from the carafe again
177
+			// because if it wasn't there before, then it should have just been brewed and added,
178
+			// but if it still isn't there, then this time the thrown ServiceNotFoundException will not be caught
179
+			return $this->get($identifier);
180
+		}
181
+		// if identifier is for a non-shared entity,
182
+		// then either a cached closure already existed, or was just brewed
183
+		return $this->brewedClosure($identifier, $arguments);
184
+	}
185
+
186
+
187
+	/**
188
+	 * @param string $identifier
189
+	 * @param string $type
190
+	 * @return bool|mixed
191
+	 * @throws InvalidIdentifierException
192
+	 */
193
+	protected function getShared($identifier, $type)
194
+	{
195
+		try {
196
+			if (empty($type) || $type === CoffeeMaker::BREW_SHARED) {
197
+				// if a shared service was requested and an instance is in the carafe, then return it
198
+				return $this->get($identifier);
199
+			}
200
+		} catch (ServiceNotFoundException $e) {
201
+			// if not then we'll just catch the ServiceNotFoundException but not do anything just yet,
202
+			// and instead, attempt to build whatever was requested
203
+		}
204
+		return false;
205
+	}
206
+
207
+
208
+	/**
209
+	 * @param mixed  $brewed
210
+	 * @param string $identifier
211
+	 * @param string $type
212
+	 * @return bool
213
+	 * @throws InvalidClassException
214
+	 * @throws InvalidDataTypeException
215
+	 * @throws InvalidIdentifierException
216
+	 * @throws OutOfBoundsException
217
+	 * @throws ServiceExistsException
218
+	 * @throws ServiceNotFoundException
219
+	 */
220
+	protected function brewedLoadOnly($brewed, $identifier, $type)
221
+	{
222
+		if ($type === CoffeeMaker::BREW_LOAD_ONLY) {
223
+			if ($brewed !== true) {
224
+				throw new ServiceNotFoundException(
225
+					sprintf(
226
+						esc_html__(
227
+							'The "%1$s" class could not be loaded.',
228
+							'event_espresso'
229
+						),
230
+						$identifier
231
+					)
232
+				);
233
+			}
234
+			return true;
235
+		}
236
+		return false;
237
+	}
238
+
239
+
240
+	/**
241
+	 * @param string $identifier
242
+	 * @param array  $arguments
243
+	 * @return mixed
244
+	 * @throws InstantiationException
245
+	 */
246
+	protected function brewedClosure($identifier, array $arguments)
247
+	{
248
+		$closure = $this->reservoir->get($identifier);
249
+		if (empty($closure)) {
250
+			throw new InstantiationException(
251
+				sprintf(
252
+					esc_html__(
253
+						'Could not brew an instance of "%1$s".',
254
+						'event_espresso'
255
+					),
256
+					$identifier
257
+				)
258
+			);
259
+		}
260
+		return $closure($arguments);
261
+	}
262
+
263
+
264
+	/**
265
+	 * @param CoffeeMakerInterface $coffee_maker
266
+	 * @param string               $type
267
+	 * @return bool
268
+	 * @throws InvalidIdentifierException
269
+	 * @throws InvalidEntityException
270
+	 */
271
+	public function addCoffeeMaker(CoffeeMakerInterface $coffee_maker, $type)
272
+	{
273
+		$type = CoffeeMaker::validateType($type);
274
+		return $this->coffee_makers->add($coffee_maker, $type);
275
+	}
276
+
277
+
278
+	/**
279
+	 * @param string   $identifier
280
+	 * @param callable $closure
281
+	 * @return callable|null
282
+	 * @throws InvalidIdentifierException
283
+	 * @throws InvalidDataTypeException
284
+	 */
285
+	public function addClosure($identifier, $closure)
286
+	{
287
+		if (! is_callable($closure)) {
288
+			throw new InvalidDataTypeException('$closure', $closure, 'Closure');
289
+		}
290
+		$identifier = $this->processIdentifier($identifier);
291
+		if ($this->reservoir->add($closure, $identifier)) {
292
+			return $closure;
293
+		}
294
+		return null;
295
+	}
296
+
297
+
298
+	/**
299
+	 * @param string $identifier
300
+	 * @return boolean
301
+	 * @throws InvalidIdentifierException
302
+	 */
303
+	public function removeClosure($identifier)
304
+	{
305
+		$identifier = $this->processIdentifier($identifier);
306
+		if ($this->reservoir->has($identifier)) {
307
+			return $this->reservoir->remove($this->reservoir->get($identifier));
308
+		}
309
+		return false;
310
+	}
311
+
312
+
313
+	/**
314
+	 * @param  string $identifier Identifier for the entity class that the service applies to
315
+	 *                            Typically a Fully Qualified Class Name
316
+	 * @param mixed   $service
317
+	 * @return bool
318
+	 * @throws \EventEspresso\core\services\container\exceptions\InvalidServiceException
319
+	 * @throws InvalidIdentifierException
320
+	 */
321
+	public function addService($identifier, $service)
322
+	{
323
+		$identifier = $this->processIdentifier($identifier);
324
+		$service = $this->validateService($identifier, $service);
325
+		return $this->carafe->add($service, $identifier);
326
+	}
327
+
328
+
329
+	/**
330
+	 * @param string $identifier
331
+	 * @return boolean
332
+	 * @throws InvalidIdentifierException
333
+	 */
334
+	public function removeService($identifier)
335
+	{
336
+		$identifier = $this->processIdentifier($identifier);
337
+		if ($this->carafe->has($identifier)) {
338
+			return $this->carafe->remove($this->carafe->get($identifier));
339
+		}
340
+		return false;
341
+	}
342
+
343
+
344
+	/**
345
+	 * Adds instructions on how to brew objects
346
+	 *
347
+	 * @param RecipeInterface $recipe
348
+	 * @return mixed
349
+	 * @throws InvalidIdentifierException
350
+	 */
351
+	public function addRecipe(RecipeInterface $recipe)
352
+	{
353
+		$this->addAliases($recipe->identifier(), $recipe->filters());
354
+		$identifier = $this->processIdentifier($recipe->identifier());
355
+		return $this->recipes->add($recipe, $identifier);
356
+	}
357
+
358
+
359
+	/**
360
+	 * @param string $identifier The Recipe's identifier
361
+	 * @return boolean
362
+	 * @throws InvalidIdentifierException
363
+	 */
364
+	public function removeRecipe($identifier)
365
+	{
366
+		$identifier = $this->processIdentifier($identifier);
367
+		if ($this->recipes->has($identifier)) {
368
+			return $this->recipes->remove($this->recipes->get($identifier));
369
+		}
370
+		return false;
371
+	}
372
+
373
+
374
+	/**
375
+	 * Get instructions on how to brew objects
376
+	 *
377
+	 * @param  string $identifier Identifier for the entity class that the recipe applies to
378
+	 *                            Typically a Fully Qualified Class Name
379
+	 * @param string  $type
380
+	 * @return RecipeInterface
381
+	 * @throws OutOfBoundsException
382
+	 * @throws InvalidIdentifierException
383
+	 */
384
+	public function getRecipe($identifier, $type = '')
385
+	{
386
+		$identifier = $this->processIdentifier($identifier);
387
+		if ($this->recipes->has($identifier)) {
388
+			return $this->recipes->get($identifier);
389
+		}
390
+		$default_recipes = $this->getDefaultRecipes();
391
+		$matches = array();
392
+		foreach ($default_recipes as $wildcard => $default_recipe) {
393
+			// is the wildcard recipe prefix in the identifier ?
394
+			if (strpos($identifier, $wildcard) !== false) {
395
+				// track matches and use the number of wildcard characters matched for the key
396
+				$matches[ strlen($wildcard) ] = $default_recipe;
397
+			}
398
+		}
399
+		if (count($matches) > 0) {
400
+			// sort our recipes by the number of wildcard characters matched
401
+			ksort($matches);
402
+			// then grab the last recipe form the list, since it had the most matching characters
403
+			$match = array_pop($matches);
404
+			// since we are using a default recipe, we need to set it's identifier and fqcn
405
+			return $this->copyDefaultRecipe($match, $identifier, $type);
406
+		}
407
+		if ($this->recipes->has(Recipe::DEFAULT_ID)) {
408
+			// since we are using a default recipe, we need to set it's identifier and fqcn
409
+			return $this->copyDefaultRecipe($this->recipes->get(Recipe::DEFAULT_ID), $identifier, $type);
410
+		}
411
+		throw new OutOfBoundsException(
412
+			sprintf(
413
+				__('Could not brew coffee because no recipes were found for class "%1$s".', 'event_espresso'),
414
+				$identifier
415
+			)
416
+		);
417
+	}
418
+
419
+
420
+	/**
421
+	 * adds class name aliases to list of filters
422
+	 *
423
+	 * @param  string       $identifier Identifier for the entity class that the alias applies to
424
+	 *                                  Typically a Fully Qualified Class Name
425
+	 * @param  array|string $aliases
426
+	 * @return void
427
+	 * @throws InvalidIdentifierException
428
+	 */
429
+	public function addAliases($identifier, $aliases)
430
+	{
431
+		if (empty($aliases)) {
432
+			return;
433
+		}
434
+		$identifier = $this->processIdentifier($identifier);
435
+		foreach ((array) $aliases as $alias) {
436
+			$this->filters[ $this->processIdentifier($alias) ] = $identifier;
437
+		}
438
+	}
439
+
440
+
441
+	/**
442
+	 * Adds a service to one of the internal collections
443
+	 *
444
+	 * @param        $identifier
445
+	 * @param array  $arguments
446
+	 * @param string $type
447
+	 * @return mixed
448
+	 * @throws InvalidDataTypeException
449
+	 * @throws InvalidClassException
450
+	 * @throws OutOfBoundsException
451
+	 * @throws InvalidIdentifierException
452
+	 * @throws ServiceExistsException
453
+	 */
454
+	private function makeCoffee($identifier, $arguments = array(), $type = '')
455
+	{
456
+		if ((empty($type) || $type === CoffeeMaker::BREW_SHARED) && $this->has($identifier)) {
457
+			throw new ServiceExistsException($identifier);
458
+		}
459
+		$identifier = $this->filterIdentifier($identifier);
460
+		$recipe = $this->getRecipe($identifier, $type);
461
+		$type = ! empty($type) ? $type : $recipe->type();
462
+		$coffee_maker = $this->getCoffeeMaker($type);
463
+		return $coffee_maker->brew($recipe, $arguments);
464
+	}
465
+
466
+
467
+	/**
468
+	 * filters alias identifiers to find the real class name
469
+	 *
470
+	 * @param  string $identifier Identifier for the entity class that the filter applies to
471
+	 *                            Typically a Fully Qualified Class Name
472
+	 * @return string
473
+	 * @throws InvalidIdentifierException
474
+	 */
475
+	private function filterIdentifier($identifier)
476
+	{
477
+		$identifier = $this->processIdentifier($identifier);
478
+		return isset($this->filters[ $identifier ]) && ! empty($this->filters[ $identifier ])
479
+			? $this->filters[ $identifier ]
480
+			: $identifier;
481
+	}
482
+
483
+
484
+	/**
485
+	 * verifies and standardizes identifiers
486
+	 *
487
+	 * @param  string $identifier Identifier for the entity class
488
+	 *                            Typically a Fully Qualified Class Name
489
+	 * @return string
490
+	 * @throws InvalidIdentifierException
491
+	 */
492
+	private function processIdentifier($identifier)
493
+	{
494
+		if (! is_string($identifier)) {
495
+			throw new InvalidIdentifierException(
496
+				is_object($identifier) ? get_class($identifier) : gettype($identifier),
497
+				'\Fully\Qualified\ClassName'
498
+			);
499
+		}
500
+		return ltrim($identifier, '\\');
501
+	}
502
+
503
+
504
+	/**
505
+	 * @param string $type
506
+	 * @return CoffeeMakerInterface
507
+	 * @throws OutOfBoundsException
508
+	 * @throws InvalidDataTypeException
509
+	 * @throws InvalidClassException
510
+	 */
511
+	private function getCoffeeMaker($type)
512
+	{
513
+		if (! $this->coffee_makers->has($type)) {
514
+			throw new OutOfBoundsException(
515
+				__('The requested coffee maker is either missing or invalid.', 'event_espresso')
516
+			);
517
+		}
518
+		return $this->coffee_makers->get($type);
519
+	}
520
+
521
+
522
+	/**
523
+	 * Retrieves all recipes that use a wildcard "*" in their identifier
524
+	 * This allows recipes to be set up for handling
525
+	 * legacy classes that do not support PSR-4 autoloading.
526
+	 * for example:
527
+	 * using "EEM_*" for a recipe identifier would target all legacy models like EEM_Attendee
528
+	 *
529
+	 * @return array
530
+	 */
531
+	private function getDefaultRecipes()
532
+	{
533
+		$default_recipes = array();
534
+		$this->recipes->rewind();
535
+		while ($this->recipes->valid()) {
536
+			$identifier = $this->recipes->getInfo();
537
+			// does this recipe use a wildcard ? (but is NOT the global default)
538
+			if ($identifier !== Recipe::DEFAULT_ID && strpos($identifier, '*') !== false) {
539
+				// strip the wildcard and use identifier as key
540
+				$default_recipes[ str_replace('*', '', $identifier) ] = $this->recipes->current();
541
+			}
542
+			$this->recipes->next();
543
+		}
544
+		return $default_recipes;
545
+	}
546
+
547
+
548
+	/**
549
+	 * clones a default recipe and then copies details
550
+	 * from the incoming request to it so that it can be used
551
+	 *
552
+	 * @param RecipeInterface $default_recipe
553
+	 * @param string          $identifier
554
+	 * @param string          $type
555
+	 * @return RecipeInterface
556
+	 */
557
+	private function copyDefaultRecipe(RecipeInterface $default_recipe, $identifier, $type = '')
558
+	{
559
+		$recipe = clone $default_recipe;
560
+		if (! empty($type)) {
561
+			$recipe->setType($type);
562
+		}
563
+		// is this the base default recipe ?
564
+		if ($default_recipe->identifier() === Recipe::DEFAULT_ID) {
565
+			$recipe->setIdentifier($identifier);
566
+			$recipe->setFqcn($identifier);
567
+			return $recipe;
568
+		}
569
+		$recipe->setIdentifier($identifier);
570
+		foreach ($default_recipe->paths() as $path) {
571
+			$path = str_replace('*', $identifier, $path);
572
+			if (is_readable($path)) {
573
+				$recipe->setPaths($path);
574
+			}
575
+		}
576
+		$recipe->setFqcn($identifier);
577
+		return $recipe;
578
+	}
579
+
580
+
581
+	/**
582
+	 * @param  string $identifier Identifier for the entity class that the service applies to
583
+	 *                            Typically a Fully Qualified Class Name
584
+	 * @param mixed   $service
585
+	 * @return mixed
586
+	 * @throws InvalidServiceException
587
+	 */
588
+	private function validateService($identifier, $service)
589
+	{
590
+		if (! is_object($service)) {
591
+			throw new InvalidServiceException(
592
+				$identifier,
593
+				$service
594
+			);
595
+		}
596
+		return $service;
597
+	}
598 598
 }
Please login to merge, or discard this patch.
Spacing   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -159,7 +159,7 @@  discard block
 block discarded – undo
159 159
         }
160 160
         // if the reservoir doesn't have a closure already for the requested identifier,
161 161
         // then neither a shared service nor a closure for making entities has been built yet
162
-        if (! $this->reservoir->has($identifier)) {
162
+        if ( ! $this->reservoir->has($identifier)) {
163 163
             // so let's brew something up and add it to the proper collection
164 164
             $brewed = $this->makeCoffee($identifier, $arguments, $type);
165 165
         }
@@ -284,7 +284,7 @@  discard block
 block discarded – undo
284 284
      */
285 285
     public function addClosure($identifier, $closure)
286 286
     {
287
-        if (! is_callable($closure)) {
287
+        if ( ! is_callable($closure)) {
288 288
             throw new InvalidDataTypeException('$closure', $closure, 'Closure');
289 289
         }
290 290
         $identifier = $this->processIdentifier($identifier);
@@ -393,7 +393,7 @@  discard block
 block discarded – undo
393 393
             // is the wildcard recipe prefix in the identifier ?
394 394
             if (strpos($identifier, $wildcard) !== false) {
395 395
                 // track matches and use the number of wildcard characters matched for the key
396
-                $matches[ strlen($wildcard) ] = $default_recipe;
396
+                $matches[strlen($wildcard)] = $default_recipe;
397 397
             }
398 398
         }
399 399
         if (count($matches) > 0) {
@@ -433,7 +433,7 @@  discard block
 block discarded – undo
433 433
         }
434 434
         $identifier = $this->processIdentifier($identifier);
435 435
         foreach ((array) $aliases as $alias) {
436
-            $this->filters[ $this->processIdentifier($alias) ] = $identifier;
436
+            $this->filters[$this->processIdentifier($alias)] = $identifier;
437 437
         }
438 438
     }
439 439
 
@@ -475,8 +475,8 @@  discard block
 block discarded – undo
475 475
     private function filterIdentifier($identifier)
476 476
     {
477 477
         $identifier = $this->processIdentifier($identifier);
478
-        return isset($this->filters[ $identifier ]) && ! empty($this->filters[ $identifier ])
479
-            ? $this->filters[ $identifier ]
478
+        return isset($this->filters[$identifier]) && ! empty($this->filters[$identifier])
479
+            ? $this->filters[$identifier]
480 480
             : $identifier;
481 481
     }
482 482
 
@@ -491,7 +491,7 @@  discard block
 block discarded – undo
491 491
      */
492 492
     private function processIdentifier($identifier)
493 493
     {
494
-        if (! is_string($identifier)) {
494
+        if ( ! is_string($identifier)) {
495 495
             throw new InvalidIdentifierException(
496 496
                 is_object($identifier) ? get_class($identifier) : gettype($identifier),
497 497
                 '\Fully\Qualified\ClassName'
@@ -510,7 +510,7 @@  discard block
 block discarded – undo
510 510
      */
511 511
     private function getCoffeeMaker($type)
512 512
     {
513
-        if (! $this->coffee_makers->has($type)) {
513
+        if ( ! $this->coffee_makers->has($type)) {
514 514
             throw new OutOfBoundsException(
515 515
                 __('The requested coffee maker is either missing or invalid.', 'event_espresso')
516 516
             );
@@ -537,7 +537,7 @@  discard block
 block discarded – undo
537 537
             // does this recipe use a wildcard ? (but is NOT the global default)
538 538
             if ($identifier !== Recipe::DEFAULT_ID && strpos($identifier, '*') !== false) {
539 539
                 // strip the wildcard and use identifier as key
540
-                $default_recipes[ str_replace('*', '', $identifier) ] = $this->recipes->current();
540
+                $default_recipes[str_replace('*', '', $identifier)] = $this->recipes->current();
541 541
             }
542 542
             $this->recipes->next();
543 543
         }
@@ -557,7 +557,7 @@  discard block
 block discarded – undo
557 557
     private function copyDefaultRecipe(RecipeInterface $default_recipe, $identifier, $type = '')
558 558
     {
559 559
         $recipe = clone $default_recipe;
560
-        if (! empty($type)) {
560
+        if ( ! empty($type)) {
561 561
             $recipe->setType($type);
562 562
         }
563 563
         // is this the base default recipe ?
@@ -587,7 +587,7 @@  discard block
 block discarded – undo
587 587
      */
588 588
     private function validateService($identifier, $service)
589 589
     {
590
-        if (! is_object($service)) {
590
+        if ( ! is_object($service)) {
591 591
             throw new InvalidServiceException(
592 592
                 $identifier,
593 593
                 $service
Please login to merge, or discard this patch.
core/services/container/CoffeeMaker.php 2 patches
Indentation   +152 added lines, -152 removed lines patch added patch discarded remove patch
@@ -18,156 +18,156 @@
 block discarded – undo
18 18
 abstract class CoffeeMaker implements CoffeeMakerInterface
19 19
 {
20 20
 
21
-    /**
22
-     * Indicates that CoffeeMaker should construct a NEW entity instance from the provided arguments (if given)
23
-     */
24
-    const BREW_NEW = 'new';
25
-
26
-    /**
27
-     * Indicates that CoffeeMaker should always return a SHARED instance
28
-     */
29
-    const BREW_SHARED = 'shared';
30
-
31
-    /**
32
-     * Indicates that CoffeeMaker should only load the file/class/interface but NOT instantiate
33
-     */
34
-    const BREW_LOAD_ONLY = 'load_only';
35
-
36
-
37
-    /**
38
-     * @var CoffeePotInterface $coffee_pot
39
-     */
40
-    private $coffee_pot;
41
-
42
-    /**
43
-     * @var DependencyInjector $injector
44
-     */
45
-    private $injector;
46
-
47
-
48
-    /**
49
-     * @return array
50
-     */
51
-    public static function getTypes()
52
-    {
53
-        return (array) apply_filters(
54
-            'FHEE__EventEspresso\core\services\container\CoffeeMaker__getTypes',
55
-            array(
56
-                CoffeeMaker::BREW_NEW,
57
-                CoffeeMaker::BREW_SHARED,
58
-                CoffeeMaker::BREW_LOAD_ONLY,
59
-            )
60
-        );
61
-    }
62
-
63
-
64
-    /**
65
-     * @param $type
66
-     * @throws \EventEspresso\core\exceptions\InvalidIdentifierException
67
-     */
68
-    public static function validateType($type)
69
-    {
70
-        $types = CoffeeMaker::getTypes();
71
-        if (! in_array($type, $types, true)) {
72
-            throw new InvalidIdentifierException(
73
-                is_object($type) ? get_class($type) : gettype($type),
74
-                __(
75
-                    'recipe type (one of the class constants on \EventEspresso\core\services\container\CoffeeMaker)',
76
-                    'event_espresso'
77
-                )
78
-            );
79
-        }
80
-        return $type;
81
-    }
82
-
83
-
84
-    /**
85
-     * CoffeeMaker constructor.
86
-     *
87
-     * @param CoffeePotInterface $coffee_pot
88
-     * @param InjectorInterface  $injector
89
-     */
90
-    public function __construct(CoffeePotInterface $coffee_pot, InjectorInterface $injector)
91
-    {
92
-        $this->coffee_pot = $coffee_pot;
93
-        $this->injector = $injector;
94
-    }
95
-
96
-
97
-    /**
98
-     * @return \EventEspresso\core\services\container\CoffeePotInterface
99
-     */
100
-    protected function coffeePot()
101
-    {
102
-        return $this->coffee_pot;
103
-    }
104
-
105
-
106
-    /**
107
-     * @return \EventEspresso\core\services\container\DependencyInjector
108
-     */
109
-    protected function injector()
110
-    {
111
-        return $this->injector;
112
-    }
113
-
114
-
115
-    /**
116
-     * Examines the constructor to determine which method should be used for instantiation
117
-     *
118
-     * @param \ReflectionClass $reflector
119
-     * @return mixed
120
-     * @throws InstantiationException
121
-     */
122
-    protected function resolveInstantiationMethod(\ReflectionClass $reflector)
123
-    {
124
-        if ($reflector->getConstructor() === null) {
125
-            return 'NewInstance';
126
-        }
127
-        if ($reflector->isInstantiable()) {
128
-            return 'NewInstanceArgs';
129
-        }
130
-        if (method_exists($reflector->getName(), 'instance')) {
131
-            return 'instance';
132
-        }
133
-        if (method_exists($reflector->getName(), 'new_instance')) {
134
-            return 'new_instance';
135
-        }
136
-        if (method_exists($reflector->getName(), 'new_instance_from_db')) {
137
-            return 'new_instance_from_db';
138
-        }
139
-        throw new InstantiationException($reflector->getName());
140
-    }
141
-
142
-
143
-    /**
144
-     * Ensures files for classes that are not PSR-4 compatible are loaded
145
-     * and then verifies that classes exist where applicable
146
-     *
147
-     * @param RecipeInterface $recipe
148
-     * @return bool
149
-     * @throws InvalidClassException
150
-     */
151
-    protected function resolveClassAndFilepath(RecipeInterface $recipe)
152
-    {
153
-        $paths = $recipe->paths();
154
-        if (! empty($paths)) {
155
-            foreach ($paths as $path) {
156
-                if (strpos($path, '*') === false && is_readable($path)) {
157
-                    require_once($path);
158
-                }
159
-            }
160
-        }
161
-        // re: using "false" for class_exists() second param:
162
-        // if a class name is not already known to PHP, then class_exists() will run through
163
-        // all of the registered spl_autoload functions until it either finds the class,
164
-        // or gets to the end of the registered spl_autoload functions.
165
-        // When the second parameter is true, it will also attempt to load the class file,
166
-        // but it will also trigger an error if the class can not be loaded.
167
-        // We don't want that extra error in the mix, so we have set the second param to "false"
168
-        if ($recipe->type() !== CoffeeMaker::BREW_LOAD_ONLY && ! class_exists($recipe->fqcn(), false)) {
169
-            throw new InvalidClassException($recipe->identifier());
170
-        }
171
-        return true;
172
-    }
21
+	/**
22
+	 * Indicates that CoffeeMaker should construct a NEW entity instance from the provided arguments (if given)
23
+	 */
24
+	const BREW_NEW = 'new';
25
+
26
+	/**
27
+	 * Indicates that CoffeeMaker should always return a SHARED instance
28
+	 */
29
+	const BREW_SHARED = 'shared';
30
+
31
+	/**
32
+	 * Indicates that CoffeeMaker should only load the file/class/interface but NOT instantiate
33
+	 */
34
+	const BREW_LOAD_ONLY = 'load_only';
35
+
36
+
37
+	/**
38
+	 * @var CoffeePotInterface $coffee_pot
39
+	 */
40
+	private $coffee_pot;
41
+
42
+	/**
43
+	 * @var DependencyInjector $injector
44
+	 */
45
+	private $injector;
46
+
47
+
48
+	/**
49
+	 * @return array
50
+	 */
51
+	public static function getTypes()
52
+	{
53
+		return (array) apply_filters(
54
+			'FHEE__EventEspresso\core\services\container\CoffeeMaker__getTypes',
55
+			array(
56
+				CoffeeMaker::BREW_NEW,
57
+				CoffeeMaker::BREW_SHARED,
58
+				CoffeeMaker::BREW_LOAD_ONLY,
59
+			)
60
+		);
61
+	}
62
+
63
+
64
+	/**
65
+	 * @param $type
66
+	 * @throws \EventEspresso\core\exceptions\InvalidIdentifierException
67
+	 */
68
+	public static function validateType($type)
69
+	{
70
+		$types = CoffeeMaker::getTypes();
71
+		if (! in_array($type, $types, true)) {
72
+			throw new InvalidIdentifierException(
73
+				is_object($type) ? get_class($type) : gettype($type),
74
+				__(
75
+					'recipe type (one of the class constants on \EventEspresso\core\services\container\CoffeeMaker)',
76
+					'event_espresso'
77
+				)
78
+			);
79
+		}
80
+		return $type;
81
+	}
82
+
83
+
84
+	/**
85
+	 * CoffeeMaker constructor.
86
+	 *
87
+	 * @param CoffeePotInterface $coffee_pot
88
+	 * @param InjectorInterface  $injector
89
+	 */
90
+	public function __construct(CoffeePotInterface $coffee_pot, InjectorInterface $injector)
91
+	{
92
+		$this->coffee_pot = $coffee_pot;
93
+		$this->injector = $injector;
94
+	}
95
+
96
+
97
+	/**
98
+	 * @return \EventEspresso\core\services\container\CoffeePotInterface
99
+	 */
100
+	protected function coffeePot()
101
+	{
102
+		return $this->coffee_pot;
103
+	}
104
+
105
+
106
+	/**
107
+	 * @return \EventEspresso\core\services\container\DependencyInjector
108
+	 */
109
+	protected function injector()
110
+	{
111
+		return $this->injector;
112
+	}
113
+
114
+
115
+	/**
116
+	 * Examines the constructor to determine which method should be used for instantiation
117
+	 *
118
+	 * @param \ReflectionClass $reflector
119
+	 * @return mixed
120
+	 * @throws InstantiationException
121
+	 */
122
+	protected function resolveInstantiationMethod(\ReflectionClass $reflector)
123
+	{
124
+		if ($reflector->getConstructor() === null) {
125
+			return 'NewInstance';
126
+		}
127
+		if ($reflector->isInstantiable()) {
128
+			return 'NewInstanceArgs';
129
+		}
130
+		if (method_exists($reflector->getName(), 'instance')) {
131
+			return 'instance';
132
+		}
133
+		if (method_exists($reflector->getName(), 'new_instance')) {
134
+			return 'new_instance';
135
+		}
136
+		if (method_exists($reflector->getName(), 'new_instance_from_db')) {
137
+			return 'new_instance_from_db';
138
+		}
139
+		throw new InstantiationException($reflector->getName());
140
+	}
141
+
142
+
143
+	/**
144
+	 * Ensures files for classes that are not PSR-4 compatible are loaded
145
+	 * and then verifies that classes exist where applicable
146
+	 *
147
+	 * @param RecipeInterface $recipe
148
+	 * @return bool
149
+	 * @throws InvalidClassException
150
+	 */
151
+	protected function resolveClassAndFilepath(RecipeInterface $recipe)
152
+	{
153
+		$paths = $recipe->paths();
154
+		if (! empty($paths)) {
155
+			foreach ($paths as $path) {
156
+				if (strpos($path, '*') === false && is_readable($path)) {
157
+					require_once($path);
158
+				}
159
+			}
160
+		}
161
+		// re: using "false" for class_exists() second param:
162
+		// if a class name is not already known to PHP, then class_exists() will run through
163
+		// all of the registered spl_autoload functions until it either finds the class,
164
+		// or gets to the end of the registered spl_autoload functions.
165
+		// When the second parameter is true, it will also attempt to load the class file,
166
+		// but it will also trigger an error if the class can not be loaded.
167
+		// We don't want that extra error in the mix, so we have set the second param to "false"
168
+		if ($recipe->type() !== CoffeeMaker::BREW_LOAD_ONLY && ! class_exists($recipe->fqcn(), false)) {
169
+			throw new InvalidClassException($recipe->identifier());
170
+		}
171
+		return true;
172
+	}
173 173
 }
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -68,7 +68,7 @@  discard block
 block discarded – undo
68 68
     public static function validateType($type)
69 69
     {
70 70
         $types = CoffeeMaker::getTypes();
71
-        if (! in_array($type, $types, true)) {
71
+        if ( ! in_array($type, $types, true)) {
72 72
             throw new InvalidIdentifierException(
73 73
                 is_object($type) ? get_class($type) : gettype($type),
74 74
                 __(
@@ -151,7 +151,7 @@  discard block
 block discarded – undo
151 151
     protected function resolveClassAndFilepath(RecipeInterface $recipe)
152 152
     {
153 153
         $paths = $recipe->paths();
154
-        if (! empty($paths)) {
154
+        if ( ! empty($paths)) {
155 155
             foreach ($paths as $path) {
156 156
                 if (strpos($path, '*') === false && is_readable($path)) {
157 157
                     require_once($path);
Please login to merge, or discard this patch.
core/services/container/DependencyInjector.php 2 patches
Indentation   +205 added lines, -205 removed lines patch added patch discarded remove patch
@@ -21,209 +21,209 @@
 block discarded – undo
21 21
 class DependencyInjector implements InjectorInterface
22 22
 {
23 23
 
24
-    /**
25
-     * @var CoffeePotInterface $coffee_pot
26
-     */
27
-    private $coffee_pot;
28
-
29
-    /**
30
-     * @var EEH_Array $array_helper
31
-     */
32
-    private $array_helper;
33
-
34
-    /**
35
-     * @var ReflectionClass[] $reflectors
36
-     */
37
-    private $reflectors;
38
-
39
-    /**
40
-     * @var ReflectionMethod[] $constructors
41
-     */
42
-    private $constructors;
43
-
44
-    /**
45
-     * @var ReflectionParameter[] $parameters
46
-     */
47
-    private $parameters;
48
-
49
-
50
-    /**
51
-     * DependencyInjector constructor
52
-     *
53
-     * @param CoffeePotInterface $coffee_pot
54
-     * @param EEH_Array          $array_helper
55
-     */
56
-    public function __construct(CoffeePotInterface $coffee_pot, EEH_Array $array_helper)
57
-    {
58
-        $this->coffee_pot = $coffee_pot;
59
-        $this->array_helper = $array_helper;
60
-    }
61
-
62
-
63
-    /**
64
-     * getReflectionClass
65
-     * checks if a ReflectionClass object has already been generated for a class
66
-     * and returns that instead of creating a new one
67
-     *
68
-     * @param string $class_name
69
-     * @return ReflectionClass
70
-     */
71
-    public function getReflectionClass($class_name)
72
-    {
73
-        if (! isset($this->reflectors[ $class_name ])
74
-            || ! $this->reflectors[ $class_name ] instanceof ReflectionClass
75
-        ) {
76
-            $this->reflectors[ $class_name ] = new ReflectionClass($class_name);
77
-        }
78
-        return $this->reflectors[ $class_name ];
79
-    }
80
-
81
-
82
-    /**
83
-     * getConstructor
84
-     * checks if a ReflectionMethod object has already been generated for the class constructor
85
-     * and returns that instead of creating a new one
86
-     *
87
-     * @param ReflectionClass $reflector
88
-     * @return ReflectionMethod
89
-     */
90
-    protected function getConstructor(ReflectionClass $reflector)
91
-    {
92
-        if (! isset($this->constructors[ $reflector->getName() ])
93
-            || ! $this->constructors[ $reflector->getName() ] instanceof ReflectionMethod
94
-        ) {
95
-            $this->constructors[ $reflector->getName() ] = $reflector->getConstructor();
96
-        }
97
-        return $this->constructors[ $reflector->getName() ];
98
-    }
99
-
100
-
101
-    /**
102
-     * getParameters
103
-     * checks if an array of ReflectionParameter objects has already been generated for the class constructor
104
-     * and returns that instead of creating a new one
105
-     *
106
-     * @param ReflectionMethod $constructor
107
-     * @return ReflectionParameter[]
108
-     */
109
-    protected function getParameters(ReflectionMethod $constructor)
110
-    {
111
-        if (! isset($this->parameters[ $constructor->class ])) {
112
-            $this->parameters[ $constructor->class ] = $constructor->getParameters();
113
-        }
114
-        return $this->parameters[ $constructor->class ];
115
-    }
116
-
117
-
118
-    /**
119
-     * resolveDependencies
120
-     * examines the constructor for the requested class to determine
121
-     * if any dependencies exist, and if they can be injected.
122
-     * If so, then those classes will be added to the array of arguments passed to the constructor
123
-     * PLZ NOTE: this is achieved by type hinting the constructor params
124
-     * For example:
125
-     *        if attempting to load a class "Foo" with the following constructor:
126
-     *        __construct( Bar $bar_class, Fighter $grohl_class )
127
-     *        then $bar_class and $grohl_class will be added to the $arguments array,
128
-     *        but only IF they are NOT already present in the incoming arguments array,
129
-     *        and the correct classes can be loaded
130
-     *
131
-     * @param RecipeInterface $recipe
132
-     * @param ReflectionClass $reflector
133
-     * @param array           $arguments
134
-     * @return array
135
-     * @throws UnexpectedValueException
136
-     */
137
-    public function resolveDependencies(RecipeInterface $recipe, ReflectionClass $reflector, $arguments = array())
138
-    {
139
-        // if arguments array is numerically and sequentially indexed, then we want it to remain as is,
140
-        // else wrap it in an additional array so that it doesn't get split into multiple parameters
141
-        $arguments = $this->array_helper->is_array_numerically_and_sequentially_indexed($arguments)
142
-            ? $arguments
143
-            : array($arguments);
144
-        $resolved_parameters = array();
145
-        // let's examine the constructor
146
-        // let's examine the constructor
147
-        $constructor = $this->getConstructor($reflector);
148
-        // whu? huh? nothing?
149
-        if (! $constructor) {
150
-            return $arguments;
151
-        }
152
-        // get constructor parameters
153
-        $params = $this->getParameters($constructor);
154
-        if (empty($params)) {
155
-            return $resolved_parameters;
156
-        }
157
-        $ingredients = $recipe->ingredients();
158
-        // and the keys for the incoming arguments array so that we can compare existing arguments with what is expected
159
-        $argument_keys = array_keys($arguments);
160
-        // now loop thru all of the constructors expected parameters
161
-        foreach ($params as $index => $param) {
162
-            if (! $param instanceof ReflectionParameter) {
163
-                continue;
164
-            }
165
-            // is this a dependency for a specific class ?
166
-            $param_class = $param->getClass() ? $param->getClass()->name : '';
167
-            $param_name = $param->getName() ? $param->getName() : '';
168
-            if (// param is not a class but is specified in the list of ingredients for this Recipe
169
-                is_string($param_name) && isset($ingredients[ $param_name ])
170
-            ) {
171
-                // attempt to inject the dependency
172
-                $resolved_parameters[ $index ] = $ingredients[ $param_name ];
173
-            } elseif (// param is specified in the list of ingredients for this Recipe
174
-            isset($ingredients[ $param_class ])
175
-            ) { // attempt to inject the dependency
176
-                $resolved_parameters[ $index ] = $this->injectDependency($reflector, $ingredients[ $param_class ]);
177
-            } elseif (// param is not even a class
178
-                empty($param_class)
179
-                // and something already exists in the incoming arguments for this param
180
-                && isset($argument_keys[ $index ], $arguments[ $argument_keys[ $index ] ])
181
-            ) {
182
-                // add parameter from incoming arguments
183
-                $resolved_parameters[ $index ] = $arguments[ $argument_keys[ $index ] ];
184
-            } elseif (// parameter is type hinted as a class, exists as an incoming argument, AND it's the correct class
185
-                ! empty($param_class)
186
-                && isset($argument_keys[ $index ], $arguments[ $argument_keys[ $index ] ])
187
-                && $arguments[ $argument_keys[ $index ] ] instanceof $param_class
188
-            ) {
189
-                // add parameter from incoming arguments
190
-                $resolved_parameters[ $index ] = $arguments[ $argument_keys[ $index ] ];
191
-            } elseif (// parameter is type hinted as a class, and should be injected
192
-            ! empty($param_class)
193
-            ) {
194
-                // attempt to inject the dependency
195
-                $resolved_parameters[ $index ] = $this->injectDependency($reflector, $param_class);
196
-            } elseif ($param->isOptional()) {
197
-                $resolved_parameters[ $index ] = $param->getDefaultValue();
198
-            } else {
199
-                $resolved_parameters[ $index ] = null;
200
-            }
201
-        }
202
-        return $resolved_parameters;
203
-    }
204
-
205
-
206
-    /**
207
-     * @param ReflectionClass $reflector
208
-     * @param string          $param_class
209
-     * @return mixed
210
-     * @throws UnexpectedValueException
211
-     */
212
-    private function injectDependency(ReflectionClass $reflector, $param_class)
213
-    {
214
-        $dependency = $this->coffee_pot->brew($param_class);
215
-        if (! $dependency instanceof $param_class) {
216
-            throw new UnexpectedValueException(
217
-                sprintf(
218
-                    esc_html__(
219
-                        'Could not resolve dependency for "%1$s" for the "%2$s" class constructor.',
220
-                        'event_espresso'
221
-                    ),
222
-                    $param_class,
223
-                    $reflector->getName()
224
-                )
225
-            );
226
-        }
227
-        return $dependency;
228
-    }
24
+	/**
25
+	 * @var CoffeePotInterface $coffee_pot
26
+	 */
27
+	private $coffee_pot;
28
+
29
+	/**
30
+	 * @var EEH_Array $array_helper
31
+	 */
32
+	private $array_helper;
33
+
34
+	/**
35
+	 * @var ReflectionClass[] $reflectors
36
+	 */
37
+	private $reflectors;
38
+
39
+	/**
40
+	 * @var ReflectionMethod[] $constructors
41
+	 */
42
+	private $constructors;
43
+
44
+	/**
45
+	 * @var ReflectionParameter[] $parameters
46
+	 */
47
+	private $parameters;
48
+
49
+
50
+	/**
51
+	 * DependencyInjector constructor
52
+	 *
53
+	 * @param CoffeePotInterface $coffee_pot
54
+	 * @param EEH_Array          $array_helper
55
+	 */
56
+	public function __construct(CoffeePotInterface $coffee_pot, EEH_Array $array_helper)
57
+	{
58
+		$this->coffee_pot = $coffee_pot;
59
+		$this->array_helper = $array_helper;
60
+	}
61
+
62
+
63
+	/**
64
+	 * getReflectionClass
65
+	 * checks if a ReflectionClass object has already been generated for a class
66
+	 * and returns that instead of creating a new one
67
+	 *
68
+	 * @param string $class_name
69
+	 * @return ReflectionClass
70
+	 */
71
+	public function getReflectionClass($class_name)
72
+	{
73
+		if (! isset($this->reflectors[ $class_name ])
74
+			|| ! $this->reflectors[ $class_name ] instanceof ReflectionClass
75
+		) {
76
+			$this->reflectors[ $class_name ] = new ReflectionClass($class_name);
77
+		}
78
+		return $this->reflectors[ $class_name ];
79
+	}
80
+
81
+
82
+	/**
83
+	 * getConstructor
84
+	 * checks if a ReflectionMethod object has already been generated for the class constructor
85
+	 * and returns that instead of creating a new one
86
+	 *
87
+	 * @param ReflectionClass $reflector
88
+	 * @return ReflectionMethod
89
+	 */
90
+	protected function getConstructor(ReflectionClass $reflector)
91
+	{
92
+		if (! isset($this->constructors[ $reflector->getName() ])
93
+			|| ! $this->constructors[ $reflector->getName() ] instanceof ReflectionMethod
94
+		) {
95
+			$this->constructors[ $reflector->getName() ] = $reflector->getConstructor();
96
+		}
97
+		return $this->constructors[ $reflector->getName() ];
98
+	}
99
+
100
+
101
+	/**
102
+	 * getParameters
103
+	 * checks if an array of ReflectionParameter objects has already been generated for the class constructor
104
+	 * and returns that instead of creating a new one
105
+	 *
106
+	 * @param ReflectionMethod $constructor
107
+	 * @return ReflectionParameter[]
108
+	 */
109
+	protected function getParameters(ReflectionMethod $constructor)
110
+	{
111
+		if (! isset($this->parameters[ $constructor->class ])) {
112
+			$this->parameters[ $constructor->class ] = $constructor->getParameters();
113
+		}
114
+		return $this->parameters[ $constructor->class ];
115
+	}
116
+
117
+
118
+	/**
119
+	 * resolveDependencies
120
+	 * examines the constructor for the requested class to determine
121
+	 * if any dependencies exist, and if they can be injected.
122
+	 * If so, then those classes will be added to the array of arguments passed to the constructor
123
+	 * PLZ NOTE: this is achieved by type hinting the constructor params
124
+	 * For example:
125
+	 *        if attempting to load a class "Foo" with the following constructor:
126
+	 *        __construct( Bar $bar_class, Fighter $grohl_class )
127
+	 *        then $bar_class and $grohl_class will be added to the $arguments array,
128
+	 *        but only IF they are NOT already present in the incoming arguments array,
129
+	 *        and the correct classes can be loaded
130
+	 *
131
+	 * @param RecipeInterface $recipe
132
+	 * @param ReflectionClass $reflector
133
+	 * @param array           $arguments
134
+	 * @return array
135
+	 * @throws UnexpectedValueException
136
+	 */
137
+	public function resolveDependencies(RecipeInterface $recipe, ReflectionClass $reflector, $arguments = array())
138
+	{
139
+		// if arguments array is numerically and sequentially indexed, then we want it to remain as is,
140
+		// else wrap it in an additional array so that it doesn't get split into multiple parameters
141
+		$arguments = $this->array_helper->is_array_numerically_and_sequentially_indexed($arguments)
142
+			? $arguments
143
+			: array($arguments);
144
+		$resolved_parameters = array();
145
+		// let's examine the constructor
146
+		// let's examine the constructor
147
+		$constructor = $this->getConstructor($reflector);
148
+		// whu? huh? nothing?
149
+		if (! $constructor) {
150
+			return $arguments;
151
+		}
152
+		// get constructor parameters
153
+		$params = $this->getParameters($constructor);
154
+		if (empty($params)) {
155
+			return $resolved_parameters;
156
+		}
157
+		$ingredients = $recipe->ingredients();
158
+		// and the keys for the incoming arguments array so that we can compare existing arguments with what is expected
159
+		$argument_keys = array_keys($arguments);
160
+		// now loop thru all of the constructors expected parameters
161
+		foreach ($params as $index => $param) {
162
+			if (! $param instanceof ReflectionParameter) {
163
+				continue;
164
+			}
165
+			// is this a dependency for a specific class ?
166
+			$param_class = $param->getClass() ? $param->getClass()->name : '';
167
+			$param_name = $param->getName() ? $param->getName() : '';
168
+			if (// param is not a class but is specified in the list of ingredients for this Recipe
169
+				is_string($param_name) && isset($ingredients[ $param_name ])
170
+			) {
171
+				// attempt to inject the dependency
172
+				$resolved_parameters[ $index ] = $ingredients[ $param_name ];
173
+			} elseif (// param is specified in the list of ingredients for this Recipe
174
+			isset($ingredients[ $param_class ])
175
+			) { // attempt to inject the dependency
176
+				$resolved_parameters[ $index ] = $this->injectDependency($reflector, $ingredients[ $param_class ]);
177
+			} elseif (// param is not even a class
178
+				empty($param_class)
179
+				// and something already exists in the incoming arguments for this param
180
+				&& isset($argument_keys[ $index ], $arguments[ $argument_keys[ $index ] ])
181
+			) {
182
+				// add parameter from incoming arguments
183
+				$resolved_parameters[ $index ] = $arguments[ $argument_keys[ $index ] ];
184
+			} elseif (// parameter is type hinted as a class, exists as an incoming argument, AND it's the correct class
185
+				! empty($param_class)
186
+				&& isset($argument_keys[ $index ], $arguments[ $argument_keys[ $index ] ])
187
+				&& $arguments[ $argument_keys[ $index ] ] instanceof $param_class
188
+			) {
189
+				// add parameter from incoming arguments
190
+				$resolved_parameters[ $index ] = $arguments[ $argument_keys[ $index ] ];
191
+			} elseif (// parameter is type hinted as a class, and should be injected
192
+			! empty($param_class)
193
+			) {
194
+				// attempt to inject the dependency
195
+				$resolved_parameters[ $index ] = $this->injectDependency($reflector, $param_class);
196
+			} elseif ($param->isOptional()) {
197
+				$resolved_parameters[ $index ] = $param->getDefaultValue();
198
+			} else {
199
+				$resolved_parameters[ $index ] = null;
200
+			}
201
+		}
202
+		return $resolved_parameters;
203
+	}
204
+
205
+
206
+	/**
207
+	 * @param ReflectionClass $reflector
208
+	 * @param string          $param_class
209
+	 * @return mixed
210
+	 * @throws UnexpectedValueException
211
+	 */
212
+	private function injectDependency(ReflectionClass $reflector, $param_class)
213
+	{
214
+		$dependency = $this->coffee_pot->brew($param_class);
215
+		if (! $dependency instanceof $param_class) {
216
+			throw new UnexpectedValueException(
217
+				sprintf(
218
+					esc_html__(
219
+						'Could not resolve dependency for "%1$s" for the "%2$s" class constructor.',
220
+						'event_espresso'
221
+					),
222
+					$param_class,
223
+					$reflector->getName()
224
+				)
225
+			);
226
+		}
227
+		return $dependency;
228
+	}
229 229
 }
Please login to merge, or discard this patch.
Spacing   +26 added lines, -26 removed lines patch added patch discarded remove patch
@@ -70,12 +70,12 @@  discard block
 block discarded – undo
70 70
      */
71 71
     public function getReflectionClass($class_name)
72 72
     {
73
-        if (! isset($this->reflectors[ $class_name ])
74
-            || ! $this->reflectors[ $class_name ] instanceof ReflectionClass
73
+        if ( ! isset($this->reflectors[$class_name])
74
+            || ! $this->reflectors[$class_name] instanceof ReflectionClass
75 75
         ) {
76
-            $this->reflectors[ $class_name ] = new ReflectionClass($class_name);
76
+            $this->reflectors[$class_name] = new ReflectionClass($class_name);
77 77
         }
78
-        return $this->reflectors[ $class_name ];
78
+        return $this->reflectors[$class_name];
79 79
     }
80 80
 
81 81
 
@@ -89,12 +89,12 @@  discard block
 block discarded – undo
89 89
      */
90 90
     protected function getConstructor(ReflectionClass $reflector)
91 91
     {
92
-        if (! isset($this->constructors[ $reflector->getName() ])
93
-            || ! $this->constructors[ $reflector->getName() ] instanceof ReflectionMethod
92
+        if ( ! isset($this->constructors[$reflector->getName()])
93
+            || ! $this->constructors[$reflector->getName()] instanceof ReflectionMethod
94 94
         ) {
95
-            $this->constructors[ $reflector->getName() ] = $reflector->getConstructor();
95
+            $this->constructors[$reflector->getName()] = $reflector->getConstructor();
96 96
         }
97
-        return $this->constructors[ $reflector->getName() ];
97
+        return $this->constructors[$reflector->getName()];
98 98
     }
99 99
 
100 100
 
@@ -108,10 +108,10 @@  discard block
 block discarded – undo
108 108
      */
109 109
     protected function getParameters(ReflectionMethod $constructor)
110 110
     {
111
-        if (! isset($this->parameters[ $constructor->class ])) {
112
-            $this->parameters[ $constructor->class ] = $constructor->getParameters();
111
+        if ( ! isset($this->parameters[$constructor->class])) {
112
+            $this->parameters[$constructor->class] = $constructor->getParameters();
113 113
         }
114
-        return $this->parameters[ $constructor->class ];
114
+        return $this->parameters[$constructor->class];
115 115
     }
116 116
 
117 117
 
@@ -146,7 +146,7 @@  discard block
 block discarded – undo
146 146
         // let's examine the constructor
147 147
         $constructor = $this->getConstructor($reflector);
148 148
         // whu? huh? nothing?
149
-        if (! $constructor) {
149
+        if ( ! $constructor) {
150 150
             return $arguments;
151 151
         }
152 152
         // get constructor parameters
@@ -159,44 +159,44 @@  discard block
 block discarded – undo
159 159
         $argument_keys = array_keys($arguments);
160 160
         // now loop thru all of the constructors expected parameters
161 161
         foreach ($params as $index => $param) {
162
-            if (! $param instanceof ReflectionParameter) {
162
+            if ( ! $param instanceof ReflectionParameter) {
163 163
                 continue;
164 164
             }
165 165
             // is this a dependency for a specific class ?
166 166
             $param_class = $param->getClass() ? $param->getClass()->name : '';
167 167
             $param_name = $param->getName() ? $param->getName() : '';
168 168
             if (// param is not a class but is specified in the list of ingredients for this Recipe
169
-                is_string($param_name) && isset($ingredients[ $param_name ])
169
+                is_string($param_name) && isset($ingredients[$param_name])
170 170
             ) {
171 171
                 // attempt to inject the dependency
172
-                $resolved_parameters[ $index ] = $ingredients[ $param_name ];
172
+                $resolved_parameters[$index] = $ingredients[$param_name];
173 173
             } elseif (// param is specified in the list of ingredients for this Recipe
174
-            isset($ingredients[ $param_class ])
174
+            isset($ingredients[$param_class])
175 175
             ) { // attempt to inject the dependency
176
-                $resolved_parameters[ $index ] = $this->injectDependency($reflector, $ingredients[ $param_class ]);
176
+                $resolved_parameters[$index] = $this->injectDependency($reflector, $ingredients[$param_class]);
177 177
             } elseif (// param is not even a class
178 178
                 empty($param_class)
179 179
                 // and something already exists in the incoming arguments for this param
180
-                && isset($argument_keys[ $index ], $arguments[ $argument_keys[ $index ] ])
180
+                && isset($argument_keys[$index], $arguments[$argument_keys[$index]])
181 181
             ) {
182 182
                 // add parameter from incoming arguments
183
-                $resolved_parameters[ $index ] = $arguments[ $argument_keys[ $index ] ];
183
+                $resolved_parameters[$index] = $arguments[$argument_keys[$index]];
184 184
             } elseif (// parameter is type hinted as a class, exists as an incoming argument, AND it's the correct class
185 185
                 ! empty($param_class)
186
-                && isset($argument_keys[ $index ], $arguments[ $argument_keys[ $index ] ])
187
-                && $arguments[ $argument_keys[ $index ] ] instanceof $param_class
186
+                && isset($argument_keys[$index], $arguments[$argument_keys[$index]])
187
+                && $arguments[$argument_keys[$index]] instanceof $param_class
188 188
             ) {
189 189
                 // add parameter from incoming arguments
190
-                $resolved_parameters[ $index ] = $arguments[ $argument_keys[ $index ] ];
190
+                $resolved_parameters[$index] = $arguments[$argument_keys[$index]];
191 191
             } elseif (// parameter is type hinted as a class, and should be injected
192 192
             ! empty($param_class)
193 193
             ) {
194 194
                 // attempt to inject the dependency
195
-                $resolved_parameters[ $index ] = $this->injectDependency($reflector, $param_class);
195
+                $resolved_parameters[$index] = $this->injectDependency($reflector, $param_class);
196 196
             } elseif ($param->isOptional()) {
197
-                $resolved_parameters[ $index ] = $param->getDefaultValue();
197
+                $resolved_parameters[$index] = $param->getDefaultValue();
198 198
             } else {
199
-                $resolved_parameters[ $index ] = null;
199
+                $resolved_parameters[$index] = null;
200 200
             }
201 201
         }
202 202
         return $resolved_parameters;
@@ -212,7 +212,7 @@  discard block
 block discarded – undo
212 212
     private function injectDependency(ReflectionClass $reflector, $param_class)
213 213
     {
214 214
         $dependency = $this->coffee_pot->brew($param_class);
215
-        if (! $dependency instanceof $param_class) {
215
+        if ( ! $dependency instanceof $param_class) {
216 216
             throw new UnexpectedValueException(
217 217
                 sprintf(
218 218
                     esc_html__(
Please login to merge, or discard this patch.
core/services/container/RegistryContainer.php 2 patches
Indentation   +126 added lines, -126 removed lines patch added patch discarded remove patch
@@ -17,130 +17,130 @@
 block discarded – undo
17 17
 class RegistryContainer implements ArrayAccess, CountableTraversableAggregate
18 18
 {
19 19
 
20
-    /**
21
-     * @var array $container
22
-     */
23
-    private $container;
24
-
25
-    /**
26
-     * RegistryContainer constructor.
27
-     * Container data can be seeded by passing parameters to constructor.
28
-     * Each parameter will become its own element in the container
29
-     */
30
-    public function __construct()
31
-    {
32
-        $this->container = func_get_args();
33
-        if (func_num_args() === 0) {
34
-            $this->container = array();
35
-        }
36
-    }
37
-
38
-
39
-    /**
40
-     * @param mixed $offset
41
-     * @param mixed $value
42
-     */
43
-    public function offsetSet($offset, $value)
44
-    {
45
-        $this->container[ $offset ] = $value;
46
-    }
47
-
48
-
49
-    /**
50
-     * @param mixed $offset
51
-     * @return bool
52
-     */
53
-    public function offsetExists($offset)
54
-    {
55
-        return isset($this->container[ $offset ]);
56
-    }
57
-
58
-
59
-    /**
60
-     * @param mixed $offset
61
-     */
62
-    public function offsetUnset($offset)
63
-    {
64
-        unset($this->container[ $offset ]);
65
-    }
66
-
67
-
68
-    /**
69
-     * @param mixed $offset
70
-     * @return mixed|null
71
-     */
72
-    public function offsetGet($offset)
73
-    {
74
-        return isset($this->container[ $offset ]) ? $this->container[ $offset ] : null;
75
-    }
76
-
77
-
78
-    /**
79
-     * @return int
80
-     */
81
-    public function count()
82
-    {
83
-        return count($this->container);
84
-    }
85
-
86
-
87
-    /**
88
-     * @return ArrayIterator
89
-     */
90
-    public function getIterator()
91
-    {
92
-        return new ArrayIterator($this->container);
93
-    }
94
-
95
-
96
-    /**
97
-     * @param $offset
98
-     * @param $value
99
-     */
100
-    public function __set($offset, $value)
101
-    {
102
-        $this->container[ $offset ] = $value;
103
-    }
104
-
105
-
106
-    /**
107
-     * @param $offset
108
-     * @return mixed
109
-     * @throws OutOfBoundsException
110
-     */
111
-    public function __get($offset)
112
-    {
113
-        if (array_key_exists($offset, $this->container)) {
114
-            return $this->container[ $offset ];
115
-        }
116
-        $trace = debug_backtrace();
117
-        throw new OutOfBoundsException(
118
-            sprintf(
119
-                esc_html__('Invalid offset: %1$s %2$sCalled from %3$s on line %4$d', 'event_espresso'),
120
-                $offset,
121
-                '<br  />',
122
-                $trace[0]['file'],
123
-                $trace[0]['line']
124
-            )
125
-        );
126
-    }
127
-
128
-
129
-    /**
130
-     * @param $offset
131
-     * @return bool
132
-     */
133
-    public function __isset($offset)
134
-    {
135
-        return isset($this->container[ $offset ]);
136
-    }
137
-
138
-
139
-    /**
140
-     * @param $offset
141
-     */
142
-    public function __unset($offset)
143
-    {
144
-        unset($this->container[ $offset ]);
145
-    }
20
+	/**
21
+	 * @var array $container
22
+	 */
23
+	private $container;
24
+
25
+	/**
26
+	 * RegistryContainer constructor.
27
+	 * Container data can be seeded by passing parameters to constructor.
28
+	 * Each parameter will become its own element in the container
29
+	 */
30
+	public function __construct()
31
+	{
32
+		$this->container = func_get_args();
33
+		if (func_num_args() === 0) {
34
+			$this->container = array();
35
+		}
36
+	}
37
+
38
+
39
+	/**
40
+	 * @param mixed $offset
41
+	 * @param mixed $value
42
+	 */
43
+	public function offsetSet($offset, $value)
44
+	{
45
+		$this->container[ $offset ] = $value;
46
+	}
47
+
48
+
49
+	/**
50
+	 * @param mixed $offset
51
+	 * @return bool
52
+	 */
53
+	public function offsetExists($offset)
54
+	{
55
+		return isset($this->container[ $offset ]);
56
+	}
57
+
58
+
59
+	/**
60
+	 * @param mixed $offset
61
+	 */
62
+	public function offsetUnset($offset)
63
+	{
64
+		unset($this->container[ $offset ]);
65
+	}
66
+
67
+
68
+	/**
69
+	 * @param mixed $offset
70
+	 * @return mixed|null
71
+	 */
72
+	public function offsetGet($offset)
73
+	{
74
+		return isset($this->container[ $offset ]) ? $this->container[ $offset ] : null;
75
+	}
76
+
77
+
78
+	/**
79
+	 * @return int
80
+	 */
81
+	public function count()
82
+	{
83
+		return count($this->container);
84
+	}
85
+
86
+
87
+	/**
88
+	 * @return ArrayIterator
89
+	 */
90
+	public function getIterator()
91
+	{
92
+		return new ArrayIterator($this->container);
93
+	}
94
+
95
+
96
+	/**
97
+	 * @param $offset
98
+	 * @param $value
99
+	 */
100
+	public function __set($offset, $value)
101
+	{
102
+		$this->container[ $offset ] = $value;
103
+	}
104
+
105
+
106
+	/**
107
+	 * @param $offset
108
+	 * @return mixed
109
+	 * @throws OutOfBoundsException
110
+	 */
111
+	public function __get($offset)
112
+	{
113
+		if (array_key_exists($offset, $this->container)) {
114
+			return $this->container[ $offset ];
115
+		}
116
+		$trace = debug_backtrace();
117
+		throw new OutOfBoundsException(
118
+			sprintf(
119
+				esc_html__('Invalid offset: %1$s %2$sCalled from %3$s on line %4$d', 'event_espresso'),
120
+				$offset,
121
+				'<br  />',
122
+				$trace[0]['file'],
123
+				$trace[0]['line']
124
+			)
125
+		);
126
+	}
127
+
128
+
129
+	/**
130
+	 * @param $offset
131
+	 * @return bool
132
+	 */
133
+	public function __isset($offset)
134
+	{
135
+		return isset($this->container[ $offset ]);
136
+	}
137
+
138
+
139
+	/**
140
+	 * @param $offset
141
+	 */
142
+	public function __unset($offset)
143
+	{
144
+		unset($this->container[ $offset ]);
145
+	}
146 146
 }
Please login to merge, or discard this patch.
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -42,7 +42,7 @@  discard block
 block discarded – undo
42 42
      */
43 43
     public function offsetSet($offset, $value)
44 44
     {
45
-        $this->container[ $offset ] = $value;
45
+        $this->container[$offset] = $value;
46 46
     }
47 47
 
48 48
 
@@ -52,7 +52,7 @@  discard block
 block discarded – undo
52 52
      */
53 53
     public function offsetExists($offset)
54 54
     {
55
-        return isset($this->container[ $offset ]);
55
+        return isset($this->container[$offset]);
56 56
     }
57 57
 
58 58
 
@@ -61,7 +61,7 @@  discard block
 block discarded – undo
61 61
      */
62 62
     public function offsetUnset($offset)
63 63
     {
64
-        unset($this->container[ $offset ]);
64
+        unset($this->container[$offset]);
65 65
     }
66 66
 
67 67
 
@@ -71,7 +71,7 @@  discard block
 block discarded – undo
71 71
      */
72 72
     public function offsetGet($offset)
73 73
     {
74
-        return isset($this->container[ $offset ]) ? $this->container[ $offset ] : null;
74
+        return isset($this->container[$offset]) ? $this->container[$offset] : null;
75 75
     }
76 76
 
77 77
 
@@ -99,7 +99,7 @@  discard block
 block discarded – undo
99 99
      */
100 100
     public function __set($offset, $value)
101 101
     {
102
-        $this->container[ $offset ] = $value;
102
+        $this->container[$offset] = $value;
103 103
     }
104 104
 
105 105
 
@@ -111,7 +111,7 @@  discard block
 block discarded – undo
111 111
     public function __get($offset)
112 112
     {
113 113
         if (array_key_exists($offset, $this->container)) {
114
-            return $this->container[ $offset ];
114
+            return $this->container[$offset];
115 115
         }
116 116
         $trace = debug_backtrace();
117 117
         throw new OutOfBoundsException(
@@ -132,7 +132,7 @@  discard block
 block discarded – undo
132 132
      */
133 133
     public function __isset($offset)
134 134
     {
135
-        return isset($this->container[ $offset ]);
135
+        return isset($this->container[$offset]);
136 136
     }
137 137
 
138 138
 
@@ -141,6 +141,6 @@  discard block
 block discarded – undo
141 141
      */
142 142
     public function __unset($offset)
143 143
     {
144
-        unset($this->container[ $offset ]);
144
+        unset($this->container[$offset]);
145 145
     }
146 146
 }
Please login to merge, or discard this patch.
core/services/container/Recipe.php 2 patches
Indentation   +306 added lines, -306 removed lines patch added patch discarded remove patch
@@ -19,310 +19,310 @@
 block discarded – undo
19 19
 class Recipe implements RecipeInterface
20 20
 {
21 21
 
22
-    /**
23
-     * A default Recipe to use if none is specified for a class
24
-     */
25
-    const DEFAULT_ID = '*';
26
-
27
-    /**
28
-     * Identifier for the entity class to be constructed.
29
-     * Typically a Fully Qualified Class Name
30
-     *
31
-     * @var string $identifier
32
-     */
33
-    private $identifier;
34
-
35
-    /**
36
-     * Fully Qualified Class Name
37
-     *
38
-     * @var string $fqcn
39
-     */
40
-    private $fqcn;
41
-
42
-    /**
43
-     * a dependency class map array
44
-     * If a Recipe is for a single class (or group of classes that shares the EXACT SAME constructor arguments),
45
-     * and that class type hints for an interface, then this property allows you to configure what dependencies
46
-     * get used when instantiating the class.
47
-     * For example:
48
-     *  There's a class called Coffee, and one of its constructor arguments is BeanInterface
49
-     *  There are two implementations of BeanInterface: HonduranBean, and KenyanBean
50
-     *  We want one Coffee object to use HonduranBean for its BeanInterface,
51
-     *  and the 2nd Coffee object to use KenyanBean for its BeanInterface.
52
-     *  To do this, we need to create two Recipes:
53
-     *      one with an identifier of 'HonduranCoffee' using the following ingredients :
54
-     *          array('BeanInterface' => 'HonduranBean')
55
-     *      and the other with an identifier of 'KenyanCoffee' using the following ingredients :
56
-     *          array('BeanInterface' => 'KenyanBean')
57
-     *  Then, whenever the CoffeeShop brews an instance of HonduranCoffee,
58
-     *  an instance of HonduranBean will get injected for the BeanInterface dependency,
59
-     *  and whenever the CoffeeShop brews an instance of KenyanCoffee,
60
-     *  an instance of KenyanBean will get injected for the BeanInterface dependency
61
-     *
62
-     * @var array $ingredients
63
-     */
64
-    private $ingredients = array();
65
-
66
-    /**
67
-     * one of the class constants from CoffeeShop:
68
-     *  CoffeeMaker::BREW_NEW - creates a new instance
69
-     *  CoffeeMaker::BREW_SHARED - creates a shared instance
70
-     *  CoffeeMaker::BREW_LOAD_ONLY - loads but does not instantiate
71
-     *
72
-     * @var string $type
73
-     */
74
-    private $type;
75
-
76
-    /**
77
-     * class name aliases - typically a Fully Qualified Interface that the class implements
78
-     * identifiers passed to the CoffeeShop will be run through the filters to find the correct class name
79
-     *
80
-     * @var array $filters
81
-     */
82
-    private $filters = array();
83
-
84
-    /**
85
-     * array of full server filepaths to files that may contain the class
86
-     *
87
-     * @var array $paths
88
-     */
89
-    private $paths = array();
90
-
91
-
92
-    /**
93
-     * Recipe constructor.
94
-     *
95
-     * @param string $identifier    class identifier, can be an alias, or FQCN, or whatever
96
-     * @param string $fqcn          \Fully\Qualified\ClassName, optional if $identifier is FQCN
97
-     * @param array  $ingredients   array of dependencies that can not be resolved automatically,
98
-     *                              used for resolving concrete classes for type hinted interfaces
99
-     *                              for the dependencies of THIS class
100
-     * @param string $type          recipe type: one of the class constants on
101
-     *                              \EventEspresso\core\services\container\CoffeeMaker
102
-     * @param array  $filters       array of class aliases, or class interfaces
103
-     *                              this works somewhat opposite to the $ingredients array above,
104
-     *                              in that this array specifies interfaces or aliases
105
-     *                              that this Recipe can be used for when resolving OTHER class's dependencies
106
-     * @param array  $paths         if class can not be loaded via PSR-4 autoloading,
107
-     *                              then supply a filepath, or array of filepaths, so that it can be included
108
-     * @throws InvalidIdentifierException
109
-     * @throws RuntimeException
110
-     * @throws InvalidInterfaceException
111
-     * @throws InvalidClassException
112
-     * @throws InvalidDataTypeException
113
-     */
114
-    public function __construct(
115
-        $identifier,
116
-        $fqcn = '',
117
-        array $filters = array(),
118
-        array $ingredients = array(),
119
-        $type = CoffeeMaker::BREW_NEW,
120
-        array $paths = array()
121
-    ) {
122
-        $this->setIdentifier($identifier);
123
-        $this->setFilters($filters);
124
-        $this->setIngredients($ingredients);
125
-        $this->setType($type);
126
-        $this->setPaths($paths);
127
-        $this->setFqcn($fqcn);
128
-    }
129
-
130
-
131
-    /**
132
-     * @return string
133
-     */
134
-    public function identifier()
135
-    {
136
-        return $this->identifier;
137
-    }
138
-
139
-
140
-    /**
141
-     * @return string
142
-     */
143
-    public function fqcn()
144
-    {
145
-        return $this->fqcn;
146
-    }
147
-
148
-
149
-    /**
150
-     * @return array
151
-     */
152
-    public function filters()
153
-    {
154
-        return $this->filters;
155
-    }
156
-
157
-
158
-    /**
159
-     * @return array
160
-     */
161
-    public function ingredients()
162
-    {
163
-        return $this->ingredients;
164
-    }
165
-
166
-
167
-    /**
168
-     * @return string
169
-     */
170
-    public function type()
171
-    {
172
-        return $this->type;
173
-    }
174
-
175
-
176
-    /**
177
-     * @return array
178
-     */
179
-    public function paths()
180
-    {
181
-        return $this->paths;
182
-    }
183
-
184
-
185
-    /**
186
-     * @param  string $identifier Identifier for the entity class that the Recipe applies to
187
-     *                            Typically a Fully Qualified Class Name
188
-     * @throws InvalidIdentifierException
189
-     */
190
-    public function setIdentifier($identifier)
191
-    {
192
-        if (! is_string($identifier) || empty($identifier)) {
193
-            throw new InvalidIdentifierException(
194
-                is_object($identifier) ? get_class($identifier) : gettype($identifier),
195
-                __('class identifier (typically a \Fully\Qualified\ClassName)', 'event_espresso')
196
-            );
197
-        }
198
-        $this->identifier = $identifier;
199
-    }
200
-
201
-
202
-    /**
203
-     * Ensures incoming string is a valid Fully Qualified Class Name,
204
-     * except if this is the default wildcard Recipe ( * ),
205
-     * or it's NOT an actual FQCN because the Recipe is using filepaths
206
-     * for classes that are not PSR-4 compatible
207
-     * PLZ NOTE:
208
-     *  Recipe::setFqcn() has a check to see if Recipe::$paths is empty or not,
209
-     *  therefore you should always call Recipe::setPaths() before Recipe::setFqcn()
210
-     *
211
-     * @param string $fqcn
212
-     * @throws InvalidDataTypeException
213
-     * @throws InvalidClassException
214
-     * @throws InvalidInterfaceException
215
-     */
216
-    public function setFqcn($fqcn)
217
-    {
218
-        $fqcn = ! empty($fqcn) ? $fqcn : $this->identifier;
219
-        if (! is_string($fqcn)) {
220
-            throw new InvalidDataTypeException(
221
-                '$fqcn',
222
-                is_object($fqcn) ? get_class($fqcn) : gettype($fqcn),
223
-                __('string (Fully\Qualified\ClassName)', 'event_espresso')
224
-            );
225
-        }
226
-        $fqcn = ltrim($fqcn, '\\');
227
-        if ($fqcn !== Recipe::DEFAULT_ID
228
-            && ! empty($fqcn)
229
-            && empty($this->paths)
230
-            && ! (class_exists($fqcn) || interface_exists($fqcn))
231
-        ) {
232
-            throw new InvalidClassException($fqcn);
233
-        }
234
-        $this->fqcn = $fqcn;
235
-    }
236
-
237
-
238
-    /**
239
-     * @param array $ingredients    an array of dependencies where keys are the aliases and values are the FQCNs
240
-     *                              example:
241
-     *                              array( 'ClassInterface' => 'Fully\Qualified\ClassName' )
242
-     * @throws InvalidDataTypeException
243
-     */
244
-    public function setIngredients(array $ingredients)
245
-    {
246
-        if (empty($ingredients)) {
247
-            return;
248
-        }
249
-        if (! is_array($ingredients)) {
250
-            throw new InvalidDataTypeException(
251
-                '$ingredients',
252
-                is_object($ingredients) ? get_class($ingredients) : gettype($ingredients),
253
-                __('array of class dependencies', 'event_espresso')
254
-            );
255
-        }
256
-        $this->ingredients = array_merge($this->ingredients, $ingredients);
257
-    }
258
-
259
-
260
-    /**
261
-     * @param string $type one of the class constants returned from CoffeeMaker::getTypes()
262
-     * @throws InvalidIdentifierException
263
-     */
264
-    public function setType($type = CoffeeMaker::BREW_NEW)
265
-    {
266
-        $this->type = CoffeeMaker::validateType($type);
267
-    }
268
-
269
-
270
-    /**
271
-     * @param array $filters    an array of filters where keys are the aliases and values are the FQCNs
272
-     *                          example:
273
-     *                          array( 'ClassInterface' => 'Fully\Qualified\ClassName' )
274
-     * @throws InvalidDataTypeException
275
-     */
276
-    public function setFilters(array $filters)
277
-    {
278
-        if (empty($filters)) {
279
-            return;
280
-        }
281
-        if (! is_array($filters)) {
282
-            throw new InvalidDataTypeException(
283
-                '$filters',
284
-                is_object($filters) ? get_class($filters) : gettype($filters),
285
-                __('array of class aliases', 'event_espresso')
286
-            );
287
-        }
288
-        $this->filters = array_merge($this->filters, $filters);
289
-    }
290
-
291
-
292
-    /**
293
-     * Ensures incoming paths is a valid filepath, or array of valid filepaths,
294
-     * and merges them in with any existing filepaths
295
-     * PLZ NOTE:
296
-     *  Recipe::setFqcn() has a check to see if Recipe::$paths is empty or not,
297
-     *  therefore you should always call Recipe::setPaths() before Recipe::setFqcn()
298
-     *
299
-     * @param string|array $paths
300
-     * @throws RuntimeException
301
-     * @throws InvalidDataTypeException
302
-     */
303
-    public function setPaths($paths = array())
304
-    {
305
-        if (empty($paths)) {
306
-            return;
307
-        }
308
-        if (! (is_string($paths) || is_array($paths))) {
309
-            throw new InvalidDataTypeException(
310
-                '$path',
311
-                is_object($paths) ? get_class($paths) : gettype($paths),
312
-                __('string or array of strings (full server filepath(s))', 'event_espresso')
313
-            );
314
-        }
315
-        $paths = (array) $paths;
316
-        foreach ($paths as $path) {
317
-            if (strpos($path, '*') === false && ! is_readable($path)) {
318
-                throw new RuntimeException(
319
-                    sprintf(
320
-                        __('The following filepath is not readable: "%1$s"', 'event_espresso'),
321
-                        $path
322
-                    )
323
-                );
324
-            }
325
-        }
326
-        $this->paths = array_merge($this->paths, $paths);
327
-    }
22
+	/**
23
+	 * A default Recipe to use if none is specified for a class
24
+	 */
25
+	const DEFAULT_ID = '*';
26
+
27
+	/**
28
+	 * Identifier for the entity class to be constructed.
29
+	 * Typically a Fully Qualified Class Name
30
+	 *
31
+	 * @var string $identifier
32
+	 */
33
+	private $identifier;
34
+
35
+	/**
36
+	 * Fully Qualified Class Name
37
+	 *
38
+	 * @var string $fqcn
39
+	 */
40
+	private $fqcn;
41
+
42
+	/**
43
+	 * a dependency class map array
44
+	 * If a Recipe is for a single class (or group of classes that shares the EXACT SAME constructor arguments),
45
+	 * and that class type hints for an interface, then this property allows you to configure what dependencies
46
+	 * get used when instantiating the class.
47
+	 * For example:
48
+	 *  There's a class called Coffee, and one of its constructor arguments is BeanInterface
49
+	 *  There are two implementations of BeanInterface: HonduranBean, and KenyanBean
50
+	 *  We want one Coffee object to use HonduranBean for its BeanInterface,
51
+	 *  and the 2nd Coffee object to use KenyanBean for its BeanInterface.
52
+	 *  To do this, we need to create two Recipes:
53
+	 *      one with an identifier of 'HonduranCoffee' using the following ingredients :
54
+	 *          array('BeanInterface' => 'HonduranBean')
55
+	 *      and the other with an identifier of 'KenyanCoffee' using the following ingredients :
56
+	 *          array('BeanInterface' => 'KenyanBean')
57
+	 *  Then, whenever the CoffeeShop brews an instance of HonduranCoffee,
58
+	 *  an instance of HonduranBean will get injected for the BeanInterface dependency,
59
+	 *  and whenever the CoffeeShop brews an instance of KenyanCoffee,
60
+	 *  an instance of KenyanBean will get injected for the BeanInterface dependency
61
+	 *
62
+	 * @var array $ingredients
63
+	 */
64
+	private $ingredients = array();
65
+
66
+	/**
67
+	 * one of the class constants from CoffeeShop:
68
+	 *  CoffeeMaker::BREW_NEW - creates a new instance
69
+	 *  CoffeeMaker::BREW_SHARED - creates a shared instance
70
+	 *  CoffeeMaker::BREW_LOAD_ONLY - loads but does not instantiate
71
+	 *
72
+	 * @var string $type
73
+	 */
74
+	private $type;
75
+
76
+	/**
77
+	 * class name aliases - typically a Fully Qualified Interface that the class implements
78
+	 * identifiers passed to the CoffeeShop will be run through the filters to find the correct class name
79
+	 *
80
+	 * @var array $filters
81
+	 */
82
+	private $filters = array();
83
+
84
+	/**
85
+	 * array of full server filepaths to files that may contain the class
86
+	 *
87
+	 * @var array $paths
88
+	 */
89
+	private $paths = array();
90
+
91
+
92
+	/**
93
+	 * Recipe constructor.
94
+	 *
95
+	 * @param string $identifier    class identifier, can be an alias, or FQCN, or whatever
96
+	 * @param string $fqcn          \Fully\Qualified\ClassName, optional if $identifier is FQCN
97
+	 * @param array  $ingredients   array of dependencies that can not be resolved automatically,
98
+	 *                              used for resolving concrete classes for type hinted interfaces
99
+	 *                              for the dependencies of THIS class
100
+	 * @param string $type          recipe type: one of the class constants on
101
+	 *                              \EventEspresso\core\services\container\CoffeeMaker
102
+	 * @param array  $filters       array of class aliases, or class interfaces
103
+	 *                              this works somewhat opposite to the $ingredients array above,
104
+	 *                              in that this array specifies interfaces or aliases
105
+	 *                              that this Recipe can be used for when resolving OTHER class's dependencies
106
+	 * @param array  $paths         if class can not be loaded via PSR-4 autoloading,
107
+	 *                              then supply a filepath, or array of filepaths, so that it can be included
108
+	 * @throws InvalidIdentifierException
109
+	 * @throws RuntimeException
110
+	 * @throws InvalidInterfaceException
111
+	 * @throws InvalidClassException
112
+	 * @throws InvalidDataTypeException
113
+	 */
114
+	public function __construct(
115
+		$identifier,
116
+		$fqcn = '',
117
+		array $filters = array(),
118
+		array $ingredients = array(),
119
+		$type = CoffeeMaker::BREW_NEW,
120
+		array $paths = array()
121
+	) {
122
+		$this->setIdentifier($identifier);
123
+		$this->setFilters($filters);
124
+		$this->setIngredients($ingredients);
125
+		$this->setType($type);
126
+		$this->setPaths($paths);
127
+		$this->setFqcn($fqcn);
128
+	}
129
+
130
+
131
+	/**
132
+	 * @return string
133
+	 */
134
+	public function identifier()
135
+	{
136
+		return $this->identifier;
137
+	}
138
+
139
+
140
+	/**
141
+	 * @return string
142
+	 */
143
+	public function fqcn()
144
+	{
145
+		return $this->fqcn;
146
+	}
147
+
148
+
149
+	/**
150
+	 * @return array
151
+	 */
152
+	public function filters()
153
+	{
154
+		return $this->filters;
155
+	}
156
+
157
+
158
+	/**
159
+	 * @return array
160
+	 */
161
+	public function ingredients()
162
+	{
163
+		return $this->ingredients;
164
+	}
165
+
166
+
167
+	/**
168
+	 * @return string
169
+	 */
170
+	public function type()
171
+	{
172
+		return $this->type;
173
+	}
174
+
175
+
176
+	/**
177
+	 * @return array
178
+	 */
179
+	public function paths()
180
+	{
181
+		return $this->paths;
182
+	}
183
+
184
+
185
+	/**
186
+	 * @param  string $identifier Identifier for the entity class that the Recipe applies to
187
+	 *                            Typically a Fully Qualified Class Name
188
+	 * @throws InvalidIdentifierException
189
+	 */
190
+	public function setIdentifier($identifier)
191
+	{
192
+		if (! is_string($identifier) || empty($identifier)) {
193
+			throw new InvalidIdentifierException(
194
+				is_object($identifier) ? get_class($identifier) : gettype($identifier),
195
+				__('class identifier (typically a \Fully\Qualified\ClassName)', 'event_espresso')
196
+			);
197
+		}
198
+		$this->identifier = $identifier;
199
+	}
200
+
201
+
202
+	/**
203
+	 * Ensures incoming string is a valid Fully Qualified Class Name,
204
+	 * except if this is the default wildcard Recipe ( * ),
205
+	 * or it's NOT an actual FQCN because the Recipe is using filepaths
206
+	 * for classes that are not PSR-4 compatible
207
+	 * PLZ NOTE:
208
+	 *  Recipe::setFqcn() has a check to see if Recipe::$paths is empty or not,
209
+	 *  therefore you should always call Recipe::setPaths() before Recipe::setFqcn()
210
+	 *
211
+	 * @param string $fqcn
212
+	 * @throws InvalidDataTypeException
213
+	 * @throws InvalidClassException
214
+	 * @throws InvalidInterfaceException
215
+	 */
216
+	public function setFqcn($fqcn)
217
+	{
218
+		$fqcn = ! empty($fqcn) ? $fqcn : $this->identifier;
219
+		if (! is_string($fqcn)) {
220
+			throw new InvalidDataTypeException(
221
+				'$fqcn',
222
+				is_object($fqcn) ? get_class($fqcn) : gettype($fqcn),
223
+				__('string (Fully\Qualified\ClassName)', 'event_espresso')
224
+			);
225
+		}
226
+		$fqcn = ltrim($fqcn, '\\');
227
+		if ($fqcn !== Recipe::DEFAULT_ID
228
+			&& ! empty($fqcn)
229
+			&& empty($this->paths)
230
+			&& ! (class_exists($fqcn) || interface_exists($fqcn))
231
+		) {
232
+			throw new InvalidClassException($fqcn);
233
+		}
234
+		$this->fqcn = $fqcn;
235
+	}
236
+
237
+
238
+	/**
239
+	 * @param array $ingredients    an array of dependencies where keys are the aliases and values are the FQCNs
240
+	 *                              example:
241
+	 *                              array( 'ClassInterface' => 'Fully\Qualified\ClassName' )
242
+	 * @throws InvalidDataTypeException
243
+	 */
244
+	public function setIngredients(array $ingredients)
245
+	{
246
+		if (empty($ingredients)) {
247
+			return;
248
+		}
249
+		if (! is_array($ingredients)) {
250
+			throw new InvalidDataTypeException(
251
+				'$ingredients',
252
+				is_object($ingredients) ? get_class($ingredients) : gettype($ingredients),
253
+				__('array of class dependencies', 'event_espresso')
254
+			);
255
+		}
256
+		$this->ingredients = array_merge($this->ingredients, $ingredients);
257
+	}
258
+
259
+
260
+	/**
261
+	 * @param string $type one of the class constants returned from CoffeeMaker::getTypes()
262
+	 * @throws InvalidIdentifierException
263
+	 */
264
+	public function setType($type = CoffeeMaker::BREW_NEW)
265
+	{
266
+		$this->type = CoffeeMaker::validateType($type);
267
+	}
268
+
269
+
270
+	/**
271
+	 * @param array $filters    an array of filters where keys are the aliases and values are the FQCNs
272
+	 *                          example:
273
+	 *                          array( 'ClassInterface' => 'Fully\Qualified\ClassName' )
274
+	 * @throws InvalidDataTypeException
275
+	 */
276
+	public function setFilters(array $filters)
277
+	{
278
+		if (empty($filters)) {
279
+			return;
280
+		}
281
+		if (! is_array($filters)) {
282
+			throw new InvalidDataTypeException(
283
+				'$filters',
284
+				is_object($filters) ? get_class($filters) : gettype($filters),
285
+				__('array of class aliases', 'event_espresso')
286
+			);
287
+		}
288
+		$this->filters = array_merge($this->filters, $filters);
289
+	}
290
+
291
+
292
+	/**
293
+	 * Ensures incoming paths is a valid filepath, or array of valid filepaths,
294
+	 * and merges them in with any existing filepaths
295
+	 * PLZ NOTE:
296
+	 *  Recipe::setFqcn() has a check to see if Recipe::$paths is empty or not,
297
+	 *  therefore you should always call Recipe::setPaths() before Recipe::setFqcn()
298
+	 *
299
+	 * @param string|array $paths
300
+	 * @throws RuntimeException
301
+	 * @throws InvalidDataTypeException
302
+	 */
303
+	public function setPaths($paths = array())
304
+	{
305
+		if (empty($paths)) {
306
+			return;
307
+		}
308
+		if (! (is_string($paths) || is_array($paths))) {
309
+			throw new InvalidDataTypeException(
310
+				'$path',
311
+				is_object($paths) ? get_class($paths) : gettype($paths),
312
+				__('string or array of strings (full server filepath(s))', 'event_espresso')
313
+			);
314
+		}
315
+		$paths = (array) $paths;
316
+		foreach ($paths as $path) {
317
+			if (strpos($path, '*') === false && ! is_readable($path)) {
318
+				throw new RuntimeException(
319
+					sprintf(
320
+						__('The following filepath is not readable: "%1$s"', 'event_espresso'),
321
+						$path
322
+					)
323
+				);
324
+			}
325
+		}
326
+		$this->paths = array_merge($this->paths, $paths);
327
+	}
328 328
 }
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -189,7 +189,7 @@  discard block
 block discarded – undo
189 189
      */
190 190
     public function setIdentifier($identifier)
191 191
     {
192
-        if (! is_string($identifier) || empty($identifier)) {
192
+        if ( ! is_string($identifier) || empty($identifier)) {
193 193
             throw new InvalidIdentifierException(
194 194
                 is_object($identifier) ? get_class($identifier) : gettype($identifier),
195 195
                 __('class identifier (typically a \Fully\Qualified\ClassName)', 'event_espresso')
@@ -216,7 +216,7 @@  discard block
 block discarded – undo
216 216
     public function setFqcn($fqcn)
217 217
     {
218 218
         $fqcn = ! empty($fqcn) ? $fqcn : $this->identifier;
219
-        if (! is_string($fqcn)) {
219
+        if ( ! is_string($fqcn)) {
220 220
             throw new InvalidDataTypeException(
221 221
                 '$fqcn',
222 222
                 is_object($fqcn) ? get_class($fqcn) : gettype($fqcn),
@@ -246,7 +246,7 @@  discard block
 block discarded – undo
246 246
         if (empty($ingredients)) {
247 247
             return;
248 248
         }
249
-        if (! is_array($ingredients)) {
249
+        if ( ! is_array($ingredients)) {
250 250
             throw new InvalidDataTypeException(
251 251
                 '$ingredients',
252 252
                 is_object($ingredients) ? get_class($ingredients) : gettype($ingredients),
@@ -278,7 +278,7 @@  discard block
 block discarded – undo
278 278
         if (empty($filters)) {
279 279
             return;
280 280
         }
281
-        if (! is_array($filters)) {
281
+        if ( ! is_array($filters)) {
282 282
             throw new InvalidDataTypeException(
283 283
                 '$filters',
284 284
                 is_object($filters) ? get_class($filters) : gettype($filters),
@@ -305,7 +305,7 @@  discard block
 block discarded – undo
305 305
         if (empty($paths)) {
306 306
             return;
307 307
         }
308
-        if (! (is_string($paths) || is_array($paths))) {
308
+        if ( ! (is_string($paths) || is_array($paths))) {
309 309
             throw new InvalidDataTypeException(
310 310
                 '$path',
311 311
                 is_object($paths) ? get_class($paths) : gettype($paths),
Please login to merge, or discard this patch.
core/services/shortcodes/LegacyShortcodesManager.php 2 patches
Indentation   +405 added lines, -405 removed lines patch added patch discarded remove patch
@@ -21,409 +21,409 @@
 block discarded – undo
21 21
 class LegacyShortcodesManager
22 22
 {
23 23
 
24
-    /**
25
-     * @var EE_Registry $registry
26
-     */
27
-    private $registry;
28
-
29
-
30
-    /**
31
-     * LegacyShortcodesManager constructor.
32
-     *
33
-     * @param \EE_Registry $registry
34
-     */
35
-    public function __construct(EE_Registry $registry)
36
-    {
37
-        $this->registry = $registry;
38
-    }
39
-
40
-
41
-    /**
42
-     * @return EE_Registry
43
-     */
44
-    public function registry()
45
-    {
46
-        return $this->registry;
47
-    }
48
-
49
-
50
-    /**
51
-     * registerShortcodes
52
-     *
53
-     * @return void
54
-     */
55
-    public function registerShortcodes()
56
-    {
57
-        $this->registry->shortcodes = $this->getShortcodes();
58
-    }
59
-
60
-
61
-    /**
62
-     * getShortcodes
63
-     *
64
-     * @return array
65
-     */
66
-    public function getShortcodes()
67
-    {
68
-        // previously this method would glob the shortcodes directory
69
-        // then filter that list of shortcodes to register,
70
-        // but now we are going to just supply an empty array.
71
-        // this allows any shortcodes that have not yet been converted to the new system
72
-        // to still get loaded and processed, albeit using the same legacy logic as before
73
-        $shortcodes_to_register = apply_filters(
74
-            'FHEE__EE_Config__register_shortcodes__shortcodes_to_register',
75
-            array()
76
-        );
77
-        if (! empty($shortcodes_to_register)) {
78
-            // cycle thru shortcode folders
79
-            foreach ($shortcodes_to_register as $shortcode_path) {
80
-                // add to list of installed shortcode modules
81
-                $this->registerShortcode($shortcode_path);
82
-            }
83
-        }
84
-        // filter list of installed modules
85
-        return apply_filters(
86
-            'FHEE__EE_Config___register_shortcodes__installed_shortcodes',
87
-            ! empty($this->registry->shortcodes)
88
-                ? $this->registry->shortcodes
89
-                : array()
90
-        );
91
-    }
92
-
93
-
94
-    /**
95
-     *    register_shortcode - makes core aware of this shortcode
96
-     *
97
-     * @access    public
98
-     * @param    string $shortcode_path - full path up to and including shortcode folder
99
-     * @return    bool
100
-     */
101
-    public function registerShortcode($shortcode_path = null)
102
-    {
103
-        do_action('AHEE__EE_Config__register_shortcode__begin', $shortcode_path);
104
-        $shortcode_ext = '.shortcode.php';
105
-        // make all separators match
106
-        $shortcode_path = str_replace(array('\\', '/'), DS, $shortcode_path);
107
-        // does the file path INCLUDE the actual file name as part of the path ?
108
-        if (strpos($shortcode_path, $shortcode_ext) !== false) {
109
-            // grab shortcode file name from directory name and break apart at dots
110
-            $shortcode_file = explode('.', basename($shortcode_path));
111
-            // take first segment from file name pieces and remove class prefix if it exists
112
-            $shortcode = strpos($shortcode_file[0], 'EES_') === 0
113
-                ? substr($shortcode_file[0], 4)
114
-                : $shortcode_file[0];
115
-            // sanitize shortcode directory name
116
-            $shortcode = sanitize_key($shortcode);
117
-            // now we need to rebuild the shortcode path
118
-            $shortcode_path = explode(DS, $shortcode_path);
119
-            // remove last segment
120
-            array_pop($shortcode_path);
121
-            // glue it back together
122
-            $shortcode_path = implode(DS, $shortcode_path) . DS;
123
-        } else {
124
-            // we need to generate the filename based off of the folder name
125
-            // grab and sanitize shortcode directory name
126
-            $shortcode = sanitize_key(basename($shortcode_path));
127
-            $shortcode_path = rtrim($shortcode_path, DS) . DS;
128
-        }
129
-        // create classname from shortcode directory or file name
130
-        $shortcode = str_replace(' ', '_', ucwords(str_replace('_', ' ', $shortcode)));
131
-        // add class prefix
132
-        $shortcode_class = 'EES_' . $shortcode;
133
-        // does the shortcode exist ?
134
-        if (! is_readable($shortcode_path . DS . $shortcode_class . $shortcode_ext)) {
135
-            $msg = sprintf(
136
-                esc_html__(
137
-                    'The requested %1$s shortcode file could not be found or is not readable due to file permissions. It should be in %2$s',
138
-                    'event_espresso'
139
-                ),
140
-                $shortcode_class,
141
-                $shortcode_path . DS . $shortcode_class . $shortcode_ext
142
-            );
143
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
144
-            return false;
145
-        }
146
-        // load the shortcode class file
147
-        require_once($shortcode_path . $shortcode_class . $shortcode_ext);
148
-        // verify that class exists
149
-        if (! class_exists($shortcode_class)) {
150
-            $msg = sprintf(
151
-                esc_html__('The requested %s shortcode class does not exist.', 'event_espresso'),
152
-                $shortcode_class
153
-            );
154
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
155
-            return false;
156
-        }
157
-        $shortcode = strtoupper($shortcode);
158
-        // add to array of registered shortcodes
159
-        $this->registry->shortcodes->{$shortcode} = $shortcode_path . $shortcode_class . $shortcode_ext;
160
-        return true;
161
-    }
162
-
163
-
164
-    /**
165
-     *    _initialize_shortcodes
166
-     *    allow shortcodes to set hooks for the rest of the system
167
-     *
168
-     * @access private
169
-     * @return void
170
-     */
171
-    public function addShortcodes()
172
-    {
173
-        // cycle thru shortcode folders
174
-        foreach ($this->registry->shortcodes as $shortcode => $shortcode_path) {
175
-            // add class prefix
176
-            $shortcode_class = 'EES_' . $shortcode;
177
-            // fire the shortcode class's set_hooks methods in case it needs to hook into other parts of the system
178
-            // which set hooks ?
179
-            if (is_admin()) {
180
-                // fire immediately
181
-                call_user_func(array($shortcode_class, 'set_hooks_admin'));
182
-            } else {
183
-                // delay until other systems are online
184
-                add_action(
185
-                    'AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons',
186
-                    array($shortcode_class, 'set_hooks')
187
-                );
188
-                // convert classname to UPPERCASE and create WP shortcode.
189
-                $shortcode_tag = strtoupper($shortcode);
190
-                // but first check if the shortcode has already
191
-                // been added before assigning 'fallback_shortcode_processor'
192
-                if (! shortcode_exists($shortcode_tag)) {
193
-                    // NOTE: this shortcode declaration will get overridden if the shortcode
194
-                    // is successfully detected in the post content in initializeShortcode()
195
-                    add_shortcode($shortcode_tag, array($shortcode_class, 'fallback_shortcode_processor'));
196
-                }
197
-            }
198
-        }
199
-    }
200
-
201
-
202
-    /**
203
-     * callback for the WP "get_header" hook point
204
-     * checks posts for EE shortcodes, and initializes them,
205
-     * then toggles filter switch that loads core default assets
206
-     *
207
-     * @param \WP_Query $wp_query
208
-     * @return void
209
-     */
210
-    public function initializeShortcodes(WP_Query $wp_query)
211
-    {
212
-        if (empty($this->registry->shortcodes) || ! $wp_query->is_main_query() || is_admin()) {
213
-            return;
214
-        }
215
-        global $wp;
216
-        /** @var EE_Front_controller $Front_Controller */
217
-        $Front_Controller = $this->registry->load_core('Front_Controller', array(), false);
218
-        do_action('AHEE__EE_Front_Controller__initialize_shortcodes__begin', $wp, $Front_Controller);
219
-        $Front_Controller->Request_Handler()->set_request_vars();
220
-        // grab post_name from request
221
-        $current_post = apply_filters(
222
-            'FHEE__EE_Front_Controller__initialize_shortcodes__current_post_name',
223
-            $Front_Controller->Request_Handler()->get('post_name')
224
-        );
225
-        $show_on_front = get_option('show_on_front');
226
-        // if it's not set, then check if frontpage is blog
227
-        if (empty($current_post)) {
228
-            // yup.. this is the posts page, prepare to load all shortcode modules
229
-            $current_post = 'posts';
230
-            // unless..
231
-            if ($show_on_front === 'page') {
232
-                // some other page is set as the homepage
233
-                $page_on_front = get_option('page_on_front');
234
-                if ($page_on_front) {
235
-                    // k now we need to find the post_name for this page
236
-                    global $wpdb;
237
-                    $page_on_front = $wpdb->get_var(
238
-                        $wpdb->prepare(
239
-                            "SELECT post_name from {$wpdb->posts} WHERE post_type='page' AND post_status NOT IN ('auto-draft', 'inherit', 'trash') AND ID=%d",
240
-                            $page_on_front
241
-                        )
242
-                    );
243
-                    // set the current post slug to what it actually is
244
-                    $current_post = $page_on_front ? $page_on_front : $current_post;
245
-                }
246
-            }
247
-        }
248
-        // in case $current_post is hierarchical like: /parent-page/current-page
249
-        $current_post = basename($current_post);
250
-        if (// is current page/post the "blog" page ?
251
-            $current_post === EE_Config::get_page_for_posts()
252
-            // or are we on a category page?
253
-            || (
254
-                is_array(term_exists($current_post, 'category'))
255
-                || array_key_exists('category_name', $wp->query_vars)
256
-            )
257
-        ) {
258
-            // initialize all legacy shortcodes
259
-            $load_assets = $this->parseContentForShortcodes('', true);
260
-        } else {
261
-            global $wpdb;
262
-            $post_content = $wpdb->get_var(
263
-                $wpdb->prepare(
264
-                    "SELECT post_content from {$wpdb->posts} WHERE post_status NOT IN ('auto-draft', 'inherit', 'trash') AND post_name=%s",
265
-                    $current_post
266
-                )
267
-            );
268
-            $load_assets = $this->parseContentForShortcodes($post_content);
269
-        }
270
-        if ($load_assets) {
271
-            $this->registry->REQ->set_espresso_page(true);
272
-            add_filter('FHEE_load_css', '__return_true');
273
-            add_filter('FHEE_load_js', '__return_true');
274
-        }
275
-        do_action('AHEE__EE_Front_Controller__initialize_shortcodes__end', $Front_Controller);
276
-    }
277
-
278
-
279
-    /**
280
-     * checks supplied content against list of legacy shortcodes,
281
-     * then initializes any found shortcodes, and returns true.
282
-     * returns false if no shortcodes found.
283
-     *
284
-     * @param string $content
285
-     * @param bool   $load_all if true, then ALL active legacy shortcodes will be initialized
286
-     * @return bool
287
-     */
288
-    public function parseContentForShortcodes($content = '', $load_all = false)
289
-    {
290
-        $has_shortcode = false;
291
-        foreach ($this->registry->shortcodes as $shortcode_class => $shortcode) {
292
-            if ($load_all || has_shortcode($content, $shortcode_class)) {
293
-                // load up the shortcode
294
-                $this->initializeShortcode($shortcode_class);
295
-                $has_shortcode = true;
296
-            }
297
-        }
298
-        return $has_shortcode;
299
-    }
300
-
301
-
302
-    /**
303
-     * given a shortcode name, will instantiate the shortcode and call it's run() method
304
-     *
305
-     * @param string $shortcode_class
306
-     * @param WP     $wp
307
-     */
308
-    public function initializeShortcode($shortcode_class = '', WP $wp = null)
309
-    {
310
-        // don't do anything if shortcode is already initialized
311
-        if (empty($this->registry->shortcodes->{$shortcode_class})
312
-            || ! is_string($this->registry->shortcodes->{$shortcode_class})
313
-        ) {
314
-            return;
315
-        }
316
-        // let's pause to reflect on this...
317
-        $sc_reflector = new ReflectionClass(LegacyShortcodesManager::addShortcodeClassPrefix($shortcode_class));
318
-        // ensure that class is actually a shortcode
319
-        if (defined('WP_DEBUG')
320
-            && WP_DEBUG === true
321
-            && ! $sc_reflector->isSubclassOf('EES_Shortcode')
322
-        ) {
323
-            EE_Error::add_error(
324
-                sprintf(
325
-                    esc_html__(
326
-                        'The requested %s shortcode is not of the class "EES_Shortcode". Please check your files.',
327
-                        'event_espresso'
328
-                    ),
329
-                    $shortcode_class
330
-                ),
331
-                __FILE__,
332
-                __FUNCTION__,
333
-                __LINE__
334
-            );
335
-            add_filter('FHEE_run_EE_the_content', '__return_true');
336
-            return;
337
-        }
338
-        global $wp;
339
-        // and pass the request object to the run method
340
-        $this->registry->shortcodes->{$shortcode_class} = $sc_reflector->newInstance();
341
-        // fire the shortcode class's run method, so that it can activate resources
342
-        $this->registry->shortcodes->{$shortcode_class}->run($wp);
343
-    }
344
-
345
-
346
-    /**
347
-     * get classname, remove EES_prefix, and convert to UPPERCASE
348
-     *
349
-     * @param string $class_name
350
-     * @return string
351
-     */
352
-    public static function generateShortcodeTagFromClassName($class_name)
353
-    {
354
-        return strtoupper(str_replace('EES_', '', $class_name));
355
-    }
356
-
357
-
358
-    /**
359
-     * add EES_prefix and Capitalize words
360
-     *
361
-     * @param string $tag
362
-     * @return string
363
-     */
364
-    public static function generateShortcodeClassNameFromTag($tag)
365
-    {
366
-        // order of operation runs from inside to out
367
-        // 5) maybe add prefix
368
-        return LegacyShortcodesManager::addShortcodeClassPrefix(
369
-            // 4) find spaces, replace with underscores
370
-            str_replace(
371
-                ' ',
372
-                '_',
373
-                // 3) capitalize first letter of each word
374
-                ucwords(
375
-                    // 2) also change to lowercase so ucwords() will work
376
-                    strtolower(
377
-                        // 1) find underscores, replace with spaces so ucwords() will work
378
-                        str_replace(
379
-                            '_',
380
-                            ' ',
381
-                            $tag
382
-                        )
383
-                    )
384
-                )
385
-            )
386
-        );
387
-    }
388
-
389
-
390
-    /**
391
-     * maybe add EES_prefix
392
-     *
393
-     * @param string $class_name
394
-     * @return string
395
-     */
396
-    public static function addShortcodeClassPrefix($class_name)
397
-    {
398
-        return strpos($class_name, 'EES_') === 0 ? $class_name : 'EES_' . $class_name;
399
-    }
400
-
401
-
402
-    /**
403
-     * @return array
404
-     */
405
-    public function getEspressoShortcodeTags()
406
-    {
407
-        static $shortcode_tags = array();
408
-        if (empty($shortcode_tags)) {
409
-            $shortcode_tags = array_keys((array) $this->registry->shortcodes);
410
-        }
411
-        return $shortcode_tags;
412
-    }
413
-
414
-
415
-    /**
416
-     * @param string $content
417
-     * @return string
418
-     */
419
-    public function doShortcode($content)
420
-    {
421
-        foreach ($this->getEspressoShortcodeTags() as $shortcode_tag) {
422
-            if (strpos($content, $shortcode_tag) !== false) {
423
-                $shortcode_class = LegacyShortcodesManager::generateShortcodeClassNameFromTag($shortcode_tag);
424
-                $this->initializeShortcode($shortcode_class);
425
-            }
426
-        }
427
-        return do_shortcode($content);
428
-    }
24
+	/**
25
+	 * @var EE_Registry $registry
26
+	 */
27
+	private $registry;
28
+
29
+
30
+	/**
31
+	 * LegacyShortcodesManager constructor.
32
+	 *
33
+	 * @param \EE_Registry $registry
34
+	 */
35
+	public function __construct(EE_Registry $registry)
36
+	{
37
+		$this->registry = $registry;
38
+	}
39
+
40
+
41
+	/**
42
+	 * @return EE_Registry
43
+	 */
44
+	public function registry()
45
+	{
46
+		return $this->registry;
47
+	}
48
+
49
+
50
+	/**
51
+	 * registerShortcodes
52
+	 *
53
+	 * @return void
54
+	 */
55
+	public function registerShortcodes()
56
+	{
57
+		$this->registry->shortcodes = $this->getShortcodes();
58
+	}
59
+
60
+
61
+	/**
62
+	 * getShortcodes
63
+	 *
64
+	 * @return array
65
+	 */
66
+	public function getShortcodes()
67
+	{
68
+		// previously this method would glob the shortcodes directory
69
+		// then filter that list of shortcodes to register,
70
+		// but now we are going to just supply an empty array.
71
+		// this allows any shortcodes that have not yet been converted to the new system
72
+		// to still get loaded and processed, albeit using the same legacy logic as before
73
+		$shortcodes_to_register = apply_filters(
74
+			'FHEE__EE_Config__register_shortcodes__shortcodes_to_register',
75
+			array()
76
+		);
77
+		if (! empty($shortcodes_to_register)) {
78
+			// cycle thru shortcode folders
79
+			foreach ($shortcodes_to_register as $shortcode_path) {
80
+				// add to list of installed shortcode modules
81
+				$this->registerShortcode($shortcode_path);
82
+			}
83
+		}
84
+		// filter list of installed modules
85
+		return apply_filters(
86
+			'FHEE__EE_Config___register_shortcodes__installed_shortcodes',
87
+			! empty($this->registry->shortcodes)
88
+				? $this->registry->shortcodes
89
+				: array()
90
+		);
91
+	}
92
+
93
+
94
+	/**
95
+	 *    register_shortcode - makes core aware of this shortcode
96
+	 *
97
+	 * @access    public
98
+	 * @param    string $shortcode_path - full path up to and including shortcode folder
99
+	 * @return    bool
100
+	 */
101
+	public function registerShortcode($shortcode_path = null)
102
+	{
103
+		do_action('AHEE__EE_Config__register_shortcode__begin', $shortcode_path);
104
+		$shortcode_ext = '.shortcode.php';
105
+		// make all separators match
106
+		$shortcode_path = str_replace(array('\\', '/'), DS, $shortcode_path);
107
+		// does the file path INCLUDE the actual file name as part of the path ?
108
+		if (strpos($shortcode_path, $shortcode_ext) !== false) {
109
+			// grab shortcode file name from directory name and break apart at dots
110
+			$shortcode_file = explode('.', basename($shortcode_path));
111
+			// take first segment from file name pieces and remove class prefix if it exists
112
+			$shortcode = strpos($shortcode_file[0], 'EES_') === 0
113
+				? substr($shortcode_file[0], 4)
114
+				: $shortcode_file[0];
115
+			// sanitize shortcode directory name
116
+			$shortcode = sanitize_key($shortcode);
117
+			// now we need to rebuild the shortcode path
118
+			$shortcode_path = explode(DS, $shortcode_path);
119
+			// remove last segment
120
+			array_pop($shortcode_path);
121
+			// glue it back together
122
+			$shortcode_path = implode(DS, $shortcode_path) . DS;
123
+		} else {
124
+			// we need to generate the filename based off of the folder name
125
+			// grab and sanitize shortcode directory name
126
+			$shortcode = sanitize_key(basename($shortcode_path));
127
+			$shortcode_path = rtrim($shortcode_path, DS) . DS;
128
+		}
129
+		// create classname from shortcode directory or file name
130
+		$shortcode = str_replace(' ', '_', ucwords(str_replace('_', ' ', $shortcode)));
131
+		// add class prefix
132
+		$shortcode_class = 'EES_' . $shortcode;
133
+		// does the shortcode exist ?
134
+		if (! is_readable($shortcode_path . DS . $shortcode_class . $shortcode_ext)) {
135
+			$msg = sprintf(
136
+				esc_html__(
137
+					'The requested %1$s shortcode file could not be found or is not readable due to file permissions. It should be in %2$s',
138
+					'event_espresso'
139
+				),
140
+				$shortcode_class,
141
+				$shortcode_path . DS . $shortcode_class . $shortcode_ext
142
+			);
143
+			EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
144
+			return false;
145
+		}
146
+		// load the shortcode class file
147
+		require_once($shortcode_path . $shortcode_class . $shortcode_ext);
148
+		// verify that class exists
149
+		if (! class_exists($shortcode_class)) {
150
+			$msg = sprintf(
151
+				esc_html__('The requested %s shortcode class does not exist.', 'event_espresso'),
152
+				$shortcode_class
153
+			);
154
+			EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
155
+			return false;
156
+		}
157
+		$shortcode = strtoupper($shortcode);
158
+		// add to array of registered shortcodes
159
+		$this->registry->shortcodes->{$shortcode} = $shortcode_path . $shortcode_class . $shortcode_ext;
160
+		return true;
161
+	}
162
+
163
+
164
+	/**
165
+	 *    _initialize_shortcodes
166
+	 *    allow shortcodes to set hooks for the rest of the system
167
+	 *
168
+	 * @access private
169
+	 * @return void
170
+	 */
171
+	public function addShortcodes()
172
+	{
173
+		// cycle thru shortcode folders
174
+		foreach ($this->registry->shortcodes as $shortcode => $shortcode_path) {
175
+			// add class prefix
176
+			$shortcode_class = 'EES_' . $shortcode;
177
+			// fire the shortcode class's set_hooks methods in case it needs to hook into other parts of the system
178
+			// which set hooks ?
179
+			if (is_admin()) {
180
+				// fire immediately
181
+				call_user_func(array($shortcode_class, 'set_hooks_admin'));
182
+			} else {
183
+				// delay until other systems are online
184
+				add_action(
185
+					'AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons',
186
+					array($shortcode_class, 'set_hooks')
187
+				);
188
+				// convert classname to UPPERCASE and create WP shortcode.
189
+				$shortcode_tag = strtoupper($shortcode);
190
+				// but first check if the shortcode has already
191
+				// been added before assigning 'fallback_shortcode_processor'
192
+				if (! shortcode_exists($shortcode_tag)) {
193
+					// NOTE: this shortcode declaration will get overridden if the shortcode
194
+					// is successfully detected in the post content in initializeShortcode()
195
+					add_shortcode($shortcode_tag, array($shortcode_class, 'fallback_shortcode_processor'));
196
+				}
197
+			}
198
+		}
199
+	}
200
+
201
+
202
+	/**
203
+	 * callback for the WP "get_header" hook point
204
+	 * checks posts for EE shortcodes, and initializes them,
205
+	 * then toggles filter switch that loads core default assets
206
+	 *
207
+	 * @param \WP_Query $wp_query
208
+	 * @return void
209
+	 */
210
+	public function initializeShortcodes(WP_Query $wp_query)
211
+	{
212
+		if (empty($this->registry->shortcodes) || ! $wp_query->is_main_query() || is_admin()) {
213
+			return;
214
+		}
215
+		global $wp;
216
+		/** @var EE_Front_controller $Front_Controller */
217
+		$Front_Controller = $this->registry->load_core('Front_Controller', array(), false);
218
+		do_action('AHEE__EE_Front_Controller__initialize_shortcodes__begin', $wp, $Front_Controller);
219
+		$Front_Controller->Request_Handler()->set_request_vars();
220
+		// grab post_name from request
221
+		$current_post = apply_filters(
222
+			'FHEE__EE_Front_Controller__initialize_shortcodes__current_post_name',
223
+			$Front_Controller->Request_Handler()->get('post_name')
224
+		);
225
+		$show_on_front = get_option('show_on_front');
226
+		// if it's not set, then check if frontpage is blog
227
+		if (empty($current_post)) {
228
+			// yup.. this is the posts page, prepare to load all shortcode modules
229
+			$current_post = 'posts';
230
+			// unless..
231
+			if ($show_on_front === 'page') {
232
+				// some other page is set as the homepage
233
+				$page_on_front = get_option('page_on_front');
234
+				if ($page_on_front) {
235
+					// k now we need to find the post_name for this page
236
+					global $wpdb;
237
+					$page_on_front = $wpdb->get_var(
238
+						$wpdb->prepare(
239
+							"SELECT post_name from {$wpdb->posts} WHERE post_type='page' AND post_status NOT IN ('auto-draft', 'inherit', 'trash') AND ID=%d",
240
+							$page_on_front
241
+						)
242
+					);
243
+					// set the current post slug to what it actually is
244
+					$current_post = $page_on_front ? $page_on_front : $current_post;
245
+				}
246
+			}
247
+		}
248
+		// in case $current_post is hierarchical like: /parent-page/current-page
249
+		$current_post = basename($current_post);
250
+		if (// is current page/post the "blog" page ?
251
+			$current_post === EE_Config::get_page_for_posts()
252
+			// or are we on a category page?
253
+			|| (
254
+				is_array(term_exists($current_post, 'category'))
255
+				|| array_key_exists('category_name', $wp->query_vars)
256
+			)
257
+		) {
258
+			// initialize all legacy shortcodes
259
+			$load_assets = $this->parseContentForShortcodes('', true);
260
+		} else {
261
+			global $wpdb;
262
+			$post_content = $wpdb->get_var(
263
+				$wpdb->prepare(
264
+					"SELECT post_content from {$wpdb->posts} WHERE post_status NOT IN ('auto-draft', 'inherit', 'trash') AND post_name=%s",
265
+					$current_post
266
+				)
267
+			);
268
+			$load_assets = $this->parseContentForShortcodes($post_content);
269
+		}
270
+		if ($load_assets) {
271
+			$this->registry->REQ->set_espresso_page(true);
272
+			add_filter('FHEE_load_css', '__return_true');
273
+			add_filter('FHEE_load_js', '__return_true');
274
+		}
275
+		do_action('AHEE__EE_Front_Controller__initialize_shortcodes__end', $Front_Controller);
276
+	}
277
+
278
+
279
+	/**
280
+	 * checks supplied content against list of legacy shortcodes,
281
+	 * then initializes any found shortcodes, and returns true.
282
+	 * returns false if no shortcodes found.
283
+	 *
284
+	 * @param string $content
285
+	 * @param bool   $load_all if true, then ALL active legacy shortcodes will be initialized
286
+	 * @return bool
287
+	 */
288
+	public function parseContentForShortcodes($content = '', $load_all = false)
289
+	{
290
+		$has_shortcode = false;
291
+		foreach ($this->registry->shortcodes as $shortcode_class => $shortcode) {
292
+			if ($load_all || has_shortcode($content, $shortcode_class)) {
293
+				// load up the shortcode
294
+				$this->initializeShortcode($shortcode_class);
295
+				$has_shortcode = true;
296
+			}
297
+		}
298
+		return $has_shortcode;
299
+	}
300
+
301
+
302
+	/**
303
+	 * given a shortcode name, will instantiate the shortcode and call it's run() method
304
+	 *
305
+	 * @param string $shortcode_class
306
+	 * @param WP     $wp
307
+	 */
308
+	public function initializeShortcode($shortcode_class = '', WP $wp = null)
309
+	{
310
+		// don't do anything if shortcode is already initialized
311
+		if (empty($this->registry->shortcodes->{$shortcode_class})
312
+			|| ! is_string($this->registry->shortcodes->{$shortcode_class})
313
+		) {
314
+			return;
315
+		}
316
+		// let's pause to reflect on this...
317
+		$sc_reflector = new ReflectionClass(LegacyShortcodesManager::addShortcodeClassPrefix($shortcode_class));
318
+		// ensure that class is actually a shortcode
319
+		if (defined('WP_DEBUG')
320
+			&& WP_DEBUG === true
321
+			&& ! $sc_reflector->isSubclassOf('EES_Shortcode')
322
+		) {
323
+			EE_Error::add_error(
324
+				sprintf(
325
+					esc_html__(
326
+						'The requested %s shortcode is not of the class "EES_Shortcode". Please check your files.',
327
+						'event_espresso'
328
+					),
329
+					$shortcode_class
330
+				),
331
+				__FILE__,
332
+				__FUNCTION__,
333
+				__LINE__
334
+			);
335
+			add_filter('FHEE_run_EE_the_content', '__return_true');
336
+			return;
337
+		}
338
+		global $wp;
339
+		// and pass the request object to the run method
340
+		$this->registry->shortcodes->{$shortcode_class} = $sc_reflector->newInstance();
341
+		// fire the shortcode class's run method, so that it can activate resources
342
+		$this->registry->shortcodes->{$shortcode_class}->run($wp);
343
+	}
344
+
345
+
346
+	/**
347
+	 * get classname, remove EES_prefix, and convert to UPPERCASE
348
+	 *
349
+	 * @param string $class_name
350
+	 * @return string
351
+	 */
352
+	public static function generateShortcodeTagFromClassName($class_name)
353
+	{
354
+		return strtoupper(str_replace('EES_', '', $class_name));
355
+	}
356
+
357
+
358
+	/**
359
+	 * add EES_prefix and Capitalize words
360
+	 *
361
+	 * @param string $tag
362
+	 * @return string
363
+	 */
364
+	public static function generateShortcodeClassNameFromTag($tag)
365
+	{
366
+		// order of operation runs from inside to out
367
+		// 5) maybe add prefix
368
+		return LegacyShortcodesManager::addShortcodeClassPrefix(
369
+			// 4) find spaces, replace with underscores
370
+			str_replace(
371
+				' ',
372
+				'_',
373
+				// 3) capitalize first letter of each word
374
+				ucwords(
375
+					// 2) also change to lowercase so ucwords() will work
376
+					strtolower(
377
+						// 1) find underscores, replace with spaces so ucwords() will work
378
+						str_replace(
379
+							'_',
380
+							' ',
381
+							$tag
382
+						)
383
+					)
384
+				)
385
+			)
386
+		);
387
+	}
388
+
389
+
390
+	/**
391
+	 * maybe add EES_prefix
392
+	 *
393
+	 * @param string $class_name
394
+	 * @return string
395
+	 */
396
+	public static function addShortcodeClassPrefix($class_name)
397
+	{
398
+		return strpos($class_name, 'EES_') === 0 ? $class_name : 'EES_' . $class_name;
399
+	}
400
+
401
+
402
+	/**
403
+	 * @return array
404
+	 */
405
+	public function getEspressoShortcodeTags()
406
+	{
407
+		static $shortcode_tags = array();
408
+		if (empty($shortcode_tags)) {
409
+			$shortcode_tags = array_keys((array) $this->registry->shortcodes);
410
+		}
411
+		return $shortcode_tags;
412
+	}
413
+
414
+
415
+	/**
416
+	 * @param string $content
417
+	 * @return string
418
+	 */
419
+	public function doShortcode($content)
420
+	{
421
+		foreach ($this->getEspressoShortcodeTags() as $shortcode_tag) {
422
+			if (strpos($content, $shortcode_tag) !== false) {
423
+				$shortcode_class = LegacyShortcodesManager::generateShortcodeClassNameFromTag($shortcode_tag);
424
+				$this->initializeShortcode($shortcode_class);
425
+			}
426
+		}
427
+		return do_shortcode($content);
428
+	}
429 429
 }
Please login to merge, or discard this patch.
Spacing   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -74,7 +74,7 @@  discard block
 block discarded – undo
74 74
             'FHEE__EE_Config__register_shortcodes__shortcodes_to_register',
75 75
             array()
76 76
         );
77
-        if (! empty($shortcodes_to_register)) {
77
+        if ( ! empty($shortcodes_to_register)) {
78 78
             // cycle thru shortcode folders
79 79
             foreach ($shortcodes_to_register as $shortcode_path) {
80 80
                 // add to list of installed shortcode modules
@@ -119,44 +119,44 @@  discard block
 block discarded – undo
119 119
             // remove last segment
120 120
             array_pop($shortcode_path);
121 121
             // glue it back together
122
-            $shortcode_path = implode(DS, $shortcode_path) . DS;
122
+            $shortcode_path = implode(DS, $shortcode_path).DS;
123 123
         } else {
124 124
             // we need to generate the filename based off of the folder name
125 125
             // grab and sanitize shortcode directory name
126 126
             $shortcode = sanitize_key(basename($shortcode_path));
127
-            $shortcode_path = rtrim($shortcode_path, DS) . DS;
127
+            $shortcode_path = rtrim($shortcode_path, DS).DS;
128 128
         }
129 129
         // create classname from shortcode directory or file name
130 130
         $shortcode = str_replace(' ', '_', ucwords(str_replace('_', ' ', $shortcode)));
131 131
         // add class prefix
132
-        $shortcode_class = 'EES_' . $shortcode;
132
+        $shortcode_class = 'EES_'.$shortcode;
133 133
         // does the shortcode exist ?
134
-        if (! is_readable($shortcode_path . DS . $shortcode_class . $shortcode_ext)) {
134
+        if ( ! is_readable($shortcode_path.DS.$shortcode_class.$shortcode_ext)) {
135 135
             $msg = sprintf(
136 136
                 esc_html__(
137 137
                     'The requested %1$s shortcode file could not be found or is not readable due to file permissions. It should be in %2$s',
138 138
                     'event_espresso'
139 139
                 ),
140 140
                 $shortcode_class,
141
-                $shortcode_path . DS . $shortcode_class . $shortcode_ext
141
+                $shortcode_path.DS.$shortcode_class.$shortcode_ext
142 142
             );
143
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
143
+            EE_Error::add_error($msg.'||'.$msg, __FILE__, __FUNCTION__, __LINE__);
144 144
             return false;
145 145
         }
146 146
         // load the shortcode class file
147
-        require_once($shortcode_path . $shortcode_class . $shortcode_ext);
147
+        require_once($shortcode_path.$shortcode_class.$shortcode_ext);
148 148
         // verify that class exists
149
-        if (! class_exists($shortcode_class)) {
149
+        if ( ! class_exists($shortcode_class)) {
150 150
             $msg = sprintf(
151 151
                 esc_html__('The requested %s shortcode class does not exist.', 'event_espresso'),
152 152
                 $shortcode_class
153 153
             );
154
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
154
+            EE_Error::add_error($msg.'||'.$msg, __FILE__, __FUNCTION__, __LINE__);
155 155
             return false;
156 156
         }
157 157
         $shortcode = strtoupper($shortcode);
158 158
         // add to array of registered shortcodes
159
-        $this->registry->shortcodes->{$shortcode} = $shortcode_path . $shortcode_class . $shortcode_ext;
159
+        $this->registry->shortcodes->{$shortcode} = $shortcode_path.$shortcode_class.$shortcode_ext;
160 160
         return true;
161 161
     }
162 162
 
@@ -173,7 +173,7 @@  discard block
 block discarded – undo
173 173
         // cycle thru shortcode folders
174 174
         foreach ($this->registry->shortcodes as $shortcode => $shortcode_path) {
175 175
             // add class prefix
176
-            $shortcode_class = 'EES_' . $shortcode;
176
+            $shortcode_class = 'EES_'.$shortcode;
177 177
             // fire the shortcode class's set_hooks methods in case it needs to hook into other parts of the system
178 178
             // which set hooks ?
179 179
             if (is_admin()) {
@@ -189,7 +189,7 @@  discard block
 block discarded – undo
189 189
                 $shortcode_tag = strtoupper($shortcode);
190 190
                 // but first check if the shortcode has already
191 191
                 // been added before assigning 'fallback_shortcode_processor'
192
-                if (! shortcode_exists($shortcode_tag)) {
192
+                if ( ! shortcode_exists($shortcode_tag)) {
193 193
                     // NOTE: this shortcode declaration will get overridden if the shortcode
194 194
                     // is successfully detected in the post content in initializeShortcode()
195 195
                     add_shortcode($shortcode_tag, array($shortcode_class, 'fallback_shortcode_processor'));
@@ -395,7 +395,7 @@  discard block
 block discarded – undo
395 395
      */
396 396
     public static function addShortcodeClassPrefix($class_name)
397 397
     {
398
-        return strpos($class_name, 'EES_') === 0 ? $class_name : 'EES_' . $class_name;
398
+        return strpos($class_name, 'EES_') === 0 ? $class_name : 'EES_'.$class_name;
399 399
     }
400 400
 
401 401
 
Please login to merge, or discard this patch.
core/services/formatters/Windows1252.php 1 patch
Indentation   +30 added lines, -30 removed lines patch added patch discarded remove patch
@@ -17,34 +17,34 @@
 block discarded – undo
17 17
 class Windows1252 extends FormatterBase
18 18
 {
19 19
 
20
-    /**
21
-     * Converts the string to windows-1252 encoding.
22
-     *
23
-     * @param string|int|float $input anything easily cast into a string
24
-     * @return string
25
-     */
26
-    public function format($input)
27
-    {
28
-        // in case an int or float etc was passed in
29
-        $input = (string) $input;
30
-        if (function_exists('iconv')) {
31
-            $input = iconv('utf-8', 'cp1252//TRANSLIT', $input);
32
-        } elseif (WP_DEBUG) {
33
-            trigger_error(
34
-                sprintf(
35
-                // @codingStandardsIgnoreStart
36
-                    esc_html__(
37
-                        '%1$s could not format the string "%2$s" because the function "%3$s" does not exist. Please verify PHP is installed with this function, see %4$s',
38
-                        'event_espresso'
39
-                    ),
40
-                    // @codingStandardsIgnoreEnd
41
-                    get_class($this),
42
-                    $input,
43
-                    'iconv',
44
-                    '<a href="http://php.net/manual/en/iconv.installation.php">http://php.net/manual/en/iconv.installation.php</a>'
45
-                )
46
-            );
47
-        }
48
-        return $input;
49
-    }
20
+	/**
21
+	 * Converts the string to windows-1252 encoding.
22
+	 *
23
+	 * @param string|int|float $input anything easily cast into a string
24
+	 * @return string
25
+	 */
26
+	public function format($input)
27
+	{
28
+		// in case an int or float etc was passed in
29
+		$input = (string) $input;
30
+		if (function_exists('iconv')) {
31
+			$input = iconv('utf-8', 'cp1252//TRANSLIT', $input);
32
+		} elseif (WP_DEBUG) {
33
+			trigger_error(
34
+				sprintf(
35
+				// @codingStandardsIgnoreStart
36
+					esc_html__(
37
+						'%1$s could not format the string "%2$s" because the function "%3$s" does not exist. Please verify PHP is installed with this function, see %4$s',
38
+						'event_espresso'
39
+					),
40
+					// @codingStandardsIgnoreEnd
41
+					get_class($this),
42
+					$input,
43
+					'iconv',
44
+					'<a href="http://php.net/manual/en/iconv.installation.php">http://php.net/manual/en/iconv.installation.php</a>'
45
+				)
46
+			);
47
+		}
48
+		return $input;
49
+	}
50 50
 }
Please login to merge, or discard this patch.
core/services/collections/CollectionDetails.php 2 patches
Indentation   +347 added lines, -347 removed lines patch added patch discarded remove patch
@@ -42,351 +42,351 @@
 block discarded – undo
42 42
 class CollectionDetails implements CollectionDetailsInterface
43 43
 {
44 44
 
45
-    /**
46
-     * if $identifier_type is set to this,
47
-     * then the collection will use each object's spl_object_hash() as it's identifier
48
-     */
49
-    const ID_OBJECT_HASH = 'identifier-uses-spl-object-hash';
50
-
51
-    /**
52
-     * if $identifier_type is set to this,
53
-     * then the collection will use each object's class name as it's identifier
54
-     */
55
-    const ID_CLASS_NAME = 'identifier-uses-object-class-name';
56
-
57
-    /**
58
-     * if $identifier_type is set to this,
59
-     * then the collection will use the return value from a specified callback method on each object
60
-     */
61
-    const ID_CALLBACK_METHOD = 'identifier-uses-callback-method';
62
-
63
-    /**
64
-     * The interface used for controlling what gets added to the collection
65
-     *
66
-     * @var string $collection_interface
67
-     */
68
-    protected $collection_interface = '';
69
-
70
-    /**
71
-     * a unique name used to identify the collection in filter names
72
-     * supplied value is run through sanitize_title_with_dashes(),
73
-     * but then also converts dashes to underscores
74
-     *
75
-     * @var string $collection_name
76
-     */
77
-    protected $collection_name = '';
78
-
79
-    /**
80
-     * what the collection uses for the object identifier.
81
-     * corresponds to one of the class constants above.
82
-     * CollectionDetails::ID_OBJECT_HASH will use spl_object_hash( object ) for the identifier
83
-     * CollectionDetails::ID_CLASS_NAME will use get_class( object ) for the identifier
84
-     * CollectionDetails::ID_CALLBACK_METHOD will use a callback for the identifier
85
-     * defaults to using spl_object_hash() so that multiple objects of the same class can be added
86
-     *
87
-     * @var string $identifier_type
88
-     */
89
-    protected $identifier_type = CollectionDetails::ID_OBJECT_HASH;
90
-
91
-    /**
92
-     * the pattern applied to paths when searching for class files to add to the collection
93
-     * ie: "My_Awesome_*.class.php"
94
-     * defaults to "*.php"
95
-     *
96
-     * @var string $file_mask
97
-     */
98
-    protected $file_mask = '';
99
-
100
-    /**
101
-     * if the $identifier_type above is set to CollectionDetails::ID_CALLBACK_METHOD,
102
-     * then this specifies the method to use on each entity.
103
-     * If the callback method does not exist, then an exception will be thrown
104
-     *
105
-     * @var string $identifier_callback
106
-     */
107
-    protected $identifier_callback = '';
108
-
109
-    /**
110
-     * an array of Fully Qualified Class Names
111
-     *  for example:
112
-     *  $FQCNs = array(
113
-     *      '/Fully/Qualified/ClassNameA'
114
-     *      '/Fully/Qualified/Other/ClassNameB'
115
-     *  );
116
-     *
117
-     * @var array $collection_FQCNs
118
-     */
119
-    protected $collection_FQCNs = array();
120
-
121
-    /**
122
-     * an array of full server paths to folders containing files to be loaded into collection
123
-     *  for example:
124
-     *  $paths = array(
125
-     *      '/full/server/path/to/ClassNameA.ext.php' // for class ClassNameA
126
-     *      '/full/server/path/to/other/ClassNameB.php' // for class ClassNameB
127
-     *  );
128
-     *
129
-     * @var array $collection_paths
130
-     */
131
-    protected $collection_paths = array();
132
-
133
-    /**
134
-     * @var LocatorInterface $file_locator
135
-     */
136
-    protected $file_locator;
137
-
138
-
139
-    /**
140
-     * CollectionDetails constructor.
141
-     *
142
-     * @access public
143
-     * @param string           $collection_name
144
-     * @param string           $collection_interface
145
-     * @param array            $collection_FQCNs
146
-     * @param array            $collection_paths
147
-     * @param string           $file_mask
148
-     * @param string           $identifier_type
149
-     * @param string           $identifier_callback
150
-     * @param LocatorInterface $file_locator
151
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
152
-     * @throws \EventEspresso\core\exceptions\InvalidFilePathException
153
-     * @throws \EventEspresso\core\exceptions\InvalidIdentifierException
154
-     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
155
-     * @throws \EventEspresso\core\exceptions\InvalidClassException
156
-     */
157
-    public function __construct(
158
-        $collection_name,
159
-        $collection_interface,
160
-        $collection_FQCNs = array(),
161
-        $collection_paths = array(),
162
-        $file_mask = '',
163
-        $identifier_type = CollectionDetails::ID_OBJECT_HASH,
164
-        $identifier_callback = '',
165
-        LocatorInterface $file_locator = null
166
-    ) {
167
-        $this->setCollectionName($collection_name);
168
-        $this->setCollectionInterface($collection_interface);
169
-        $this->setCollectionFQCNs($collection_FQCNs);
170
-        $this->setCollectionPaths($collection_paths);
171
-        $this->setFileMasks($file_mask);
172
-        $this->setIdentifierType($identifier_type);
173
-        $this->setIdentifierCallback($identifier_callback);
174
-        $this->file_locator = $file_locator;
175
-    }
176
-
177
-
178
-    /**
179
-     * @access public
180
-     * @return mixed
181
-     */
182
-    public function getCollectionInterface()
183
-    {
184
-        return $this->collection_interface;
185
-    }
186
-
187
-
188
-    /**
189
-     * @access protected
190
-     * @param string $collection_interface
191
-     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
192
-     */
193
-    protected function setCollectionInterface($collection_interface)
194
-    {
195
-        if (! (interface_exists($collection_interface) || class_exists($collection_interface))) {
196
-            throw new InvalidInterfaceException($collection_interface);
197
-        }
198
-        $this->collection_interface = $collection_interface;
199
-    }
200
-
201
-
202
-    /**
203
-     * the collection name will be used for creating dynamic filters
204
-     *
205
-     * @access public
206
-     * @return string
207
-     */
208
-    public function collectionName()
209
-    {
210
-        return $this->collection_name;
211
-    }
212
-
213
-
214
-    /**
215
-     * sanitizes collection name and converts spaces and dashes to underscores
216
-     *
217
-     * @access protected
218
-     * @param string $collection_name
219
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
220
-     */
221
-    protected function setCollectionName($collection_name)
222
-    {
223
-        if (! is_string($collection_name)) {
224
-            throw new InvalidDataTypeException('$collection_name', $collection_name, 'string');
225
-        }
226
-        $this->collection_name = str_replace(
227
-            '-',
228
-            '_',
229
-            sanitize_title_with_dashes($collection_name, '', 'save')
230
-        );
231
-    }
232
-
233
-
234
-    /**
235
-     * @access public
236
-     * @return string
237
-     */
238
-    public function identifierType()
239
-    {
240
-        return $this->identifier_type;
241
-    }
242
-
243
-
244
-    /**
245
-     * @access protected
246
-     * @param string $identifier_type
247
-     * @throws \EventEspresso\core\exceptions\InvalidIdentifierException
248
-     */
249
-    protected function setIdentifierType($identifier_type)
250
-    {
251
-        if (! ($identifier_type === CollectionDetails::ID_CLASS_NAME
252
-               || $identifier_type === CollectionDetails::ID_OBJECT_HASH
253
-               || $identifier_type === CollectionDetails::ID_CALLBACK_METHOD
254
-        )) {
255
-            throw new InvalidIdentifierException(
256
-                $identifier_type,
257
-                'CollectionDetails::ID_CLASS_NAME or CollectionDetails::ID_OBJECT_HASH or CollectionDetails::ID_CALLBACK_METHOD'
258
-            );
259
-        }
260
-        $this->identifier_type = $identifier_type;
261
-    }
262
-
263
-
264
-    /**
265
-     * @access public
266
-     * @return string
267
-     */
268
-    public function identifierCallback()
269
-    {
270
-        return $this->identifier_callback;
271
-    }
272
-
273
-
274
-    /**
275
-     * @access protected
276
-     * @param string $identifier_callback
277
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
278
-     */
279
-    protected function setIdentifierCallback($identifier_callback = 'identifier')
280
-    {
281
-        if (! is_string($identifier_callback)) {
282
-            throw new InvalidDataTypeException('$identifier_callback', $identifier_callback, 'string');
283
-        }
284
-        $this->identifier_callback = $identifier_callback;
285
-    }
286
-
287
-
288
-    /**
289
-     * @access public
290
-     * @return string
291
-     */
292
-    public function getFileMask()
293
-    {
294
-        return $this->file_mask;
295
-    }
296
-
297
-
298
-    /**
299
-     * sets the file mask which is then used to filter what files get loaded
300
-     * when searching for classes to add to the collection. Defaults to '*.php'
301
-     *
302
-     * @access protected
303
-     * @param string $file_mask
304
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
305
-     */
306
-    protected function setFileMasks($file_mask)
307
-    {
308
-        $this->file_mask = ! empty($file_mask) ? $file_mask : '*.php';
309
-        // we know our default is a string, so if it's not a string now,
310
-        // then that means the incoming parameter was something else
311
-        if (! is_string($this->file_mask)) {
312
-            throw new InvalidDataTypeException('$file_mask', $this->file_mask, 'string');
313
-        }
314
-    }
315
-
316
-
317
-    /**
318
-     * @access public
319
-     * @return string
320
-     */
321
-    public function getCollectionFQCNs()
322
-    {
323
-        return $this->collection_FQCNs;
324
-    }
325
-
326
-
327
-    /**
328
-     * @access public
329
-     * @param string|array $collection_FQCNs
330
-     * @throws \EventEspresso\core\exceptions\InvalidClassException
331
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
332
-     */
333
-    public function setCollectionFQCNs($collection_FQCNs)
334
-    {
335
-        foreach ((array) $collection_FQCNs as $collection_FQCN) {
336
-            if (! empty($collection_FQCN)) {
337
-                if (class_exists($collection_FQCN)) {
338
-                    $this->collection_FQCNs[] = $collection_FQCN;
339
-                } else {
340
-                    foreach ($this->getFQCNsFromPartialNamespace($collection_FQCN) as $FQCN) {
341
-                        $this->collection_FQCNs[] = $FQCN;
342
-                    }
343
-                }
344
-            }
345
-        }
346
-    }
347
-
348
-
349
-    /**
350
-     * @access protected
351
-     * @param  string $partial_FQCN
352
-     * @return array
353
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
354
-     * @throws \EventEspresso\core\exceptions\InvalidClassException
355
-     */
356
-    protected function getFQCNsFromPartialNamespace($partial_FQCN)
357
-    {
358
-        if (! $this->file_locator instanceof FqcnLocator) {
359
-            $this->file_locator = new FqcnLocator();
360
-        }
361
-        $this->file_locator->locate($partial_FQCN);
362
-        return $this->file_locator->getFQCNs();
363
-    }
364
-
365
-
366
-    /**
367
-     * @access public
368
-     * @return string
369
-     */
370
-    public function getCollectionPaths()
371
-    {
372
-        return $this->collection_paths;
373
-    }
374
-
375
-
376
-    /**
377
-     * @access public
378
-     * @param string|array $collection_paths
379
-     * @throws \EventEspresso\core\exceptions\InvalidFilePathException
380
-     */
381
-    public function setCollectionPaths($collection_paths)
382
-    {
383
-        foreach ((array) $collection_paths as $collection_path) {
384
-            if (! empty($collection_path)) {
385
-                if (! is_readable($collection_path)) {
386
-                    throw new InvalidFilePathException($collection_path);
387
-                }
388
-                $this->collection_paths[] = $collection_path;
389
-            }
390
-        }
391
-    }
45
+	/**
46
+	 * if $identifier_type is set to this,
47
+	 * then the collection will use each object's spl_object_hash() as it's identifier
48
+	 */
49
+	const ID_OBJECT_HASH = 'identifier-uses-spl-object-hash';
50
+
51
+	/**
52
+	 * if $identifier_type is set to this,
53
+	 * then the collection will use each object's class name as it's identifier
54
+	 */
55
+	const ID_CLASS_NAME = 'identifier-uses-object-class-name';
56
+
57
+	/**
58
+	 * if $identifier_type is set to this,
59
+	 * then the collection will use the return value from a specified callback method on each object
60
+	 */
61
+	const ID_CALLBACK_METHOD = 'identifier-uses-callback-method';
62
+
63
+	/**
64
+	 * The interface used for controlling what gets added to the collection
65
+	 *
66
+	 * @var string $collection_interface
67
+	 */
68
+	protected $collection_interface = '';
69
+
70
+	/**
71
+	 * a unique name used to identify the collection in filter names
72
+	 * supplied value is run through sanitize_title_with_dashes(),
73
+	 * but then also converts dashes to underscores
74
+	 *
75
+	 * @var string $collection_name
76
+	 */
77
+	protected $collection_name = '';
78
+
79
+	/**
80
+	 * what the collection uses for the object identifier.
81
+	 * corresponds to one of the class constants above.
82
+	 * CollectionDetails::ID_OBJECT_HASH will use spl_object_hash( object ) for the identifier
83
+	 * CollectionDetails::ID_CLASS_NAME will use get_class( object ) for the identifier
84
+	 * CollectionDetails::ID_CALLBACK_METHOD will use a callback for the identifier
85
+	 * defaults to using spl_object_hash() so that multiple objects of the same class can be added
86
+	 *
87
+	 * @var string $identifier_type
88
+	 */
89
+	protected $identifier_type = CollectionDetails::ID_OBJECT_HASH;
90
+
91
+	/**
92
+	 * the pattern applied to paths when searching for class files to add to the collection
93
+	 * ie: "My_Awesome_*.class.php"
94
+	 * defaults to "*.php"
95
+	 *
96
+	 * @var string $file_mask
97
+	 */
98
+	protected $file_mask = '';
99
+
100
+	/**
101
+	 * if the $identifier_type above is set to CollectionDetails::ID_CALLBACK_METHOD,
102
+	 * then this specifies the method to use on each entity.
103
+	 * If the callback method does not exist, then an exception will be thrown
104
+	 *
105
+	 * @var string $identifier_callback
106
+	 */
107
+	protected $identifier_callback = '';
108
+
109
+	/**
110
+	 * an array of Fully Qualified Class Names
111
+	 *  for example:
112
+	 *  $FQCNs = array(
113
+	 *      '/Fully/Qualified/ClassNameA'
114
+	 *      '/Fully/Qualified/Other/ClassNameB'
115
+	 *  );
116
+	 *
117
+	 * @var array $collection_FQCNs
118
+	 */
119
+	protected $collection_FQCNs = array();
120
+
121
+	/**
122
+	 * an array of full server paths to folders containing files to be loaded into collection
123
+	 *  for example:
124
+	 *  $paths = array(
125
+	 *      '/full/server/path/to/ClassNameA.ext.php' // for class ClassNameA
126
+	 *      '/full/server/path/to/other/ClassNameB.php' // for class ClassNameB
127
+	 *  );
128
+	 *
129
+	 * @var array $collection_paths
130
+	 */
131
+	protected $collection_paths = array();
132
+
133
+	/**
134
+	 * @var LocatorInterface $file_locator
135
+	 */
136
+	protected $file_locator;
137
+
138
+
139
+	/**
140
+	 * CollectionDetails constructor.
141
+	 *
142
+	 * @access public
143
+	 * @param string           $collection_name
144
+	 * @param string           $collection_interface
145
+	 * @param array            $collection_FQCNs
146
+	 * @param array            $collection_paths
147
+	 * @param string           $file_mask
148
+	 * @param string           $identifier_type
149
+	 * @param string           $identifier_callback
150
+	 * @param LocatorInterface $file_locator
151
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
152
+	 * @throws \EventEspresso\core\exceptions\InvalidFilePathException
153
+	 * @throws \EventEspresso\core\exceptions\InvalidIdentifierException
154
+	 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
155
+	 * @throws \EventEspresso\core\exceptions\InvalidClassException
156
+	 */
157
+	public function __construct(
158
+		$collection_name,
159
+		$collection_interface,
160
+		$collection_FQCNs = array(),
161
+		$collection_paths = array(),
162
+		$file_mask = '',
163
+		$identifier_type = CollectionDetails::ID_OBJECT_HASH,
164
+		$identifier_callback = '',
165
+		LocatorInterface $file_locator = null
166
+	) {
167
+		$this->setCollectionName($collection_name);
168
+		$this->setCollectionInterface($collection_interface);
169
+		$this->setCollectionFQCNs($collection_FQCNs);
170
+		$this->setCollectionPaths($collection_paths);
171
+		$this->setFileMasks($file_mask);
172
+		$this->setIdentifierType($identifier_type);
173
+		$this->setIdentifierCallback($identifier_callback);
174
+		$this->file_locator = $file_locator;
175
+	}
176
+
177
+
178
+	/**
179
+	 * @access public
180
+	 * @return mixed
181
+	 */
182
+	public function getCollectionInterface()
183
+	{
184
+		return $this->collection_interface;
185
+	}
186
+
187
+
188
+	/**
189
+	 * @access protected
190
+	 * @param string $collection_interface
191
+	 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
192
+	 */
193
+	protected function setCollectionInterface($collection_interface)
194
+	{
195
+		if (! (interface_exists($collection_interface) || class_exists($collection_interface))) {
196
+			throw new InvalidInterfaceException($collection_interface);
197
+		}
198
+		$this->collection_interface = $collection_interface;
199
+	}
200
+
201
+
202
+	/**
203
+	 * the collection name will be used for creating dynamic filters
204
+	 *
205
+	 * @access public
206
+	 * @return string
207
+	 */
208
+	public function collectionName()
209
+	{
210
+		return $this->collection_name;
211
+	}
212
+
213
+
214
+	/**
215
+	 * sanitizes collection name and converts spaces and dashes to underscores
216
+	 *
217
+	 * @access protected
218
+	 * @param string $collection_name
219
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
220
+	 */
221
+	protected function setCollectionName($collection_name)
222
+	{
223
+		if (! is_string($collection_name)) {
224
+			throw new InvalidDataTypeException('$collection_name', $collection_name, 'string');
225
+		}
226
+		$this->collection_name = str_replace(
227
+			'-',
228
+			'_',
229
+			sanitize_title_with_dashes($collection_name, '', 'save')
230
+		);
231
+	}
232
+
233
+
234
+	/**
235
+	 * @access public
236
+	 * @return string
237
+	 */
238
+	public function identifierType()
239
+	{
240
+		return $this->identifier_type;
241
+	}
242
+
243
+
244
+	/**
245
+	 * @access protected
246
+	 * @param string $identifier_type
247
+	 * @throws \EventEspresso\core\exceptions\InvalidIdentifierException
248
+	 */
249
+	protected function setIdentifierType($identifier_type)
250
+	{
251
+		if (! ($identifier_type === CollectionDetails::ID_CLASS_NAME
252
+			   || $identifier_type === CollectionDetails::ID_OBJECT_HASH
253
+			   || $identifier_type === CollectionDetails::ID_CALLBACK_METHOD
254
+		)) {
255
+			throw new InvalidIdentifierException(
256
+				$identifier_type,
257
+				'CollectionDetails::ID_CLASS_NAME or CollectionDetails::ID_OBJECT_HASH or CollectionDetails::ID_CALLBACK_METHOD'
258
+			);
259
+		}
260
+		$this->identifier_type = $identifier_type;
261
+	}
262
+
263
+
264
+	/**
265
+	 * @access public
266
+	 * @return string
267
+	 */
268
+	public function identifierCallback()
269
+	{
270
+		return $this->identifier_callback;
271
+	}
272
+
273
+
274
+	/**
275
+	 * @access protected
276
+	 * @param string $identifier_callback
277
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
278
+	 */
279
+	protected function setIdentifierCallback($identifier_callback = 'identifier')
280
+	{
281
+		if (! is_string($identifier_callback)) {
282
+			throw new InvalidDataTypeException('$identifier_callback', $identifier_callback, 'string');
283
+		}
284
+		$this->identifier_callback = $identifier_callback;
285
+	}
286
+
287
+
288
+	/**
289
+	 * @access public
290
+	 * @return string
291
+	 */
292
+	public function getFileMask()
293
+	{
294
+		return $this->file_mask;
295
+	}
296
+
297
+
298
+	/**
299
+	 * sets the file mask which is then used to filter what files get loaded
300
+	 * when searching for classes to add to the collection. Defaults to '*.php'
301
+	 *
302
+	 * @access protected
303
+	 * @param string $file_mask
304
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
305
+	 */
306
+	protected function setFileMasks($file_mask)
307
+	{
308
+		$this->file_mask = ! empty($file_mask) ? $file_mask : '*.php';
309
+		// we know our default is a string, so if it's not a string now,
310
+		// then that means the incoming parameter was something else
311
+		if (! is_string($this->file_mask)) {
312
+			throw new InvalidDataTypeException('$file_mask', $this->file_mask, 'string');
313
+		}
314
+	}
315
+
316
+
317
+	/**
318
+	 * @access public
319
+	 * @return string
320
+	 */
321
+	public function getCollectionFQCNs()
322
+	{
323
+		return $this->collection_FQCNs;
324
+	}
325
+
326
+
327
+	/**
328
+	 * @access public
329
+	 * @param string|array $collection_FQCNs
330
+	 * @throws \EventEspresso\core\exceptions\InvalidClassException
331
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
332
+	 */
333
+	public function setCollectionFQCNs($collection_FQCNs)
334
+	{
335
+		foreach ((array) $collection_FQCNs as $collection_FQCN) {
336
+			if (! empty($collection_FQCN)) {
337
+				if (class_exists($collection_FQCN)) {
338
+					$this->collection_FQCNs[] = $collection_FQCN;
339
+				} else {
340
+					foreach ($this->getFQCNsFromPartialNamespace($collection_FQCN) as $FQCN) {
341
+						$this->collection_FQCNs[] = $FQCN;
342
+					}
343
+				}
344
+			}
345
+		}
346
+	}
347
+
348
+
349
+	/**
350
+	 * @access protected
351
+	 * @param  string $partial_FQCN
352
+	 * @return array
353
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
354
+	 * @throws \EventEspresso\core\exceptions\InvalidClassException
355
+	 */
356
+	protected function getFQCNsFromPartialNamespace($partial_FQCN)
357
+	{
358
+		if (! $this->file_locator instanceof FqcnLocator) {
359
+			$this->file_locator = new FqcnLocator();
360
+		}
361
+		$this->file_locator->locate($partial_FQCN);
362
+		return $this->file_locator->getFQCNs();
363
+	}
364
+
365
+
366
+	/**
367
+	 * @access public
368
+	 * @return string
369
+	 */
370
+	public function getCollectionPaths()
371
+	{
372
+		return $this->collection_paths;
373
+	}
374
+
375
+
376
+	/**
377
+	 * @access public
378
+	 * @param string|array $collection_paths
379
+	 * @throws \EventEspresso\core\exceptions\InvalidFilePathException
380
+	 */
381
+	public function setCollectionPaths($collection_paths)
382
+	{
383
+		foreach ((array) $collection_paths as $collection_path) {
384
+			if (! empty($collection_path)) {
385
+				if (! is_readable($collection_path)) {
386
+					throw new InvalidFilePathException($collection_path);
387
+				}
388
+				$this->collection_paths[] = $collection_path;
389
+			}
390
+		}
391
+	}
392 392
 }
Please login to merge, or discard this patch.
Spacing   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -192,7 +192,7 @@  discard block
 block discarded – undo
192 192
      */
193 193
     protected function setCollectionInterface($collection_interface)
194 194
     {
195
-        if (! (interface_exists($collection_interface) || class_exists($collection_interface))) {
195
+        if ( ! (interface_exists($collection_interface) || class_exists($collection_interface))) {
196 196
             throw new InvalidInterfaceException($collection_interface);
197 197
         }
198 198
         $this->collection_interface = $collection_interface;
@@ -220,7 +220,7 @@  discard block
 block discarded – undo
220 220
      */
221 221
     protected function setCollectionName($collection_name)
222 222
     {
223
-        if (! is_string($collection_name)) {
223
+        if ( ! is_string($collection_name)) {
224 224
             throw new InvalidDataTypeException('$collection_name', $collection_name, 'string');
225 225
         }
226 226
         $this->collection_name = str_replace(
@@ -248,7 +248,7 @@  discard block
 block discarded – undo
248 248
      */
249 249
     protected function setIdentifierType($identifier_type)
250 250
     {
251
-        if (! ($identifier_type === CollectionDetails::ID_CLASS_NAME
251
+        if ( ! ($identifier_type === CollectionDetails::ID_CLASS_NAME
252 252
                || $identifier_type === CollectionDetails::ID_OBJECT_HASH
253 253
                || $identifier_type === CollectionDetails::ID_CALLBACK_METHOD
254 254
         )) {
@@ -278,7 +278,7 @@  discard block
 block discarded – undo
278 278
      */
279 279
     protected function setIdentifierCallback($identifier_callback = 'identifier')
280 280
     {
281
-        if (! is_string($identifier_callback)) {
281
+        if ( ! is_string($identifier_callback)) {
282 282
             throw new InvalidDataTypeException('$identifier_callback', $identifier_callback, 'string');
283 283
         }
284 284
         $this->identifier_callback = $identifier_callback;
@@ -308,7 +308,7 @@  discard block
 block discarded – undo
308 308
         $this->file_mask = ! empty($file_mask) ? $file_mask : '*.php';
309 309
         // we know our default is a string, so if it's not a string now,
310 310
         // then that means the incoming parameter was something else
311
-        if (! is_string($this->file_mask)) {
311
+        if ( ! is_string($this->file_mask)) {
312 312
             throw new InvalidDataTypeException('$file_mask', $this->file_mask, 'string');
313 313
         }
314 314
     }
@@ -333,7 +333,7 @@  discard block
 block discarded – undo
333 333
     public function setCollectionFQCNs($collection_FQCNs)
334 334
     {
335 335
         foreach ((array) $collection_FQCNs as $collection_FQCN) {
336
-            if (! empty($collection_FQCN)) {
336
+            if ( ! empty($collection_FQCN)) {
337 337
                 if (class_exists($collection_FQCN)) {
338 338
                     $this->collection_FQCNs[] = $collection_FQCN;
339 339
                 } else {
@@ -355,7 +355,7 @@  discard block
 block discarded – undo
355 355
      */
356 356
     protected function getFQCNsFromPartialNamespace($partial_FQCN)
357 357
     {
358
-        if (! $this->file_locator instanceof FqcnLocator) {
358
+        if ( ! $this->file_locator instanceof FqcnLocator) {
359 359
             $this->file_locator = new FqcnLocator();
360 360
         }
361 361
         $this->file_locator->locate($partial_FQCN);
@@ -381,8 +381,8 @@  discard block
 block discarded – undo
381 381
     public function setCollectionPaths($collection_paths)
382 382
     {
383 383
         foreach ((array) $collection_paths as $collection_path) {
384
-            if (! empty($collection_path)) {
385
-                if (! is_readable($collection_path)) {
384
+            if ( ! empty($collection_path)) {
385
+                if ( ! is_readable($collection_path)) {
386 386
                     throw new InvalidFilePathException($collection_path);
387 387
                 }
388 388
                 $this->collection_paths[] = $collection_path;
Please login to merge, or discard this patch.