Completed
Pull Request — master (#331)
by Darren
20:21 queued 06:28
created
core/services/collections/Collection.php 2 patches
Indentation   +422 added lines, -422 removed lines patch added patch discarded remove patch
@@ -19,426 +19,426 @@
 block discarded – undo
19 19
 class Collection extends SplObjectStorage implements CollectionInterface
20 20
 {
21 21
 
22
-    /**
23
-     * a unique string for identifying this collection
24
-     *
25
-     * @type string $collection_identifier
26
-     */
27
-    protected $collection_identifier;
28
-
29
-
30
-    /**
31
-     * an interface (or class) name to be used for restricting the type of objects added to the storage
32
-     * this should be set from within the child class constructor
33
-     *
34
-     * @type string $interface
35
-     */
36
-    protected $collection_interface;
37
-
38
-
39
-    /**
40
-     * Collection constructor
41
-     *
42
-     * @param string $collection_interface
43
-     * @throws InvalidInterfaceException
44
-     */
45
-    public function __construct($collection_interface)
46
-    {
47
-        $this->setCollectionInterface($collection_interface);
48
-        $this->setCollectionIdentifier();
49
-    }
50
-
51
-
52
-    /**
53
-     * @return string
54
-     */
55
-    public function collectionIdentifier()
56
-    {
57
-        return $this->collection_identifier;
58
-    }
59
-
60
-
61
-    /**
62
-     * creates a very readable unique 9 character identifier like:  CF2-532-DAC
63
-     * and appends it to the non-qualified class name, ex: ThingCollection-CF2-532-DAC
64
-     *
65
-     * @return void
66
-     */
67
-    protected function setCollectionIdentifier()
68
-    {
69
-        // hash a few collection details
70
-        $identifier = md5(spl_object_hash($this) . $this->collection_interface . time());
71
-        // grab a few characters from the start, middle, and end of the hash
72
-        $id = array();
73
-        for ($x = 0; $x < 19; $x += 9) {
74
-            $id[] = substr($identifier, $x, 3);
75
-        }
76
-        $identifier = basename(str_replace('\\', '/', get_class($this)));
77
-        $identifier .= '-' . strtoupper(implode('-', $id));
78
-        $this->collection_identifier = $identifier;
79
-    }
80
-
81
-
82
-    /**
83
-     * setCollectionInterface
84
-     *
85
-     * @param  string $collection_interface
86
-     * @throws InvalidInterfaceException
87
-     */
88
-    protected function setCollectionInterface($collection_interface)
89
-    {
90
-        if (! (interface_exists($collection_interface) || class_exists($collection_interface))) {
91
-            throw new InvalidInterfaceException($collection_interface);
92
-        }
93
-        $this->collection_interface = $collection_interface;
94
-    }
95
-
96
-
97
-    /**
98
-     * add
99
-     * attaches an object to the Collection
100
-     * and sets any supplied data associated with the current iterator entry
101
-     * by calling EE_Object_Collection::set_identifier()
102
-     *
103
-     * @param        $object
104
-     * @param  mixed $identifier
105
-     * @return bool
106
-     * @throws InvalidEntityException
107
-     */
108
-    public function add($object, $identifier = null)
109
-    {
110
-        if (! $object instanceof $this->collection_interface) {
111
-            throw new InvalidEntityException($object, $this->collection_interface);
112
-        }
113
-        $this->attach($object);
114
-        $this->setIdentifier($object, $identifier);
115
-        return $this->contains($object);
116
-    }
117
-
118
-
119
-    /**
120
-     * setIdentifier
121
-     * Sets the data associated with an object in the Collection
122
-     * if no $identifier is supplied, then the spl_object_hash() is used
123
-     *
124
-     * @access public
125
-     * @param        $object
126
-     * @param  mixed $identifier
127
-     * @return bool
128
-     */
129
-    public function setIdentifier($object, $identifier = null)
130
-    {
131
-        $identifier = ! empty($identifier)
132
-            ? $identifier
133
-            : spl_object_hash($object);
134
-        $this->rewind();
135
-        while ($this->valid()) {
136
-            if ($object === $this->current()) {
137
-                $this->setInfo($identifier);
138
-                $this->rewind();
139
-                return true;
140
-            }
141
-            $this->next();
142
-        }
143
-        return false;
144
-    }
145
-
146
-
147
-    /**
148
-     * get
149
-     * finds and returns an object in the Collection based on the identifier that was set using addObject()
150
-     * PLZ NOTE: the pointer is reset to the beginning of the collection before returning
151
-     *
152
-     * @access public
153
-     * @param mixed $identifier
154
-     * @return mixed
155
-     */
156
-    public function get($identifier)
157
-    {
158
-        $this->rewind();
159
-        while ($this->valid()) {
160
-            if ($identifier === $this->getInfo()) {
161
-                $object = $this->current();
162
-                $this->rewind();
163
-                return $object;
164
-            }
165
-            $this->next();
166
-        }
167
-        return null;
168
-    }
169
-
170
-
171
-    /**
172
-     * has
173
-     * returns TRUE or FALSE
174
-     * depending on whether the object is within the Collection
175
-     * based on the supplied $identifier
176
-     *
177
-     * @access public
178
-     * @param  mixed $identifier
179
-     * @return bool
180
-     */
181
-    public function has($identifier)
182
-    {
183
-        $this->rewind();
184
-        while ($this->valid()) {
185
-            if ($identifier === $this->getInfo()) {
186
-                $this->rewind();
187
-                return true;
188
-            }
189
-            $this->next();
190
-        }
191
-        return false;
192
-    }
193
-
194
-
195
-    /**
196
-     * hasObject
197
-     * returns TRUE or FALSE depending on whether the supplied object is within the Collection
198
-     *
199
-     * @access public
200
-     * @param $object
201
-     * @return bool
202
-     */
203
-    public function hasObject($object)
204
-    {
205
-        return $this->contains($object);
206
-    }
207
-
208
-
209
-    /**
210
-     * hasObjects
211
-     * returns true if there are objects within the Collection, and false if it is empty
212
-     *
213
-     * @access public
214
-     * @return bool
215
-     */
216
-    public function hasObjects()
217
-    {
218
-        return $this->count() !== 0;
219
-    }
220
-
221
-
222
-    /**
223
-     * isEmpty
224
-     * returns true if there are no objects within the Collection, and false if there are
225
-     *
226
-     * @access public
227
-     * @return bool
228
-     */
229
-    public function isEmpty()
230
-    {
231
-        return $this->count() === 0;
232
-    }
233
-
234
-
235
-    /**
236
-     * remove
237
-     * detaches an object from the Collection
238
-     *
239
-     * @access public
240
-     * @param $object
241
-     * @return bool
242
-     */
243
-    public function remove($object)
244
-    {
245
-        $this->detach($object);
246
-        return true;
247
-    }
248
-
249
-
250
-    /**
251
-     * setCurrent
252
-     * advances pointer to the object whose identifier matches that which was provided
253
-     *
254
-     * @access public
255
-     * @param mixed $identifier
256
-     * @return boolean
257
-     */
258
-    public function setCurrent($identifier)
259
-    {
260
-        $this->rewind();
261
-        while ($this->valid()) {
262
-            if ($identifier === $this->getInfo()) {
263
-                return true;
264
-            }
265
-            $this->next();
266
-        }
267
-        return false;
268
-    }
269
-
270
-
271
-    /**
272
-     * setCurrentUsingObject
273
-     * advances pointer to the provided object
274
-     *
275
-     * @access public
276
-     * @param $object
277
-     * @return boolean
278
-     */
279
-    public function setCurrentUsingObject($object)
280
-    {
281
-        $this->rewind();
282
-        while ($this->valid()) {
283
-            if ($this->current() === $object) {
284
-                return true;
285
-            }
286
-            $this->next();
287
-        }
288
-        return false;
289
-    }
290
-
291
-
292
-    /**
293
-     * Returns the object occupying the index before the current object,
294
-     * unless this is already the first object, in which case it just returns the first object
295
-     *
296
-     * @return mixed
297
-     */
298
-    public function previous()
299
-    {
300
-        $index = $this->indexOf($this->current());
301
-        if ($index === 0) {
302
-            return $this->current();
303
-        }
304
-        $index--;
305
-        return $this->objectAtIndex($index);
306
-    }
307
-
308
-
309
-    /**
310
-     * Returns the index of a given object, or false if not found
311
-     *
312
-     * @see http://stackoverflow.com/a/8736013
313
-     * @param $object
314
-     * @return boolean|int|string
315
-     */
316
-    public function indexOf($object)
317
-    {
318
-        if (! $this->contains($object)) {
319
-            return false;
320
-        }
321
-        foreach ($this as $index => $obj) {
322
-            if ($obj === $object) {
323
-                return $index;
324
-            }
325
-        }
326
-        return false;
327
-    }
328
-
329
-
330
-    /**
331
-     * Returns the object at the given index
332
-     *
333
-     * @see http://stackoverflow.com/a/8736013
334
-     * @param int $index
335
-     * @return mixed
336
-     */
337
-    public function objectAtIndex($index)
338
-    {
339
-        $iterator = new LimitIterator($this, $index, 1);
340
-        $iterator->rewind();
341
-        return $iterator->current();
342
-    }
343
-
344
-
345
-    /**
346
-     * Returns the sequence of objects as specified by the offset and length
347
-     *
348
-     * @see http://stackoverflow.com/a/8736013
349
-     * @param int $offset
350
-     * @param int $length
351
-     * @return array
352
-     */
353
-    public function slice($offset, $length)
354
-    {
355
-        $slice = array();
356
-        $iterator = new LimitIterator($this, $offset, $length);
357
-        foreach ($iterator as $object) {
358
-            $slice[] = $object;
359
-        }
360
-        return $slice;
361
-    }
362
-
363
-
364
-    /**
365
-     * Inserts an object (or an array of objects) at a certain point
366
-     *
367
-     * @see http://stackoverflow.com/a/8736013
368
-     * @param mixed $objects A single object or an array of objects
369
-     * @param int   $index
370
-     */
371
-    public function insertAt($objects, $index)
372
-    {
373
-        if (! is_array($objects)) {
374
-            $objects = array($objects);
375
-        }
376
-        // check to ensure that objects don't already exist in the collection
377
-        foreach ($objects as $key => $object) {
378
-            if ($this->contains($object)) {
379
-                unset($objects[ $key ]);
380
-            }
381
-        }
382
-        // do we have any objects left?
383
-        if (! $objects) {
384
-            return;
385
-        }
386
-        // detach any objects at or past this index
387
-        $remaining = array();
388
-        if ($index < $this->count()) {
389
-            $remaining = $this->slice($index, $this->count() - $index);
390
-            foreach ($remaining as $object) {
391
-                $this->detach($object);
392
-            }
393
-        }
394
-        // add the new objects we're splicing in
395
-        foreach ($objects as $object) {
396
-            $this->attach($object);
397
-        }
398
-        // attach the objects we previously detached
399
-        foreach ($remaining as $object) {
400
-            $this->attach($object);
401
-        }
402
-    }
403
-
404
-
405
-    /**
406
-     * Removes the object at the given index
407
-     *
408
-     * @see http://stackoverflow.com/a/8736013
409
-     * @param int $index
410
-     */
411
-    public function removeAt($index)
412
-    {
413
-        $this->detach($this->objectAtIndex($index));
414
-    }
415
-
416
-
417
-    /**
418
-     * detaches ALL objects from the Collection
419
-     */
420
-    public function detachAll()
421
-    {
422
-        $this->rewind();
423
-        while ($this->valid()) {
424
-            $object = $this->current();
425
-            $this->next();
426
-            $this->detach($object);
427
-        }
428
-    }
429
-
430
-
431
-    /**
432
-     * unsets and detaches ALL objects from the Collection
433
-     */
434
-    public function trashAndDetachAll()
435
-    {
436
-        $this->rewind();
437
-        while ($this->valid()) {
438
-            $object = $this->current();
439
-            $this->next();
440
-            $this->detach($object);
441
-            unset($object);
442
-        }
443
-    }
22
+	/**
23
+	 * a unique string for identifying this collection
24
+	 *
25
+	 * @type string $collection_identifier
26
+	 */
27
+	protected $collection_identifier;
28
+
29
+
30
+	/**
31
+	 * an interface (or class) name to be used for restricting the type of objects added to the storage
32
+	 * this should be set from within the child class constructor
33
+	 *
34
+	 * @type string $interface
35
+	 */
36
+	protected $collection_interface;
37
+
38
+
39
+	/**
40
+	 * Collection constructor
41
+	 *
42
+	 * @param string $collection_interface
43
+	 * @throws InvalidInterfaceException
44
+	 */
45
+	public function __construct($collection_interface)
46
+	{
47
+		$this->setCollectionInterface($collection_interface);
48
+		$this->setCollectionIdentifier();
49
+	}
50
+
51
+
52
+	/**
53
+	 * @return string
54
+	 */
55
+	public function collectionIdentifier()
56
+	{
57
+		return $this->collection_identifier;
58
+	}
59
+
60
+
61
+	/**
62
+	 * creates a very readable unique 9 character identifier like:  CF2-532-DAC
63
+	 * and appends it to the non-qualified class name, ex: ThingCollection-CF2-532-DAC
64
+	 *
65
+	 * @return void
66
+	 */
67
+	protected function setCollectionIdentifier()
68
+	{
69
+		// hash a few collection details
70
+		$identifier = md5(spl_object_hash($this) . $this->collection_interface . time());
71
+		// grab a few characters from the start, middle, and end of the hash
72
+		$id = array();
73
+		for ($x = 0; $x < 19; $x += 9) {
74
+			$id[] = substr($identifier, $x, 3);
75
+		}
76
+		$identifier = basename(str_replace('\\', '/', get_class($this)));
77
+		$identifier .= '-' . strtoupper(implode('-', $id));
78
+		$this->collection_identifier = $identifier;
79
+	}
80
+
81
+
82
+	/**
83
+	 * setCollectionInterface
84
+	 *
85
+	 * @param  string $collection_interface
86
+	 * @throws InvalidInterfaceException
87
+	 */
88
+	protected function setCollectionInterface($collection_interface)
89
+	{
90
+		if (! (interface_exists($collection_interface) || class_exists($collection_interface))) {
91
+			throw new InvalidInterfaceException($collection_interface);
92
+		}
93
+		$this->collection_interface = $collection_interface;
94
+	}
95
+
96
+
97
+	/**
98
+	 * add
99
+	 * attaches an object to the Collection
100
+	 * and sets any supplied data associated with the current iterator entry
101
+	 * by calling EE_Object_Collection::set_identifier()
102
+	 *
103
+	 * @param        $object
104
+	 * @param  mixed $identifier
105
+	 * @return bool
106
+	 * @throws InvalidEntityException
107
+	 */
108
+	public function add($object, $identifier = null)
109
+	{
110
+		if (! $object instanceof $this->collection_interface) {
111
+			throw new InvalidEntityException($object, $this->collection_interface);
112
+		}
113
+		$this->attach($object);
114
+		$this->setIdentifier($object, $identifier);
115
+		return $this->contains($object);
116
+	}
117
+
118
+
119
+	/**
120
+	 * setIdentifier
121
+	 * Sets the data associated with an object in the Collection
122
+	 * if no $identifier is supplied, then the spl_object_hash() is used
123
+	 *
124
+	 * @access public
125
+	 * @param        $object
126
+	 * @param  mixed $identifier
127
+	 * @return bool
128
+	 */
129
+	public function setIdentifier($object, $identifier = null)
130
+	{
131
+		$identifier = ! empty($identifier)
132
+			? $identifier
133
+			: spl_object_hash($object);
134
+		$this->rewind();
135
+		while ($this->valid()) {
136
+			if ($object === $this->current()) {
137
+				$this->setInfo($identifier);
138
+				$this->rewind();
139
+				return true;
140
+			}
141
+			$this->next();
142
+		}
143
+		return false;
144
+	}
145
+
146
+
147
+	/**
148
+	 * get
149
+	 * finds and returns an object in the Collection based on the identifier that was set using addObject()
150
+	 * PLZ NOTE: the pointer is reset to the beginning of the collection before returning
151
+	 *
152
+	 * @access public
153
+	 * @param mixed $identifier
154
+	 * @return mixed
155
+	 */
156
+	public function get($identifier)
157
+	{
158
+		$this->rewind();
159
+		while ($this->valid()) {
160
+			if ($identifier === $this->getInfo()) {
161
+				$object = $this->current();
162
+				$this->rewind();
163
+				return $object;
164
+			}
165
+			$this->next();
166
+		}
167
+		return null;
168
+	}
169
+
170
+
171
+	/**
172
+	 * has
173
+	 * returns TRUE or FALSE
174
+	 * depending on whether the object is within the Collection
175
+	 * based on the supplied $identifier
176
+	 *
177
+	 * @access public
178
+	 * @param  mixed $identifier
179
+	 * @return bool
180
+	 */
181
+	public function has($identifier)
182
+	{
183
+		$this->rewind();
184
+		while ($this->valid()) {
185
+			if ($identifier === $this->getInfo()) {
186
+				$this->rewind();
187
+				return true;
188
+			}
189
+			$this->next();
190
+		}
191
+		return false;
192
+	}
193
+
194
+
195
+	/**
196
+	 * hasObject
197
+	 * returns TRUE or FALSE depending on whether the supplied object is within the Collection
198
+	 *
199
+	 * @access public
200
+	 * @param $object
201
+	 * @return bool
202
+	 */
203
+	public function hasObject($object)
204
+	{
205
+		return $this->contains($object);
206
+	}
207
+
208
+
209
+	/**
210
+	 * hasObjects
211
+	 * returns true if there are objects within the Collection, and false if it is empty
212
+	 *
213
+	 * @access public
214
+	 * @return bool
215
+	 */
216
+	public function hasObjects()
217
+	{
218
+		return $this->count() !== 0;
219
+	}
220
+
221
+
222
+	/**
223
+	 * isEmpty
224
+	 * returns true if there are no objects within the Collection, and false if there are
225
+	 *
226
+	 * @access public
227
+	 * @return bool
228
+	 */
229
+	public function isEmpty()
230
+	{
231
+		return $this->count() === 0;
232
+	}
233
+
234
+
235
+	/**
236
+	 * remove
237
+	 * detaches an object from the Collection
238
+	 *
239
+	 * @access public
240
+	 * @param $object
241
+	 * @return bool
242
+	 */
243
+	public function remove($object)
244
+	{
245
+		$this->detach($object);
246
+		return true;
247
+	}
248
+
249
+
250
+	/**
251
+	 * setCurrent
252
+	 * advances pointer to the object whose identifier matches that which was provided
253
+	 *
254
+	 * @access public
255
+	 * @param mixed $identifier
256
+	 * @return boolean
257
+	 */
258
+	public function setCurrent($identifier)
259
+	{
260
+		$this->rewind();
261
+		while ($this->valid()) {
262
+			if ($identifier === $this->getInfo()) {
263
+				return true;
264
+			}
265
+			$this->next();
266
+		}
267
+		return false;
268
+	}
269
+
270
+
271
+	/**
272
+	 * setCurrentUsingObject
273
+	 * advances pointer to the provided object
274
+	 *
275
+	 * @access public
276
+	 * @param $object
277
+	 * @return boolean
278
+	 */
279
+	public function setCurrentUsingObject($object)
280
+	{
281
+		$this->rewind();
282
+		while ($this->valid()) {
283
+			if ($this->current() === $object) {
284
+				return true;
285
+			}
286
+			$this->next();
287
+		}
288
+		return false;
289
+	}
290
+
291
+
292
+	/**
293
+	 * Returns the object occupying the index before the current object,
294
+	 * unless this is already the first object, in which case it just returns the first object
295
+	 *
296
+	 * @return mixed
297
+	 */
298
+	public function previous()
299
+	{
300
+		$index = $this->indexOf($this->current());
301
+		if ($index === 0) {
302
+			return $this->current();
303
+		}
304
+		$index--;
305
+		return $this->objectAtIndex($index);
306
+	}
307
+
308
+
309
+	/**
310
+	 * Returns the index of a given object, or false if not found
311
+	 *
312
+	 * @see http://stackoverflow.com/a/8736013
313
+	 * @param $object
314
+	 * @return boolean|int|string
315
+	 */
316
+	public function indexOf($object)
317
+	{
318
+		if (! $this->contains($object)) {
319
+			return false;
320
+		}
321
+		foreach ($this as $index => $obj) {
322
+			if ($obj === $object) {
323
+				return $index;
324
+			}
325
+		}
326
+		return false;
327
+	}
328
+
329
+
330
+	/**
331
+	 * Returns the object at the given index
332
+	 *
333
+	 * @see http://stackoverflow.com/a/8736013
334
+	 * @param int $index
335
+	 * @return mixed
336
+	 */
337
+	public function objectAtIndex($index)
338
+	{
339
+		$iterator = new LimitIterator($this, $index, 1);
340
+		$iterator->rewind();
341
+		return $iterator->current();
342
+	}
343
+
344
+
345
+	/**
346
+	 * Returns the sequence of objects as specified by the offset and length
347
+	 *
348
+	 * @see http://stackoverflow.com/a/8736013
349
+	 * @param int $offset
350
+	 * @param int $length
351
+	 * @return array
352
+	 */
353
+	public function slice($offset, $length)
354
+	{
355
+		$slice = array();
356
+		$iterator = new LimitIterator($this, $offset, $length);
357
+		foreach ($iterator as $object) {
358
+			$slice[] = $object;
359
+		}
360
+		return $slice;
361
+	}
362
+
363
+
364
+	/**
365
+	 * Inserts an object (or an array of objects) at a certain point
366
+	 *
367
+	 * @see http://stackoverflow.com/a/8736013
368
+	 * @param mixed $objects A single object or an array of objects
369
+	 * @param int   $index
370
+	 */
371
+	public function insertAt($objects, $index)
372
+	{
373
+		if (! is_array($objects)) {
374
+			$objects = array($objects);
375
+		}
376
+		// check to ensure that objects don't already exist in the collection
377
+		foreach ($objects as $key => $object) {
378
+			if ($this->contains($object)) {
379
+				unset($objects[ $key ]);
380
+			}
381
+		}
382
+		// do we have any objects left?
383
+		if (! $objects) {
384
+			return;
385
+		}
386
+		// detach any objects at or past this index
387
+		$remaining = array();
388
+		if ($index < $this->count()) {
389
+			$remaining = $this->slice($index, $this->count() - $index);
390
+			foreach ($remaining as $object) {
391
+				$this->detach($object);
392
+			}
393
+		}
394
+		// add the new objects we're splicing in
395
+		foreach ($objects as $object) {
396
+			$this->attach($object);
397
+		}
398
+		// attach the objects we previously detached
399
+		foreach ($remaining as $object) {
400
+			$this->attach($object);
401
+		}
402
+	}
403
+
404
+
405
+	/**
406
+	 * Removes the object at the given index
407
+	 *
408
+	 * @see http://stackoverflow.com/a/8736013
409
+	 * @param int $index
410
+	 */
411
+	public function removeAt($index)
412
+	{
413
+		$this->detach($this->objectAtIndex($index));
414
+	}
415
+
416
+
417
+	/**
418
+	 * detaches ALL objects from the Collection
419
+	 */
420
+	public function detachAll()
421
+	{
422
+		$this->rewind();
423
+		while ($this->valid()) {
424
+			$object = $this->current();
425
+			$this->next();
426
+			$this->detach($object);
427
+		}
428
+	}
429
+
430
+
431
+	/**
432
+	 * unsets and detaches ALL objects from the Collection
433
+	 */
434
+	public function trashAndDetachAll()
435
+	{
436
+		$this->rewind();
437
+		while ($this->valid()) {
438
+			$object = $this->current();
439
+			$this->next();
440
+			$this->detach($object);
441
+			unset($object);
442
+		}
443
+	}
444 444
 }
Please login to merge, or discard this patch.
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -67,14 +67,14 @@  discard block
 block discarded – undo
67 67
     protected function setCollectionIdentifier()
68 68
     {
69 69
         // hash a few collection details
70
-        $identifier = md5(spl_object_hash($this) . $this->collection_interface . time());
70
+        $identifier = md5(spl_object_hash($this).$this->collection_interface.time());
71 71
         // grab a few characters from the start, middle, and end of the hash
72 72
         $id = array();
73 73
         for ($x = 0; $x < 19; $x += 9) {
74 74
             $id[] = substr($identifier, $x, 3);
75 75
         }
76 76
         $identifier = basename(str_replace('\\', '/', get_class($this)));
77
-        $identifier .= '-' . strtoupper(implode('-', $id));
77
+        $identifier .= '-'.strtoupper(implode('-', $id));
78 78
         $this->collection_identifier = $identifier;
79 79
     }
80 80
 
@@ -87,7 +87,7 @@  discard block
 block discarded – undo
87 87
      */
88 88
     protected function setCollectionInterface($collection_interface)
89 89
     {
90
-        if (! (interface_exists($collection_interface) || class_exists($collection_interface))) {
90
+        if ( ! (interface_exists($collection_interface) || class_exists($collection_interface))) {
91 91
             throw new InvalidInterfaceException($collection_interface);
92 92
         }
93 93
         $this->collection_interface = $collection_interface;
@@ -107,7 +107,7 @@  discard block
 block discarded – undo
107 107
      */
108 108
     public function add($object, $identifier = null)
109 109
     {
110
-        if (! $object instanceof $this->collection_interface) {
110
+        if ( ! $object instanceof $this->collection_interface) {
111 111
             throw new InvalidEntityException($object, $this->collection_interface);
112 112
         }
113 113
         $this->attach($object);
@@ -315,7 +315,7 @@  discard block
 block discarded – undo
315 315
      */
316 316
     public function indexOf($object)
317 317
     {
318
-        if (! $this->contains($object)) {
318
+        if ( ! $this->contains($object)) {
319 319
             return false;
320 320
         }
321 321
         foreach ($this as $index => $obj) {
@@ -370,17 +370,17 @@  discard block
 block discarded – undo
370 370
      */
371 371
     public function insertAt($objects, $index)
372 372
     {
373
-        if (! is_array($objects)) {
373
+        if ( ! is_array($objects)) {
374 374
             $objects = array($objects);
375 375
         }
376 376
         // check to ensure that objects don't already exist in the collection
377 377
         foreach ($objects as $key => $object) {
378 378
             if ($this->contains($object)) {
379
-                unset($objects[ $key ]);
379
+                unset($objects[$key]);
380 380
             }
381 381
         }
382 382
         // do we have any objects left?
383
-        if (! $objects) {
383
+        if ( ! $objects) {
384 384
             return;
385 385
         }
386 386
         // detach any objects at or past this index
Please login to merge, or discard this patch.
core/domain/entities/editor/EditorBlock.php 2 patches
Indentation   +242 added lines, -242 removed lines patch added patch discarded remove patch
@@ -23,246 +23,246 @@
 block discarded – undo
23 23
 abstract class EditorBlock implements EditorBlockInterface
24 24
 {
25 25
 
26
-    const NS = 'event-espresso/';
27
-
28
-    /**
29
-     * @var DomainInterface $domain
30
-     */
31
-    protected $domain;
32
-
33
-    /**
34
-     * @var LoaderInterface $loader
35
-     */
36
-    protected $loader;
37
-
38
-
39
-    /**
40
-     * @var Registry
41
-     */
42
-    protected $assets_registry;
43
-
44
-    /**
45
-     * @var string $editor_block_type
46
-     */
47
-    private $editor_block_type;
48
-
49
-    /**
50
-     * @var WP_Block_Type $wp_block_type
51
-     */
52
-    private $wp_block_type;
53
-
54
-    /**
55
-     * @var array $supported_post_types
56
-     */
57
-    private $supported_post_types;
58
-
59
-    /**
60
-     * @var array $attributes
61
-     */
62
-    private $attributes;
63
-
64
-    /**
65
-     * If set to true, then the block will render its content client side
66
-     * If false, then the block will render its content server side using the renderBlock() method
67
-     *
68
-     * @var bool $dynamic
69
-     */
70
-    private $dynamic = false;
71
-
72
-
73
-    /**
74
-     * EditorBlockLoader constructor.
75
-     *
76
-     * @param DomainInterface $domain
77
-     * @param LoaderInterface $loader
78
-     * @param Registry        $assets_registry
79
-     */
80
-    public function __construct(
81
-        DomainInterface $domain,
82
-        LoaderInterface $loader,
83
-        Registry $assets_registry
84
-    ) {
85
-        $this->domain = $domain;
86
-        $this->loader = $loader;
87
-        $this->assets_registry = $assets_registry;
88
-    }
89
-
90
-
91
-    /**
92
-     * @return string
93
-     */
94
-    public function editorBlockType()
95
-    {
96
-        return $this->editor_block_type;
97
-    }
98
-
99
-
100
-    /**
101
-     * @return string
102
-     */
103
-    public function namespacedEditorBlockType()
104
-    {
105
-        return EditorBlock::NS . $this->editor_block_type;
106
-    }
107
-
108
-
109
-    /**
110
-     * @param string $editor_block_type
111
-     */
112
-    protected function setEditorBlockType($editor_block_type)
113
-    {
114
-        $this->editor_block_type = $editor_block_type;
115
-    }
116
-
117
-
118
-    /**
119
-     * @param WP_Block_Type $wp_block_type
120
-     */
121
-    protected function setWpBlockType($wp_block_type)
122
-    {
123
-        $this->wp_block_type = $wp_block_type;
124
-    }
125
-
126
-
127
-    /**
128
-     * @param array $supported_post_types
129
-     */
130
-    protected function setSupportedPostTypes(array $supported_post_types)
131
-    {
132
-        $this->supported_post_types = $supported_post_types;
133
-    }
134
-
135
-
136
-    /**
137
-     * @return array
138
-     */
139
-    public function attributes()
140
-    {
141
-        return $this->attributes;
142
-    }
143
-
144
-
145
-    /**
146
-     * @param array $attributes
147
-     */
148
-    public function setAttributes(array $attributes)
149
-    {
150
-        $this->attributes = $attributes;
151
-    }
152
-
153
-
154
-    /**
155
-     * @return bool
156
-     */
157
-    public function isDynamic()
158
-    {
159
-        return $this->dynamic;
160
-    }
161
-
162
-
163
-    /**
164
-     * @param bool $dynamic
165
-     */
166
-    public function setDynamic($dynamic = true)
167
-    {
168
-        $this->dynamic = filter_var($dynamic, FILTER_VALIDATE_BOOLEAN);
169
-    }
170
-
171
-
172
-    /**
173
-     * Registers the Editor Block with WP core;
174
-     * Returns the registered block type on success, or false on failure.
175
-     *
176
-     * @return WP_Block_Type|false
177
-     */
178
-    public function registerBlock()
179
-    {
180
-        $context ='core';
181
-        // todo add route detection (ie inject route) and change context based on route
182
-        $args          = array(
183
-            'attributes'      => $this->attributes(),
184
-            'editor_script'   => "ee-{$context}-blocks",
185
-            'editor_style'    => "ee-{$context}-blocks",
186
-            'script'          => "ee-{$context}-blocks",
187
-            'style'           => "ee-{$context}-blocks",
188
-        );
189
-        if (! $this->isDynamic()) {
190
-            $args['render_callback'] = $this->renderBlock();
191
-        }
192
-        $wp_block_type = register_block_type(
193
-            new WP_Block_Type(
194
-                $this->namespacedEditorBlockType(),
195
-                $args
196
-            )
197
-        );
198
-        $this->setWpBlockType($wp_block_type);
199
-        return $wp_block_type;
200
-    }
201
-
202
-
203
-    /**
204
-     * @return WP_Block_Type|false The registered block type on success, or false on failure.
205
-     */
206
-    public function unRegisterBlock()
207
-    {
208
-        return unregister_block_type($this->namespacedEditorBlockType());
209
-    }
210
-
211
-
212
-    /**
213
-     * returns true if the block type applies for the supplied post type
214
-     * and should be added to that post type's editor
215
-     *
216
-     * @param string $post_type
217
-     * @return boolean
218
-     */
219
-    public function appliesToPostType($post_type)
220
-    {
221
-        return in_array($post_type, $this->supported_post_types, true);
222
-    }
223
-
224
-
225
-    /**
226
-     * @return array
227
-     */
228
-    public function getEditorContainer()
229
-    {
230
-        return array(
231
-            $this->namespacedEditorBlockType(),
232
-            array()
233
-        );
234
-    }
235
-
236
-
237
-    /**
238
-     * @return  void
239
-     */
240
-    public function registerScripts()
241
-    {
242
-        // wp_register_script(
243
-        //     'core-blocks',
244
-        //     $this->domain->distributionAssetsUrl() . 'ee-core-blocks.dist.js',
245
-        //     array(
246
-        //         'wp-blocks',    // Provides useful functions and components for extending the editor
247
-        //         'wp-i18n',      // Provides localization functions
248
-        //         'wp-element',   // Provides React.Component
249
-        //         'wp-components' // Provides many prebuilt components and controls
250
-        //     ),
251
-        //     filemtime($this->domain->distributionAssetsPath() . 'ee-core-blocks.dist.js')
252
-        // );
253
-    }
254
-
255
-
256
-    /**
257
-     * @return void
258
-     */
259
-    public function registerStyles()
260
-    {
261
-        // wp_register_style(
262
-        //     'ee-block-styles',
263
-        //     $this->domain->distributionAssetsUrl() . 'style.css',
264
-        //     array(),
265
-        //     filemtime($this->domain->distributionAssetsPath() . 'style.css')
266
-        // );
267
-    }
26
+	const NS = 'event-espresso/';
27
+
28
+	/**
29
+	 * @var DomainInterface $domain
30
+	 */
31
+	protected $domain;
32
+
33
+	/**
34
+	 * @var LoaderInterface $loader
35
+	 */
36
+	protected $loader;
37
+
38
+
39
+	/**
40
+	 * @var Registry
41
+	 */
42
+	protected $assets_registry;
43
+
44
+	/**
45
+	 * @var string $editor_block_type
46
+	 */
47
+	private $editor_block_type;
48
+
49
+	/**
50
+	 * @var WP_Block_Type $wp_block_type
51
+	 */
52
+	private $wp_block_type;
53
+
54
+	/**
55
+	 * @var array $supported_post_types
56
+	 */
57
+	private $supported_post_types;
58
+
59
+	/**
60
+	 * @var array $attributes
61
+	 */
62
+	private $attributes;
63
+
64
+	/**
65
+	 * If set to true, then the block will render its content client side
66
+	 * If false, then the block will render its content server side using the renderBlock() method
67
+	 *
68
+	 * @var bool $dynamic
69
+	 */
70
+	private $dynamic = false;
71
+
72
+
73
+	/**
74
+	 * EditorBlockLoader constructor.
75
+	 *
76
+	 * @param DomainInterface $domain
77
+	 * @param LoaderInterface $loader
78
+	 * @param Registry        $assets_registry
79
+	 */
80
+	public function __construct(
81
+		DomainInterface $domain,
82
+		LoaderInterface $loader,
83
+		Registry $assets_registry
84
+	) {
85
+		$this->domain = $domain;
86
+		$this->loader = $loader;
87
+		$this->assets_registry = $assets_registry;
88
+	}
89
+
90
+
91
+	/**
92
+	 * @return string
93
+	 */
94
+	public function editorBlockType()
95
+	{
96
+		return $this->editor_block_type;
97
+	}
98
+
99
+
100
+	/**
101
+	 * @return string
102
+	 */
103
+	public function namespacedEditorBlockType()
104
+	{
105
+		return EditorBlock::NS . $this->editor_block_type;
106
+	}
107
+
108
+
109
+	/**
110
+	 * @param string $editor_block_type
111
+	 */
112
+	protected function setEditorBlockType($editor_block_type)
113
+	{
114
+		$this->editor_block_type = $editor_block_type;
115
+	}
116
+
117
+
118
+	/**
119
+	 * @param WP_Block_Type $wp_block_type
120
+	 */
121
+	protected function setWpBlockType($wp_block_type)
122
+	{
123
+		$this->wp_block_type = $wp_block_type;
124
+	}
125
+
126
+
127
+	/**
128
+	 * @param array $supported_post_types
129
+	 */
130
+	protected function setSupportedPostTypes(array $supported_post_types)
131
+	{
132
+		$this->supported_post_types = $supported_post_types;
133
+	}
134
+
135
+
136
+	/**
137
+	 * @return array
138
+	 */
139
+	public function attributes()
140
+	{
141
+		return $this->attributes;
142
+	}
143
+
144
+
145
+	/**
146
+	 * @param array $attributes
147
+	 */
148
+	public function setAttributes(array $attributes)
149
+	{
150
+		$this->attributes = $attributes;
151
+	}
152
+
153
+
154
+	/**
155
+	 * @return bool
156
+	 */
157
+	public function isDynamic()
158
+	{
159
+		return $this->dynamic;
160
+	}
161
+
162
+
163
+	/**
164
+	 * @param bool $dynamic
165
+	 */
166
+	public function setDynamic($dynamic = true)
167
+	{
168
+		$this->dynamic = filter_var($dynamic, FILTER_VALIDATE_BOOLEAN);
169
+	}
170
+
171
+
172
+	/**
173
+	 * Registers the Editor Block with WP core;
174
+	 * Returns the registered block type on success, or false on failure.
175
+	 *
176
+	 * @return WP_Block_Type|false
177
+	 */
178
+	public function registerBlock()
179
+	{
180
+		$context ='core';
181
+		// todo add route detection (ie inject route) and change context based on route
182
+		$args          = array(
183
+			'attributes'      => $this->attributes(),
184
+			'editor_script'   => "ee-{$context}-blocks",
185
+			'editor_style'    => "ee-{$context}-blocks",
186
+			'script'          => "ee-{$context}-blocks",
187
+			'style'           => "ee-{$context}-blocks",
188
+		);
189
+		if (! $this->isDynamic()) {
190
+			$args['render_callback'] = $this->renderBlock();
191
+		}
192
+		$wp_block_type = register_block_type(
193
+			new WP_Block_Type(
194
+				$this->namespacedEditorBlockType(),
195
+				$args
196
+			)
197
+		);
198
+		$this->setWpBlockType($wp_block_type);
199
+		return $wp_block_type;
200
+	}
201
+
202
+
203
+	/**
204
+	 * @return WP_Block_Type|false The registered block type on success, or false on failure.
205
+	 */
206
+	public function unRegisterBlock()
207
+	{
208
+		return unregister_block_type($this->namespacedEditorBlockType());
209
+	}
210
+
211
+
212
+	/**
213
+	 * returns true if the block type applies for the supplied post type
214
+	 * and should be added to that post type's editor
215
+	 *
216
+	 * @param string $post_type
217
+	 * @return boolean
218
+	 */
219
+	public function appliesToPostType($post_type)
220
+	{
221
+		return in_array($post_type, $this->supported_post_types, true);
222
+	}
223
+
224
+
225
+	/**
226
+	 * @return array
227
+	 */
228
+	public function getEditorContainer()
229
+	{
230
+		return array(
231
+			$this->namespacedEditorBlockType(),
232
+			array()
233
+		);
234
+	}
235
+
236
+
237
+	/**
238
+	 * @return  void
239
+	 */
240
+	public function registerScripts()
241
+	{
242
+		// wp_register_script(
243
+		//     'core-blocks',
244
+		//     $this->domain->distributionAssetsUrl() . 'ee-core-blocks.dist.js',
245
+		//     array(
246
+		//         'wp-blocks',    // Provides useful functions and components for extending the editor
247
+		//         'wp-i18n',      // Provides localization functions
248
+		//         'wp-element',   // Provides React.Component
249
+		//         'wp-components' // Provides many prebuilt components and controls
250
+		//     ),
251
+		//     filemtime($this->domain->distributionAssetsPath() . 'ee-core-blocks.dist.js')
252
+		// );
253
+	}
254
+
255
+
256
+	/**
257
+	 * @return void
258
+	 */
259
+	public function registerStyles()
260
+	{
261
+		// wp_register_style(
262
+		//     'ee-block-styles',
263
+		//     $this->domain->distributionAssetsUrl() . 'style.css',
264
+		//     array(),
265
+		//     filemtime($this->domain->distributionAssetsPath() . 'style.css')
266
+		// );
267
+	}
268 268
 }
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -102,7 +102,7 @@  discard block
 block discarded – undo
102 102
      */
103 103
     public function namespacedEditorBlockType()
104 104
     {
105
-        return EditorBlock::NS . $this->editor_block_type;
105
+        return EditorBlock::NS.$this->editor_block_type;
106 106
     }
107 107
 
108 108
 
@@ -177,16 +177,16 @@  discard block
 block discarded – undo
177 177
      */
178 178
     public function registerBlock()
179 179
     {
180
-        $context ='core';
180
+        $context = 'core';
181 181
         // todo add route detection (ie inject route) and change context based on route
182
-        $args          = array(
182
+        $args = array(
183 183
             'attributes'      => $this->attributes(),
184 184
             'editor_script'   => "ee-{$context}-blocks",
185 185
             'editor_style'    => "ee-{$context}-blocks",
186 186
             'script'          => "ee-{$context}-blocks",
187 187
             'style'           => "ee-{$context}-blocks",
188 188
         );
189
-        if (! $this->isDynamic()) {
189
+        if ( ! $this->isDynamic()) {
190 190
             $args['render_callback'] = $this->renderBlock();
191 191
         }
192 192
         $wp_block_type = register_block_type(
Please login to merge, or discard this patch.
core/services/editor/EditorBlockManager.php 1 patch
Indentation   +90 added lines, -90 removed lines patch added patch discarded remove patch
@@ -20,94 +20,94 @@
 block discarded – undo
20 20
 abstract class EditorBlockManager
21 21
 {
22 22
 
23
-    /**
24
-     * @var CollectionInterface|EditorBlockInterface[] $blocks
25
-     */
26
-    protected $blocks;
27
-
28
-    /**
29
-     * @var RequestInterface $request
30
-     */
31
-    protected $request;
32
-
33
-    /**
34
-     * @var DomainInterface $domain
35
-     */
36
-    protected $domain;
37
-
38
-    /**
39
-     * the post type that the current request applies to
40
-     *
41
-     * @var string $request_post_type
42
-     */
43
-    protected $request_post_type;
44
-
45
-    /**
46
-     * value of the 'page' $_GET param
47
-     *
48
-     * @var string $page
49
-     */
50
-    protected $page;
51
-
52
-    /**
53
-     * value of the 'action' $_GET param
54
-     *
55
-     * @var string $action
56
-     */
57
-    protected $action;
58
-
59
-
60
-    /**
61
-     * @var Registry
62
-     */
63
-    protected $assets_registry;
64
-
65
-    /**
66
-     * EditorBlockManager constructor.
67
-     *
68
-     * @param EditorBlockCollection $blocks
69
-     * @param RequestInterface      $request
70
-     * @param DomainInterface       $domain
71
-     * @param Registry              $assets_registry
72
-     */
73
-    public function __construct(
74
-        EditorBlockCollection $blocks,
75
-        RequestInterface $request,
76
-        DomainInterface $domain,
77
-        Registry $assets_registry
78
-    ) {
79
-        $this->blocks  = $blocks;
80
-        $this->request = $request;
81
-        $this->domain  = $domain;
82
-        $this->assets_registry = $assets_registry;
83
-        $this->request_post_type = $this->request->getRequestParam('post_type', '');
84
-        $this->page = $this->request->getRequestParam('page', '');
85
-        $this->action = $this->request->getRequestParam('action', '');
86
-        add_action($this->init_hook(), array($this, 'initialize'));
87
-    }
88
-
89
-
90
-    /**
91
-     *  Returns the name of a hookpoint to be used to call initialize()
92
-     *
93
-     * @return string
94
-     */
95
-    abstract public function initHook();
96
-
97
-
98
-    /**
99
-     * Perform any early setup required for block editors to functions
100
-     *
101
-     * @return void
102
-     */
103
-    abstract public function initialize();
104
-
105
-
106
-    /**
107
-     * @return string
108
-     */
109
-    public function currentRequestPostType()
110
-    {
111
-        return $this->request_post_type;
112
-    }
23
+	/**
24
+	 * @var CollectionInterface|EditorBlockInterface[] $blocks
25
+	 */
26
+	protected $blocks;
27
+
28
+	/**
29
+	 * @var RequestInterface $request
30
+	 */
31
+	protected $request;
32
+
33
+	/**
34
+	 * @var DomainInterface $domain
35
+	 */
36
+	protected $domain;
37
+
38
+	/**
39
+	 * the post type that the current request applies to
40
+	 *
41
+	 * @var string $request_post_type
42
+	 */
43
+	protected $request_post_type;
44
+
45
+	/**
46
+	 * value of the 'page' $_GET param
47
+	 *
48
+	 * @var string $page
49
+	 */
50
+	protected $page;
51
+
52
+	/**
53
+	 * value of the 'action' $_GET param
54
+	 *
55
+	 * @var string $action
56
+	 */
57
+	protected $action;
58
+
59
+
60
+	/**
61
+	 * @var Registry
62
+	 */
63
+	protected $assets_registry;
64
+
65
+	/**
66
+	 * EditorBlockManager constructor.
67
+	 *
68
+	 * @param EditorBlockCollection $blocks
69
+	 * @param RequestInterface      $request
70
+	 * @param DomainInterface       $domain
71
+	 * @param Registry              $assets_registry
72
+	 */
73
+	public function __construct(
74
+		EditorBlockCollection $blocks,
75
+		RequestInterface $request,
76
+		DomainInterface $domain,
77
+		Registry $assets_registry
78
+	) {
79
+		$this->blocks  = $blocks;
80
+		$this->request = $request;
81
+		$this->domain  = $domain;
82
+		$this->assets_registry = $assets_registry;
83
+		$this->request_post_type = $this->request->getRequestParam('post_type', '');
84
+		$this->page = $this->request->getRequestParam('page', '');
85
+		$this->action = $this->request->getRequestParam('action', '');
86
+		add_action($this->init_hook(), array($this, 'initialize'));
87
+	}
88
+
89
+
90
+	/**
91
+	 *  Returns the name of a hookpoint to be used to call initialize()
92
+	 *
93
+	 * @return string
94
+	 */
95
+	abstract public function initHook();
96
+
97
+
98
+	/**
99
+	 * Perform any early setup required for block editors to functions
100
+	 *
101
+	 * @return void
102
+	 */
103
+	abstract public function initialize();
104
+
105
+
106
+	/**
107
+	 * @return string
108
+	 */
109
+	public function currentRequestPostType()
110
+	{
111
+		return $this->request_post_type;
112
+	}
113 113
 }
Please login to merge, or discard this patch.
core/EE_Dependency_Map.core.php 1 patch
Indentation   +947 added lines, -947 removed lines patch added patch discarded remove patch
@@ -20,951 +20,951 @@
 block discarded – undo
20 20
 class EE_Dependency_Map
21 21
 {
22 22
 
23
-    /**
24
-     * This means that the requested class dependency is not present in the dependency map
25
-     */
26
-    const not_registered = 0;
27
-
28
-    /**
29
-     * This instructs class loaders to ALWAYS return a newly instantiated object for the requested class.
30
-     */
31
-    const load_new_object = 1;
32
-
33
-    /**
34
-     * This instructs class loaders to return a previously instantiated and cached object for the requested class.
35
-     * IF a previously instantiated object does not exist, a new one will be created and added to the cache.
36
-     */
37
-    const load_from_cache = 2;
38
-
39
-    /**
40
-     * When registering a dependency,
41
-     * this indicates to keep any existing dependencies that already exist,
42
-     * and simply discard any new dependencies declared in the incoming data
43
-     */
44
-    const KEEP_EXISTING_DEPENDENCIES = 0;
45
-
46
-    /**
47
-     * When registering a dependency,
48
-     * this indicates to overwrite any existing dependencies that already exist using the incoming data
49
-     */
50
-    const OVERWRITE_DEPENDENCIES = 1;
51
-
52
-
53
-    /**
54
-     * @type EE_Dependency_Map $_instance
55
-     */
56
-    protected static $_instance;
57
-
58
-    /**
59
-     * @var ClassInterfaceCache $class_cache
60
-     */
61
-    private $class_cache;
62
-
63
-    /**
64
-     * @type RequestInterface $request
65
-     */
66
-    protected $request;
67
-
68
-    /**
69
-     * @type LegacyRequestInterface $legacy_request
70
-     */
71
-    protected $legacy_request;
72
-
73
-    /**
74
-     * @type ResponseInterface $response
75
-     */
76
-    protected $response;
77
-
78
-    /**
79
-     * @type LoaderInterface $loader
80
-     */
81
-    protected $loader;
82
-
83
-    /**
84
-     * @type array $_dependency_map
85
-     */
86
-    protected $_dependency_map = array();
87
-
88
-    /**
89
-     * @type array $_class_loaders
90
-     */
91
-    protected $_class_loaders = array();
92
-
93
-
94
-    /**
95
-     * EE_Dependency_Map constructor.
96
-     *
97
-     * @param ClassInterfaceCache $class_cache
98
-     */
99
-    protected function __construct(ClassInterfaceCache $class_cache)
100
-    {
101
-        $this->class_cache = $class_cache;
102
-        do_action('EE_Dependency_Map____construct', $this);
103
-    }
104
-
105
-
106
-    /**
107
-     * @return void
108
-     */
109
-    public function initialize()
110
-    {
111
-        $this->_register_core_dependencies();
112
-        $this->_register_core_class_loaders();
113
-        $this->_register_core_aliases();
114
-    }
115
-
116
-
117
-    /**
118
-     * @singleton method used to instantiate class object
119
-     * @param ClassInterfaceCache|null $class_cache
120
-     * @return EE_Dependency_Map
121
-     */
122
-    public static function instance(ClassInterfaceCache $class_cache = null)
123
-    {
124
-        // check if class object is instantiated, and instantiated properly
125
-        if (! self::$_instance instanceof EE_Dependency_Map
126
-            && $class_cache instanceof ClassInterfaceCache
127
-        ) {
128
-            self::$_instance = new EE_Dependency_Map($class_cache);
129
-        }
130
-        return self::$_instance;
131
-    }
132
-
133
-
134
-    /**
135
-     * @param RequestInterface $request
136
-     */
137
-    public function setRequest(RequestInterface $request)
138
-    {
139
-        $this->request = $request;
140
-    }
141
-
142
-
143
-    /**
144
-     * @param LegacyRequestInterface $legacy_request
145
-     */
146
-    public function setLegacyRequest(LegacyRequestInterface $legacy_request)
147
-    {
148
-        $this->legacy_request = $legacy_request;
149
-    }
150
-
151
-
152
-    /**
153
-     * @param ResponseInterface $response
154
-     */
155
-    public function setResponse(ResponseInterface $response)
156
-    {
157
-        $this->response = $response;
158
-    }
159
-
160
-
161
-    /**
162
-     * @param LoaderInterface $loader
163
-     */
164
-    public function setLoader(LoaderInterface $loader)
165
-    {
166
-        $this->loader = $loader;
167
-    }
168
-
169
-
170
-    /**
171
-     * @param string $class
172
-     * @param array  $dependencies
173
-     * @param int    $overwrite
174
-     * @return bool
175
-     */
176
-    public static function register_dependencies(
177
-        $class,
178
-        array $dependencies,
179
-        $overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
180
-    ) {
181
-        return self::$_instance->registerDependencies($class, $dependencies, $overwrite);
182
-    }
183
-
184
-
185
-    /**
186
-     * Assigns an array of class names and corresponding load sources (new or cached)
187
-     * to the class specified by the first parameter.
188
-     * IMPORTANT !!!
189
-     * The order of elements in the incoming $dependencies array MUST match
190
-     * the order of the constructor parameters for the class in question.
191
-     * This is especially important when overriding any existing dependencies that are registered.
192
-     * the third parameter controls whether any duplicate dependencies are overwritten or not.
193
-     *
194
-     * @param string $class
195
-     * @param array  $dependencies
196
-     * @param int    $overwrite
197
-     * @return bool
198
-     */
199
-    public function registerDependencies(
200
-        $class,
201
-        array $dependencies,
202
-        $overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
203
-    ) {
204
-        $class = trim($class, '\\');
205
-        $registered = false;
206
-        if (empty(self::$_instance->_dependency_map[ $class ])) {
207
-            self::$_instance->_dependency_map[ $class ] = array();
208
-        }
209
-        // we need to make sure that any aliases used when registering a dependency
210
-        // get resolved to the correct class name
211
-        foreach ($dependencies as $dependency => $load_source) {
212
-            $alias = self::$_instance->getFqnForAlias($dependency);
213
-            if ($overwrite === EE_Dependency_Map::OVERWRITE_DEPENDENCIES
214
-                || ! isset(self::$_instance->_dependency_map[ $class ][ $alias ])
215
-            ) {
216
-                unset($dependencies[ $dependency ]);
217
-                $dependencies[ $alias ] = $load_source;
218
-                $registered = true;
219
-            }
220
-        }
221
-        // now add our two lists of dependencies together.
222
-        // using Union (+=) favours the arrays in precedence from left to right,
223
-        // so $dependencies is NOT overwritten because it is listed first
224
-        // ie: with A = B + C, entries in B take precedence over duplicate entries in C
225
-        // Union is way faster than array_merge() but should be used with caution...
226
-        // especially with numerically indexed arrays
227
-        $dependencies += self::$_instance->_dependency_map[ $class ];
228
-        // now we need to ensure that the resulting dependencies
229
-        // array only has the entries that are required for the class
230
-        // so first count how many dependencies were originally registered for the class
231
-        $dependency_count = count(self::$_instance->_dependency_map[ $class ]);
232
-        // if that count is non-zero (meaning dependencies were already registered)
233
-        self::$_instance->_dependency_map[ $class ] = $dependency_count
234
-            // then truncate the  final array to match that count
235
-            ? array_slice($dependencies, 0, $dependency_count)
236
-            // otherwise just take the incoming array because nothing previously existed
237
-            : $dependencies;
238
-        return $registered;
239
-    }
240
-
241
-
242
-    /**
243
-     * @param string $class_name
244
-     * @param string $loader
245
-     * @return bool
246
-     * @throws DomainException
247
-     */
248
-    public static function register_class_loader($class_name, $loader = 'load_core')
249
-    {
250
-        if (! $loader instanceof Closure && strpos($class_name, '\\') !== false) {
251
-            throw new DomainException(
252
-                esc_html__('Don\'t use class loaders for FQCNs.', 'event_espresso')
253
-            );
254
-        }
255
-        // check that loader is callable or method starts with "load_" and exists in EE_Registry
256
-        if (! is_callable($loader)
257
-            && (
258
-                strpos($loader, 'load_') !== 0
259
-                || ! method_exists('EE_Registry', $loader)
260
-            )
261
-        ) {
262
-            throw new DomainException(
263
-                sprintf(
264
-                    esc_html__(
265
-                        '"%1$s" is not a valid loader method on EE_Registry.',
266
-                        'event_espresso'
267
-                    ),
268
-                    $loader
269
-                )
270
-            );
271
-        }
272
-        $class_name = self::$_instance->getFqnForAlias($class_name);
273
-        if (! isset(self::$_instance->_class_loaders[ $class_name ])) {
274
-            self::$_instance->_class_loaders[ $class_name ] = $loader;
275
-            return true;
276
-        }
277
-        return false;
278
-    }
279
-
280
-
281
-    /**
282
-     * @return array
283
-     */
284
-    public function dependency_map()
285
-    {
286
-        return $this->_dependency_map;
287
-    }
288
-
289
-
290
-    /**
291
-     * returns TRUE if dependency map contains a listing for the provided class name
292
-     *
293
-     * @param string $class_name
294
-     * @return boolean
295
-     */
296
-    public function has($class_name = '')
297
-    {
298
-        // all legacy models have the same dependencies
299
-        if (strpos($class_name, 'EEM_') === 0) {
300
-            $class_name = 'LEGACY_MODELS';
301
-        }
302
-        return isset($this->_dependency_map[ $class_name ]) ? true : false;
303
-    }
304
-
305
-
306
-    /**
307
-     * returns TRUE if dependency map contains a listing for the provided class name AND dependency
308
-     *
309
-     * @param string $class_name
310
-     * @param string $dependency
311
-     * @return bool
312
-     */
313
-    public function has_dependency_for_class($class_name = '', $dependency = '')
314
-    {
315
-        // all legacy models have the same dependencies
316
-        if (strpos($class_name, 'EEM_') === 0) {
317
-            $class_name = 'LEGACY_MODELS';
318
-        }
319
-        $dependency = $this->getFqnForAlias($dependency, $class_name);
320
-        return isset($this->_dependency_map[ $class_name ][ $dependency ])
321
-            ? true
322
-            : false;
323
-    }
324
-
325
-
326
-    /**
327
-     * returns loading strategy for whether a previously cached dependency should be loaded or a new instance returned
328
-     *
329
-     * @param string $class_name
330
-     * @param string $dependency
331
-     * @return int
332
-     */
333
-    public function loading_strategy_for_class_dependency($class_name = '', $dependency = '')
334
-    {
335
-        // all legacy models have the same dependencies
336
-        if (strpos($class_name, 'EEM_') === 0) {
337
-            $class_name = 'LEGACY_MODELS';
338
-        }
339
-        $dependency = $this->getFqnForAlias($dependency);
340
-        return $this->has_dependency_for_class($class_name, $dependency)
341
-            ? $this->_dependency_map[ $class_name ][ $dependency ]
342
-            : EE_Dependency_Map::not_registered;
343
-    }
344
-
345
-
346
-    /**
347
-     * @param string $class_name
348
-     * @return string | Closure
349
-     */
350
-    public function class_loader($class_name)
351
-    {
352
-        // all legacy models use load_model()
353
-        if (strpos($class_name, 'EEM_') === 0) {
354
-            return 'load_model';
355
-        }
356
-        $class_name = $this->getFqnForAlias($class_name);
357
-        return isset($this->_class_loaders[ $class_name ]) ? $this->_class_loaders[ $class_name ] : '';
358
-    }
359
-
360
-
361
-    /**
362
-     * @return array
363
-     */
364
-    public function class_loaders()
365
-    {
366
-        return $this->_class_loaders;
367
-    }
368
-
369
-
370
-    /**
371
-     * adds an alias for a classname
372
-     *
373
-     * @param string $fqcn      the class name that should be used (concrete class to replace interface)
374
-     * @param string $alias     the class name that would be type hinted for (abstract parent or interface)
375
-     * @param string $for_class the class that has the dependency (is type hinting for the interface)
376
-     */
377
-    public function add_alias($fqcn, $alias, $for_class = '')
378
-    {
379
-        $this->class_cache->addAlias($fqcn, $alias, $for_class);
380
-    }
381
-
382
-
383
-    /**
384
-     * Returns TRUE if the provided fully qualified name IS an alias
385
-     * WHY?
386
-     * Because if a class is type hinting for a concretion,
387
-     * then why would we need to find another class to supply it?
388
-     * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`,
389
-     * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`.
390
-     * Don't go looking for some substitute.
391
-     * Whereas if a class is type hinting for an interface...
392
-     * then we need to find an actual class to use.
393
-     * So the interface IS the alias for some other FQN,
394
-     * and we need to find out if `Fully/Qualified/Namespace/SomeInterface`
395
-     * represents some other class.
396
-     *
397
-     * @param string $fqn
398
-     * @param string $for_class
399
-     * @return bool
400
-     */
401
-    public function isAlias($fqn = '', $for_class = '')
402
-    {
403
-        return $this->class_cache->isAlias($fqn, $for_class);
404
-    }
405
-
406
-
407
-    /**
408
-     * Returns a FQN for provided alias if one exists, otherwise returns the original $alias
409
-     * functions recursively, so that multiple aliases can be used to drill down to a FQN
410
-     *  for example:
411
-     *      if the following two entries were added to the _aliases array:
412
-     *          array(
413
-     *              'interface_alias'           => 'some\namespace\interface'
414
-     *              'some\namespace\interface'  => 'some\namespace\classname'
415
-     *          )
416
-     *      then one could use EE_Registry::instance()->create( 'interface_alias' )
417
-     *      to load an instance of 'some\namespace\classname'
418
-     *
419
-     * @param string $alias
420
-     * @param string $for_class
421
-     * @return string
422
-     */
423
-    public function getFqnForAlias($alias = '', $for_class = '')
424
-    {
425
-        return (string) $this->class_cache->getFqnForAlias($alias, $for_class);
426
-    }
427
-
428
-
429
-    /**
430
-     * Registers the core dependencies and whether a previously instantiated object should be loaded from the cache,
431
-     * if one exists, or whether a new object should be generated every time the requested class is loaded.
432
-     * This is done by using the following class constants:
433
-     *        EE_Dependency_Map::load_from_cache - loads previously instantiated object
434
-     *        EE_Dependency_Map::load_new_object - generates a new object every time
435
-     */
436
-    protected function _register_core_dependencies()
437
-    {
438
-        $this->_dependency_map = array(
439
-            'EE_Request_Handler'                                                                                          => array(
440
-                'EE_Request' => EE_Dependency_Map::load_from_cache,
441
-            ),
442
-            'EE_System'                                                                                                   => array(
443
-                'EE_Registry'                                 => EE_Dependency_Map::load_from_cache,
444
-                'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
445
-                'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
446
-                'EE_Maintenance_Mode'                         => EE_Dependency_Map::load_from_cache,
447
-            ),
448
-            'EE_Session'                                                                                                  => array(
449
-                'EventEspresso\core\services\cache\TransientCacheStorage'  => EE_Dependency_Map::load_from_cache,
450
-                'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache,
451
-                'EventEspresso\core\services\request\Request'              => EE_Dependency_Map::load_from_cache,
452
-                'EE_Encryption'                                            => EE_Dependency_Map::load_from_cache,
453
-            ),
454
-            'EE_Cart'                                                                                                     => array(
455
-                'EE_Session' => EE_Dependency_Map::load_from_cache,
456
-            ),
457
-            'EE_Front_Controller'                                                                                         => array(
458
-                'EE_Registry'              => EE_Dependency_Map::load_from_cache,
459
-                'EE_Request_Handler'       => EE_Dependency_Map::load_from_cache,
460
-                'EE_Module_Request_Router' => EE_Dependency_Map::load_from_cache,
461
-            ),
462
-            'EE_Messenger_Collection_Loader'                                                                              => array(
463
-                'EE_Messenger_Collection' => EE_Dependency_Map::load_new_object,
464
-            ),
465
-            'EE_Message_Type_Collection_Loader'                                                                           => array(
466
-                'EE_Message_Type_Collection' => EE_Dependency_Map::load_new_object,
467
-            ),
468
-            'EE_Message_Resource_Manager'                                                                                 => array(
469
-                'EE_Messenger_Collection_Loader'    => EE_Dependency_Map::load_new_object,
470
-                'EE_Message_Type_Collection_Loader' => EE_Dependency_Map::load_new_object,
471
-                'EEM_Message_Template_Group'        => EE_Dependency_Map::load_from_cache,
472
-            ),
473
-            'EE_Message_Factory'                                                                                          => array(
474
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
475
-            ),
476
-            'EE_messages'                                                                                                 => array(
477
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
478
-            ),
479
-            'EE_Messages_Generator'                                                                                       => array(
480
-                'EE_Messages_Queue'                    => EE_Dependency_Map::load_new_object,
481
-                'EE_Messages_Data_Handler_Collection'  => EE_Dependency_Map::load_new_object,
482
-                'EE_Message_Template_Group_Collection' => EE_Dependency_Map::load_new_object,
483
-                'EEH_Parse_Shortcodes'                 => EE_Dependency_Map::load_from_cache,
484
-            ),
485
-            'EE_Messages_Processor'                                                                                       => array(
486
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
487
-            ),
488
-            'EE_Messages_Queue'                                                                                           => array(
489
-                'EE_Message_Repository' => EE_Dependency_Map::load_new_object,
490
-            ),
491
-            'EE_Messages_Template_Defaults'                                                                               => array(
492
-                'EEM_Message_Template_Group' => EE_Dependency_Map::load_from_cache,
493
-                'EEM_Message_Template'       => EE_Dependency_Map::load_from_cache,
494
-            ),
495
-            'EE_Message_To_Generate_From_Request'                                                                         => array(
496
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
497
-                'EE_Request_Handler'          => EE_Dependency_Map::load_from_cache,
498
-            ),
499
-            'EventEspresso\core\services\commands\CommandBus'                                                             => array(
500
-                'EventEspresso\core\services\commands\CommandHandlerManager' => EE_Dependency_Map::load_from_cache,
501
-            ),
502
-            'EventEspresso\services\commands\CommandHandler'                                                              => array(
503
-                'EE_Registry'         => EE_Dependency_Map::load_from_cache,
504
-                'CommandBusInterface' => EE_Dependency_Map::load_from_cache,
505
-            ),
506
-            'EventEspresso\core\services\commands\CommandHandlerManager'                                                  => array(
507
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
508
-            ),
509
-            'EventEspresso\core\services\commands\CompositeCommandHandler'                                                => array(
510
-                'EventEspresso\core\services\commands\CommandBus'     => EE_Dependency_Map::load_from_cache,
511
-                'EventEspresso\core\services\commands\CommandFactory' => EE_Dependency_Map::load_from_cache,
512
-            ),
513
-            'EventEspresso\core\services\commands\CommandFactory'                                                         => array(
514
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
515
-            ),
516
-            'EventEspresso\core\services\commands\middleware\CapChecker'                                                  => array(
517
-                'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
518
-            ),
519
-            'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker'                                         => array(
520
-                'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
521
-            ),
522
-            'EventEspresso\core\domain\services\capabilities\RegistrationsCapChecker'                                     => array(
523
-                'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
524
-            ),
525
-            'EventEspresso\core\services\commands\registration\CreateRegistrationCommandHandler'                          => array(
526
-                'EventEspresso\core\domain\services\registration\CreateRegistrationService' => EE_Dependency_Map::load_from_cache,
527
-            ),
528
-            'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommandHandler'                     => array(
529
-                'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
530
-            ),
531
-            'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommandHandler'                    => array(
532
-                'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
533
-            ),
534
-            'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler'         => array(
535
-                'EventEspresso\core\domain\services\registration\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
536
-            ),
537
-            'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler' => array(
538
-                'EventEspresso\core\domain\services\registration\UpdateRegistrationService' => EE_Dependency_Map::load_from_cache,
539
-            ),
540
-            'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommandHandler'                              => array(
541
-                'EventEspresso\core\domain\services\ticket\CreateTicketLineItemService' => EE_Dependency_Map::load_from_cache,
542
-            ),
543
-            'EventEspresso\core\services\commands\ticket\CancelTicketLineItemCommandHandler'                              => array(
544
-                'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
545
-            ),
546
-            'EventEspresso\core\domain\services\registration\CancelRegistrationService'                                   => array(
547
-                'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
548
-            ),
549
-            'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler'                                  => array(
550
-                'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
551
-            ),
552
-            'EventEspresso\core\services\database\TableManager'                                                           => array(
553
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
554
-            ),
555
-            'EE_Data_Migration_Class_Base'                                                                                => array(
556
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
557
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
558
-            ),
559
-            'EE_DMS_Core_4_1_0'                                                                                           => array(
560
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
561
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
562
-            ),
563
-            'EE_DMS_Core_4_2_0'                                                                                           => array(
564
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
565
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
566
-            ),
567
-            'EE_DMS_Core_4_3_0'                                                                                           => array(
568
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
569
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
570
-            ),
571
-            'EE_DMS_Core_4_4_0'                                                                                           => array(
572
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
573
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
574
-            ),
575
-            'EE_DMS_Core_4_5_0'                                                                                           => array(
576
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
577
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
578
-            ),
579
-            'EE_DMS_Core_4_6_0'                                                                                           => array(
580
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
581
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
582
-            ),
583
-            'EE_DMS_Core_4_7_0'                                                                                           => array(
584
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
585
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
586
-            ),
587
-            'EE_DMS_Core_4_8_0'                                                                                           => array(
588
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
589
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
590
-            ),
591
-            'EE_DMS_Core_4_9_0'                                                                                           => array(
592
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
593
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
594
-            ),
595
-            'EventEspresso\core\services\assets\I18nRegistry'                                                             => array(
596
-                array(),
597
-                'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
598
-            ),
599
-            'EventEspresso\core\services\assets\Registry'                                                                 => array(
600
-                'EE_Template_Config'                              => EE_Dependency_Map::load_from_cache,
601
-                'EE_Currency_Config'                              => EE_Dependency_Map::load_from_cache,
602
-                'EventEspresso\core\services\assets\I18nRegistry' => EE_Dependency_Map::load_from_cache,
603
-                'EventEspresso\core\domain\Domain'                => EE_Dependency_Map::load_from_cache,
604
-            ),
605
-            'EventEspresso\core\domain\entities\shortcodes\EspressoCancelled'                                             => array(
606
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
607
-            ),
608
-            'EventEspresso\core\domain\entities\shortcodes\EspressoCheckout'                                              => array(
609
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
610
-            ),
611
-            'EventEspresso\core\domain\entities\shortcodes\EspressoEventAttendees'                                        => array(
612
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
613
-            ),
614
-            'EventEspresso\core\domain\entities\shortcodes\EspressoEvents'                                                => array(
615
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
616
-            ),
617
-            'EventEspresso\core\domain\entities\shortcodes\EspressoThankYou'                                              => array(
618
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
619
-            ),
620
-            'EventEspresso\core\domain\entities\shortcodes\EspressoTicketSelector'                                        => array(
621
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
622
-            ),
623
-            'EventEspresso\core\domain\entities\shortcodes\EspressoTxnPage'                                               => array(
624
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
625
-            ),
626
-            'EventEspresso\core\services\cache\BasicCacheManager'                                                         => array(
627
-                'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
628
-            ),
629
-            'EventEspresso\core\services\cache\PostRelatedCacheManager'                                                   => array(
630
-                'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
631
-            ),
632
-            'EventEspresso\core\domain\services\validation\email\EmailValidationService'                                  => array(
633
-                'EE_Registration_Config'                     => EE_Dependency_Map::load_from_cache,
634
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
635
-            ),
636
-            'EventEspresso\core\domain\values\EmailAddress'                                                               => array(
637
-                null,
638
-                'EventEspresso\core\domain\services\validation\email\EmailValidationService' => EE_Dependency_Map::load_from_cache,
639
-            ),
640
-            'EventEspresso\core\services\orm\ModelFieldFactory'                                                           => array(
641
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
642
-            ),
643
-            'LEGACY_MODELS'                                                                                               => array(
644
-                null,
645
-                'EventEspresso\core\services\database\ModelFieldFactory' => EE_Dependency_Map::load_from_cache,
646
-            ),
647
-            'EE_Module_Request_Router'                                                                                    => array(
648
-                'EE_Request' => EE_Dependency_Map::load_from_cache,
649
-            ),
650
-            'EE_Registration_Processor'                                                                                   => array(
651
-                'EE_Request' => EE_Dependency_Map::load_from_cache,
652
-            ),
653
-            'EventEspresso\core\services\notifications\PersistentAdminNoticeManager'                                      => array(
654
-                null,
655
-                'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
656
-                'EE_Request'                                                          => EE_Dependency_Map::load_from_cache,
657
-            ),
658
-            'EventEspresso\core\services\editor\EditorBlockRegistrationManager'      => array(
659
-                'EventEspresso\core\domain\entities\editor\EditorBlockCollection' => EE_Dependency_Map::load_from_cache,
660
-                'EE_Request'                                                      => EE_Dependency_Map::load_from_cache,
661
-                'EventEspresso\core\domain\Domain'                                => EE_Dependency_Map::load_from_cache,
662
-                'EventEspresso\core\services\assets\Registry' => EE_Dependency_Map::load_from_cache
663
-            ),
664
-            'EE_Admin_Transactions_List_Table'                                                                            => array(
665
-                null,
666
-                'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache,
667
-            ),
668
-            'EventEspresso\core\services\licensing\LicenseService'                                                        => array(
669
-                'EventEspresso\core\domain\services\pue\Stats'  => EE_Dependency_Map::load_from_cache,
670
-                'EventEspresso\core\domain\services\pue\Config' => EE_Dependency_Map::load_from_cache,
671
-            ),
672
-            'EventEspresso\core\domain\services\pue\Stats'                                                                => array(
673
-                'EventEspresso\core\domain\services\pue\Config'        => EE_Dependency_Map::load_from_cache,
674
-                'EE_Maintenance_Mode'                                  => EE_Dependency_Map::load_from_cache,
675
-                'EventEspresso\core\domain\services\pue\StatsGatherer' => EE_Dependency_Map::load_from_cache,
676
-            ),
677
-            'EventEspresso\core\domain\services\pue\Config'                                                               => array(
678
-                'EE_Network_Config' => EE_Dependency_Map::load_from_cache,
679
-                'EE_Config'         => EE_Dependency_Map::load_from_cache,
680
-            ),
681
-            'EventEspresso\core\domain\services\pue\StatsGatherer'                                                        => array(
682
-                'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache,
683
-                'EEM_Event'          => EE_Dependency_Map::load_from_cache,
684
-                'EEM_Datetime'       => EE_Dependency_Map::load_from_cache,
685
-                'EEM_Ticket'         => EE_Dependency_Map::load_from_cache,
686
-                'EEM_Registration'   => EE_Dependency_Map::load_from_cache,
687
-                'EEM_Transaction'    => EE_Dependency_Map::load_from_cache,
688
-                'EE_Config'          => EE_Dependency_Map::load_from_cache,
689
-            ),
690
-            'EventEspresso\core\domain\services\admin\ExitModal'                                                          => array(
691
-                'EventEspresso\core\services\assets\Registry' => EE_Dependency_Map::load_from_cache,
692
-            ),
693
-            'EventEspresso\core\domain\services\admin\PluginUpsells'                                                      => array(
694
-                'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
695
-            ),
696
-            'EventEspresso\caffeinated\modules\recaptcha_invisible\InvisibleRecaptcha'                                    => array(
697
-                'EE_Registration_Config' => EE_Dependency_Map::load_from_cache,
698
-                'EE_Session'             => EE_Dependency_Map::load_from_cache,
699
-            ),
700
-            'EventEspresso\caffeinated\modules\recaptcha_invisible\RecaptchaAdminSettings'                                => array(
701
-                'EE_Registration_Config' => EE_Dependency_Map::load_from_cache,
702
-            ),
703
-            'EventEspresso\modules\ticket_selector\ProcessTicketSelector'                                                 => array(
704
-                'EE_Core_Config'                                                          => EE_Dependency_Map::load_from_cache,
705
-                'EventEspresso\core\services\request\Request'                             => EE_Dependency_Map::load_from_cache,
706
-                'EE_Session'                                                              => EE_Dependency_Map::load_from_cache,
707
-                'EEM_Ticket'                                                              => EE_Dependency_Map::load_from_cache,
708
-                'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker' => EE_Dependency_Map::load_from_cache,
709
-            ),
710
-            'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker'                                     => array(
711
-                'EEM_Datetime' => EE_Dependency_Map::load_from_cache,
712
-            ),
713
-            'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions'                              => array(
714
-                'EE_Core_Config'                             => EE_Dependency_Map::load_from_cache,
715
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
716
-            ),
717
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes'                                => array(
718
-                'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache,
719
-            ),
720
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies'                               => array(
721
-                'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache,
722
-            ),
723
-            'EE_CPT_Strategy'                                                                                             => array(
724
-                'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache,
725
-                'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache,
726
-            ),
727
-            'EventEspresso\core\services\loaders\ObjectIdentifier'                                                        => array(
728
-                'EventEspresso\core\services\loaders\ClassInterfaceCache' => EE_Dependency_Map::load_from_cache,
729
-            ),
730
-        );
731
-    }
732
-
733
-
734
-    /**
735
-     * Registers how core classes are loaded.
736
-     * This can either be done by simply providing the name of one of the EE_Registry loader methods such as:
737
-     *        'EE_Request_Handler' => 'load_core'
738
-     *        'EE_Messages_Queue'  => 'load_lib'
739
-     *        'EEH_Debug_Tools'    => 'load_helper'
740
-     * or, if greater control is required, by providing a custom closure. For example:
741
-     *        'Some_Class' => function () {
742
-     *            return new Some_Class();
743
-     *        },
744
-     * This is required for instantiating dependencies
745
-     * where an interface has been type hinted in a class constructor. For example:
746
-     *        'Required_Interface' => function () {
747
-     *            return new A_Class_That_Implements_Required_Interface();
748
-     *        },
749
-     *
750
-     */
751
-    protected function _register_core_class_loaders()
752
-    {
753
-        // for PHP5.3 compat, we need to register any properties called here in a variable because `$this` cannot
754
-        // be used in a closure.
755
-        $request = &$this->request;
756
-        $response = &$this->response;
757
-        $legacy_request = &$this->legacy_request;
758
-        // $loader = &$this->loader;
759
-        $this->_class_loaders = array(
760
-            // load_core
761
-            'EE_Capabilities'                              => 'load_core',
762
-            'EE_Encryption'                                => 'load_core',
763
-            'EE_Front_Controller'                          => 'load_core',
764
-            'EE_Module_Request_Router'                     => 'load_core',
765
-            'EE_Registry'                                  => 'load_core',
766
-            'EE_Request'                                   => function () use (&$legacy_request) {
767
-                return $legacy_request;
768
-            },
769
-            'EventEspresso\core\services\request\Request'  => function () use (&$request) {
770
-                return $request;
771
-            },
772
-            'EventEspresso\core\services\request\Response' => function () use (&$response) {
773
-                return $response;
774
-            },
775
-            'EE_Base'                                      => 'load_core',
776
-            'EE_Request_Handler'                           => 'load_core',
777
-            'EE_Session'                                   => 'load_core',
778
-            'EE_Cron_Tasks'                                => 'load_core',
779
-            'EE_System'                                    => 'load_core',
780
-            'EE_Maintenance_Mode'                          => 'load_core',
781
-            'EE_Register_CPTs'                             => 'load_core',
782
-            'EE_Admin'                                     => 'load_core',
783
-            'EE_CPT_Strategy'                              => 'load_core',
784
-            // load_lib
785
-            'EE_Message_Resource_Manager'                  => 'load_lib',
786
-            'EE_Message_Type_Collection'                   => 'load_lib',
787
-            'EE_Message_Type_Collection_Loader'            => 'load_lib',
788
-            'EE_Messenger_Collection'                      => 'load_lib',
789
-            'EE_Messenger_Collection_Loader'               => 'load_lib',
790
-            'EE_Messages_Processor'                        => 'load_lib',
791
-            'EE_Message_Repository'                        => 'load_lib',
792
-            'EE_Messages_Queue'                            => 'load_lib',
793
-            'EE_Messages_Data_Handler_Collection'          => 'load_lib',
794
-            'EE_Message_Template_Group_Collection'         => 'load_lib',
795
-            'EE_Payment_Method_Manager'                    => 'load_lib',
796
-            'EE_Messages_Generator'                        => function () {
797
-                return EE_Registry::instance()->load_lib(
798
-                    'Messages_Generator',
799
-                    array(),
800
-                    false,
801
-                    false
802
-                );
803
-            },
804
-            'EE_Messages_Template_Defaults'                => function ($arguments = array()) {
805
-                return EE_Registry::instance()->load_lib(
806
-                    'Messages_Template_Defaults',
807
-                    $arguments,
808
-                    false,
809
-                    false
810
-                );
811
-            },
812
-            // load_helper
813
-            'EEH_Parse_Shortcodes'                         => function () {
814
-                if (EE_Registry::instance()->load_helper('Parse_Shortcodes')) {
815
-                    return new EEH_Parse_Shortcodes();
816
-                }
817
-                return null;
818
-            },
819
-            'EE_Template_Config'                           => function () {
820
-                return EE_Config::instance()->template_settings;
821
-            },
822
-            'EE_Currency_Config'                           => function () {
823
-                return EE_Config::instance()->currency;
824
-            },
825
-            'EE_Registration_Config'                       => function () {
826
-                return EE_Config::instance()->registration;
827
-            },
828
-            'EE_Core_Config'                               => function () {
829
-                return EE_Config::instance()->core;
830
-            },
831
-            'EventEspresso\core\services\loaders\Loader'   => function () {
832
-                return LoaderFactory::getLoader();
833
-            },
834
-            'EE_Network_Config'                            => function () {
835
-                return EE_Network_Config::instance();
836
-            },
837
-            'EE_Config'                                    => function () {
838
-                return EE_Config::instance();
839
-            },
840
-            'EventEspresso\core\domain\Domain'             => function () {
841
-                return DomainFactory::getEventEspressoCoreDomain();
842
-            },
843
-        );
844
-    }
845
-
846
-
847
-    /**
848
-     * can be used for supplying alternate names for classes,
849
-     * or for connecting interface names to instantiable classes
850
-     */
851
-    protected function _register_core_aliases()
852
-    {
853
-        $aliases = array(
854
-            'CommandBusInterface'                                                          => 'EventEspresso\core\services\commands\CommandBusInterface',
855
-            'EventEspresso\core\services\commands\CommandBusInterface'                     => 'EventEspresso\core\services\commands\CommandBus',
856
-            'CommandHandlerManagerInterface'                                               => 'EventEspresso\core\services\commands\CommandHandlerManagerInterface',
857
-            'EventEspresso\core\services\commands\CommandHandlerManagerInterface'          => 'EventEspresso\core\services\commands\CommandHandlerManager',
858
-            'CapChecker'                                                                   => 'EventEspresso\core\services\commands\middleware\CapChecker',
859
-            'AddActionHook'                                                                => 'EventEspresso\core\services\commands\middleware\AddActionHook',
860
-            'CapabilitiesChecker'                                                          => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
861
-            'CapabilitiesCheckerInterface'                                                 => 'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface',
862
-            'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface' => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
863
-            'CreateRegistrationService'                                                    => 'EventEspresso\core\domain\services\registration\CreateRegistrationService',
864
-            'CreateRegistrationCommandHandler'                                             => 'EventEspresso\core\services\commands\registration\CreateRegistrationCommand',
865
-            'CopyRegistrationDetailsCommandHandler'                                        => 'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommand',
866
-            'CopyRegistrationPaymentsCommandHandler'                                       => 'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommand',
867
-            'CancelRegistrationAndTicketLineItemCommandHandler'                            => 'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler',
868
-            'UpdateRegistrationAndTransactionAfterChangeCommandHandler'                    => 'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler',
869
-            'CreateTicketLineItemCommandHandler'                                           => 'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommand',
870
-            'CreateTransactionCommandHandler'                                              => 'EventEspresso\core\services\commands\transaction\CreateTransactionCommandHandler',
871
-            'CreateAttendeeCommandHandler'                                                 => 'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler',
872
-            'TableManager'                                                                 => 'EventEspresso\core\services\database\TableManager',
873
-            'TableAnalysis'                                                                => 'EventEspresso\core\services\database\TableAnalysis',
874
-            'EspressoShortcode'                                                            => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
875
-            'ShortcodeInterface'                                                           => 'EventEspresso\core\services\shortcodes\ShortcodeInterface',
876
-            'EventEspresso\core\services\shortcodes\ShortcodeInterface'                    => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
877
-            'EventEspresso\core\services\cache\CacheStorageInterface'                      => 'EventEspresso\core\services\cache\TransientCacheStorage',
878
-            'LoaderInterface'                                                              => 'EventEspresso\core\services\loaders\LoaderInterface',
879
-            'EventEspresso\core\services\loaders\LoaderInterface'                          => 'EventEspresso\core\services\loaders\Loader',
880
-            'CommandFactoryInterface'                                                      => 'EventEspresso\core\services\commands\CommandFactoryInterface',
881
-            'EventEspresso\core\services\commands\CommandFactoryInterface'                 => 'EventEspresso\core\services\commands\CommandFactory',
882
-            'EventEspresso\core\domain\services\session\SessionIdentifierInterface'        => 'EE_Session',
883
-            'EmailValidatorInterface'                                                      => 'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface',
884
-            'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface'  => 'EventEspresso\core\domain\services\validation\email\EmailValidationService',
885
-            'NoticeConverterInterface'                                                     => 'EventEspresso\core\services\notices\NoticeConverterInterface',
886
-            'EventEspresso\core\services\notices\NoticeConverterInterface'                 => 'EventEspresso\core\services\notices\ConvertNoticesToEeErrors',
887
-            'NoticesContainerInterface'                                                    => 'EventEspresso\core\services\notices\NoticesContainerInterface',
888
-            'EventEspresso\core\services\notices\NoticesContainerInterface'                => 'EventEspresso\core\services\notices\NoticesContainer',
889
-            'EventEspresso\core\services\request\RequestInterface'                         => 'EventEspresso\core\services\request\Request',
890
-            'EventEspresso\core\services\request\ResponseInterface'                        => 'EventEspresso\core\services\request\Response',
891
-            'EventEspresso\core\domain\DomainInterface'                                    => 'EventEspresso\core\domain\Domain',
892
-        );
893
-        foreach ($aliases as $alias => $fqn) {
894
-            if (is_array($fqn)) {
895
-                foreach ($fqn as $class => $for_class) {
896
-                    $this->class_cache->addAlias($class, $alias, $for_class);
897
-                }
898
-                continue;
899
-            }
900
-            $this->class_cache->addAlias($fqn, $alias);
901
-        }
902
-        if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
903
-            $this->class_cache->addAlias(
904
-                'EventEspresso\core\services\notices\ConvertNoticesToAdminNotices',
905
-                'EventEspresso\core\services\notices\NoticeConverterInterface'
906
-            );
907
-        }
908
-    }
909
-
910
-
911
-    /**
912
-     * This is used to reset the internal map and class_loaders to their original default state at the beginning of the
913
-     * request Primarily used by unit tests.
914
-     */
915
-    public function reset()
916
-    {
917
-        $this->_register_core_class_loaders();
918
-        $this->_register_core_dependencies();
919
-    }
920
-
921
-
922
-    /**
923
-     * PLZ NOTE: a better name for this method would be is_alias()
924
-     * because it returns TRUE if the provided fully qualified name IS an alias
925
-     * WHY?
926
-     * Because if a class is type hinting for a concretion,
927
-     * then why would we need to find another class to supply it?
928
-     * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`,
929
-     * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`.
930
-     * Don't go looking for some substitute.
931
-     * Whereas if a class is type hinting for an interface...
932
-     * then we need to find an actual class to use.
933
-     * So the interface IS the alias for some other FQN,
934
-     * and we need to find out if `Fully/Qualified/Namespace/SomeInterface`
935
-     * represents some other class.
936
-     *
937
-     * @deprecated $VID:$
938
-     * @param string $fqn
939
-     * @param string $for_class
940
-     * @return bool
941
-     */
942
-    public function has_alias($fqn = '', $for_class = '')
943
-    {
944
-        return $this->isAlias($fqn, $for_class);
945
-    }
946
-
947
-
948
-    /**
949
-     * PLZ NOTE: a better name for this method would be get_fqn_for_alias()
950
-     * because it returns a FQN for provided alias if one exists, otherwise returns the original $alias
951
-     * functions recursively, so that multiple aliases can be used to drill down to a FQN
952
-     *  for example:
953
-     *      if the following two entries were added to the _aliases array:
954
-     *          array(
955
-     *              'interface_alias'           => 'some\namespace\interface'
956
-     *              'some\namespace\interface'  => 'some\namespace\classname'
957
-     *          )
958
-     *      then one could use EE_Registry::instance()->create( 'interface_alias' )
959
-     *      to load an instance of 'some\namespace\classname'
960
-     *
961
-     * @deprecated $VID:$
962
-     * @param string $alias
963
-     * @param string $for_class
964
-     * @return string
965
-     */
966
-    public function get_alias($alias = '', $for_class = '')
967
-    {
968
-        return $this->getFqnForAlias($alias, $for_class);
969
-    }
23
+	/**
24
+	 * This means that the requested class dependency is not present in the dependency map
25
+	 */
26
+	const not_registered = 0;
27
+
28
+	/**
29
+	 * This instructs class loaders to ALWAYS return a newly instantiated object for the requested class.
30
+	 */
31
+	const load_new_object = 1;
32
+
33
+	/**
34
+	 * This instructs class loaders to return a previously instantiated and cached object for the requested class.
35
+	 * IF a previously instantiated object does not exist, a new one will be created and added to the cache.
36
+	 */
37
+	const load_from_cache = 2;
38
+
39
+	/**
40
+	 * When registering a dependency,
41
+	 * this indicates to keep any existing dependencies that already exist,
42
+	 * and simply discard any new dependencies declared in the incoming data
43
+	 */
44
+	const KEEP_EXISTING_DEPENDENCIES = 0;
45
+
46
+	/**
47
+	 * When registering a dependency,
48
+	 * this indicates to overwrite any existing dependencies that already exist using the incoming data
49
+	 */
50
+	const OVERWRITE_DEPENDENCIES = 1;
51
+
52
+
53
+	/**
54
+	 * @type EE_Dependency_Map $_instance
55
+	 */
56
+	protected static $_instance;
57
+
58
+	/**
59
+	 * @var ClassInterfaceCache $class_cache
60
+	 */
61
+	private $class_cache;
62
+
63
+	/**
64
+	 * @type RequestInterface $request
65
+	 */
66
+	protected $request;
67
+
68
+	/**
69
+	 * @type LegacyRequestInterface $legacy_request
70
+	 */
71
+	protected $legacy_request;
72
+
73
+	/**
74
+	 * @type ResponseInterface $response
75
+	 */
76
+	protected $response;
77
+
78
+	/**
79
+	 * @type LoaderInterface $loader
80
+	 */
81
+	protected $loader;
82
+
83
+	/**
84
+	 * @type array $_dependency_map
85
+	 */
86
+	protected $_dependency_map = array();
87
+
88
+	/**
89
+	 * @type array $_class_loaders
90
+	 */
91
+	protected $_class_loaders = array();
92
+
93
+
94
+	/**
95
+	 * EE_Dependency_Map constructor.
96
+	 *
97
+	 * @param ClassInterfaceCache $class_cache
98
+	 */
99
+	protected function __construct(ClassInterfaceCache $class_cache)
100
+	{
101
+		$this->class_cache = $class_cache;
102
+		do_action('EE_Dependency_Map____construct', $this);
103
+	}
104
+
105
+
106
+	/**
107
+	 * @return void
108
+	 */
109
+	public function initialize()
110
+	{
111
+		$this->_register_core_dependencies();
112
+		$this->_register_core_class_loaders();
113
+		$this->_register_core_aliases();
114
+	}
115
+
116
+
117
+	/**
118
+	 * @singleton method used to instantiate class object
119
+	 * @param ClassInterfaceCache|null $class_cache
120
+	 * @return EE_Dependency_Map
121
+	 */
122
+	public static function instance(ClassInterfaceCache $class_cache = null)
123
+	{
124
+		// check if class object is instantiated, and instantiated properly
125
+		if (! self::$_instance instanceof EE_Dependency_Map
126
+			&& $class_cache instanceof ClassInterfaceCache
127
+		) {
128
+			self::$_instance = new EE_Dependency_Map($class_cache);
129
+		}
130
+		return self::$_instance;
131
+	}
132
+
133
+
134
+	/**
135
+	 * @param RequestInterface $request
136
+	 */
137
+	public function setRequest(RequestInterface $request)
138
+	{
139
+		$this->request = $request;
140
+	}
141
+
142
+
143
+	/**
144
+	 * @param LegacyRequestInterface $legacy_request
145
+	 */
146
+	public function setLegacyRequest(LegacyRequestInterface $legacy_request)
147
+	{
148
+		$this->legacy_request = $legacy_request;
149
+	}
150
+
151
+
152
+	/**
153
+	 * @param ResponseInterface $response
154
+	 */
155
+	public function setResponse(ResponseInterface $response)
156
+	{
157
+		$this->response = $response;
158
+	}
159
+
160
+
161
+	/**
162
+	 * @param LoaderInterface $loader
163
+	 */
164
+	public function setLoader(LoaderInterface $loader)
165
+	{
166
+		$this->loader = $loader;
167
+	}
168
+
169
+
170
+	/**
171
+	 * @param string $class
172
+	 * @param array  $dependencies
173
+	 * @param int    $overwrite
174
+	 * @return bool
175
+	 */
176
+	public static function register_dependencies(
177
+		$class,
178
+		array $dependencies,
179
+		$overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
180
+	) {
181
+		return self::$_instance->registerDependencies($class, $dependencies, $overwrite);
182
+	}
183
+
184
+
185
+	/**
186
+	 * Assigns an array of class names and corresponding load sources (new or cached)
187
+	 * to the class specified by the first parameter.
188
+	 * IMPORTANT !!!
189
+	 * The order of elements in the incoming $dependencies array MUST match
190
+	 * the order of the constructor parameters for the class in question.
191
+	 * This is especially important when overriding any existing dependencies that are registered.
192
+	 * the third parameter controls whether any duplicate dependencies are overwritten or not.
193
+	 *
194
+	 * @param string $class
195
+	 * @param array  $dependencies
196
+	 * @param int    $overwrite
197
+	 * @return bool
198
+	 */
199
+	public function registerDependencies(
200
+		$class,
201
+		array $dependencies,
202
+		$overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
203
+	) {
204
+		$class = trim($class, '\\');
205
+		$registered = false;
206
+		if (empty(self::$_instance->_dependency_map[ $class ])) {
207
+			self::$_instance->_dependency_map[ $class ] = array();
208
+		}
209
+		// we need to make sure that any aliases used when registering a dependency
210
+		// get resolved to the correct class name
211
+		foreach ($dependencies as $dependency => $load_source) {
212
+			$alias = self::$_instance->getFqnForAlias($dependency);
213
+			if ($overwrite === EE_Dependency_Map::OVERWRITE_DEPENDENCIES
214
+				|| ! isset(self::$_instance->_dependency_map[ $class ][ $alias ])
215
+			) {
216
+				unset($dependencies[ $dependency ]);
217
+				$dependencies[ $alias ] = $load_source;
218
+				$registered = true;
219
+			}
220
+		}
221
+		// now add our two lists of dependencies together.
222
+		// using Union (+=) favours the arrays in precedence from left to right,
223
+		// so $dependencies is NOT overwritten because it is listed first
224
+		// ie: with A = B + C, entries in B take precedence over duplicate entries in C
225
+		// Union is way faster than array_merge() but should be used with caution...
226
+		// especially with numerically indexed arrays
227
+		$dependencies += self::$_instance->_dependency_map[ $class ];
228
+		// now we need to ensure that the resulting dependencies
229
+		// array only has the entries that are required for the class
230
+		// so first count how many dependencies were originally registered for the class
231
+		$dependency_count = count(self::$_instance->_dependency_map[ $class ]);
232
+		// if that count is non-zero (meaning dependencies were already registered)
233
+		self::$_instance->_dependency_map[ $class ] = $dependency_count
234
+			// then truncate the  final array to match that count
235
+			? array_slice($dependencies, 0, $dependency_count)
236
+			// otherwise just take the incoming array because nothing previously existed
237
+			: $dependencies;
238
+		return $registered;
239
+	}
240
+
241
+
242
+	/**
243
+	 * @param string $class_name
244
+	 * @param string $loader
245
+	 * @return bool
246
+	 * @throws DomainException
247
+	 */
248
+	public static function register_class_loader($class_name, $loader = 'load_core')
249
+	{
250
+		if (! $loader instanceof Closure && strpos($class_name, '\\') !== false) {
251
+			throw new DomainException(
252
+				esc_html__('Don\'t use class loaders for FQCNs.', 'event_espresso')
253
+			);
254
+		}
255
+		// check that loader is callable or method starts with "load_" and exists in EE_Registry
256
+		if (! is_callable($loader)
257
+			&& (
258
+				strpos($loader, 'load_') !== 0
259
+				|| ! method_exists('EE_Registry', $loader)
260
+			)
261
+		) {
262
+			throw new DomainException(
263
+				sprintf(
264
+					esc_html__(
265
+						'"%1$s" is not a valid loader method on EE_Registry.',
266
+						'event_espresso'
267
+					),
268
+					$loader
269
+				)
270
+			);
271
+		}
272
+		$class_name = self::$_instance->getFqnForAlias($class_name);
273
+		if (! isset(self::$_instance->_class_loaders[ $class_name ])) {
274
+			self::$_instance->_class_loaders[ $class_name ] = $loader;
275
+			return true;
276
+		}
277
+		return false;
278
+	}
279
+
280
+
281
+	/**
282
+	 * @return array
283
+	 */
284
+	public function dependency_map()
285
+	{
286
+		return $this->_dependency_map;
287
+	}
288
+
289
+
290
+	/**
291
+	 * returns TRUE if dependency map contains a listing for the provided class name
292
+	 *
293
+	 * @param string $class_name
294
+	 * @return boolean
295
+	 */
296
+	public function has($class_name = '')
297
+	{
298
+		// all legacy models have the same dependencies
299
+		if (strpos($class_name, 'EEM_') === 0) {
300
+			$class_name = 'LEGACY_MODELS';
301
+		}
302
+		return isset($this->_dependency_map[ $class_name ]) ? true : false;
303
+	}
304
+
305
+
306
+	/**
307
+	 * returns TRUE if dependency map contains a listing for the provided class name AND dependency
308
+	 *
309
+	 * @param string $class_name
310
+	 * @param string $dependency
311
+	 * @return bool
312
+	 */
313
+	public function has_dependency_for_class($class_name = '', $dependency = '')
314
+	{
315
+		// all legacy models have the same dependencies
316
+		if (strpos($class_name, 'EEM_') === 0) {
317
+			$class_name = 'LEGACY_MODELS';
318
+		}
319
+		$dependency = $this->getFqnForAlias($dependency, $class_name);
320
+		return isset($this->_dependency_map[ $class_name ][ $dependency ])
321
+			? true
322
+			: false;
323
+	}
324
+
325
+
326
+	/**
327
+	 * returns loading strategy for whether a previously cached dependency should be loaded or a new instance returned
328
+	 *
329
+	 * @param string $class_name
330
+	 * @param string $dependency
331
+	 * @return int
332
+	 */
333
+	public function loading_strategy_for_class_dependency($class_name = '', $dependency = '')
334
+	{
335
+		// all legacy models have the same dependencies
336
+		if (strpos($class_name, 'EEM_') === 0) {
337
+			$class_name = 'LEGACY_MODELS';
338
+		}
339
+		$dependency = $this->getFqnForAlias($dependency);
340
+		return $this->has_dependency_for_class($class_name, $dependency)
341
+			? $this->_dependency_map[ $class_name ][ $dependency ]
342
+			: EE_Dependency_Map::not_registered;
343
+	}
344
+
345
+
346
+	/**
347
+	 * @param string $class_name
348
+	 * @return string | Closure
349
+	 */
350
+	public function class_loader($class_name)
351
+	{
352
+		// all legacy models use load_model()
353
+		if (strpos($class_name, 'EEM_') === 0) {
354
+			return 'load_model';
355
+		}
356
+		$class_name = $this->getFqnForAlias($class_name);
357
+		return isset($this->_class_loaders[ $class_name ]) ? $this->_class_loaders[ $class_name ] : '';
358
+	}
359
+
360
+
361
+	/**
362
+	 * @return array
363
+	 */
364
+	public function class_loaders()
365
+	{
366
+		return $this->_class_loaders;
367
+	}
368
+
369
+
370
+	/**
371
+	 * adds an alias for a classname
372
+	 *
373
+	 * @param string $fqcn      the class name that should be used (concrete class to replace interface)
374
+	 * @param string $alias     the class name that would be type hinted for (abstract parent or interface)
375
+	 * @param string $for_class the class that has the dependency (is type hinting for the interface)
376
+	 */
377
+	public function add_alias($fqcn, $alias, $for_class = '')
378
+	{
379
+		$this->class_cache->addAlias($fqcn, $alias, $for_class);
380
+	}
381
+
382
+
383
+	/**
384
+	 * Returns TRUE if the provided fully qualified name IS an alias
385
+	 * WHY?
386
+	 * Because if a class is type hinting for a concretion,
387
+	 * then why would we need to find another class to supply it?
388
+	 * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`,
389
+	 * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`.
390
+	 * Don't go looking for some substitute.
391
+	 * Whereas if a class is type hinting for an interface...
392
+	 * then we need to find an actual class to use.
393
+	 * So the interface IS the alias for some other FQN,
394
+	 * and we need to find out if `Fully/Qualified/Namespace/SomeInterface`
395
+	 * represents some other class.
396
+	 *
397
+	 * @param string $fqn
398
+	 * @param string $for_class
399
+	 * @return bool
400
+	 */
401
+	public function isAlias($fqn = '', $for_class = '')
402
+	{
403
+		return $this->class_cache->isAlias($fqn, $for_class);
404
+	}
405
+
406
+
407
+	/**
408
+	 * Returns a FQN for provided alias if one exists, otherwise returns the original $alias
409
+	 * functions recursively, so that multiple aliases can be used to drill down to a FQN
410
+	 *  for example:
411
+	 *      if the following two entries were added to the _aliases array:
412
+	 *          array(
413
+	 *              'interface_alias'           => 'some\namespace\interface'
414
+	 *              'some\namespace\interface'  => 'some\namespace\classname'
415
+	 *          )
416
+	 *      then one could use EE_Registry::instance()->create( 'interface_alias' )
417
+	 *      to load an instance of 'some\namespace\classname'
418
+	 *
419
+	 * @param string $alias
420
+	 * @param string $for_class
421
+	 * @return string
422
+	 */
423
+	public function getFqnForAlias($alias = '', $for_class = '')
424
+	{
425
+		return (string) $this->class_cache->getFqnForAlias($alias, $for_class);
426
+	}
427
+
428
+
429
+	/**
430
+	 * Registers the core dependencies and whether a previously instantiated object should be loaded from the cache,
431
+	 * if one exists, or whether a new object should be generated every time the requested class is loaded.
432
+	 * This is done by using the following class constants:
433
+	 *        EE_Dependency_Map::load_from_cache - loads previously instantiated object
434
+	 *        EE_Dependency_Map::load_new_object - generates a new object every time
435
+	 */
436
+	protected function _register_core_dependencies()
437
+	{
438
+		$this->_dependency_map = array(
439
+			'EE_Request_Handler'                                                                                          => array(
440
+				'EE_Request' => EE_Dependency_Map::load_from_cache,
441
+			),
442
+			'EE_System'                                                                                                   => array(
443
+				'EE_Registry'                                 => EE_Dependency_Map::load_from_cache,
444
+				'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
445
+				'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
446
+				'EE_Maintenance_Mode'                         => EE_Dependency_Map::load_from_cache,
447
+			),
448
+			'EE_Session'                                                                                                  => array(
449
+				'EventEspresso\core\services\cache\TransientCacheStorage'  => EE_Dependency_Map::load_from_cache,
450
+				'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache,
451
+				'EventEspresso\core\services\request\Request'              => EE_Dependency_Map::load_from_cache,
452
+				'EE_Encryption'                                            => EE_Dependency_Map::load_from_cache,
453
+			),
454
+			'EE_Cart'                                                                                                     => array(
455
+				'EE_Session' => EE_Dependency_Map::load_from_cache,
456
+			),
457
+			'EE_Front_Controller'                                                                                         => array(
458
+				'EE_Registry'              => EE_Dependency_Map::load_from_cache,
459
+				'EE_Request_Handler'       => EE_Dependency_Map::load_from_cache,
460
+				'EE_Module_Request_Router' => EE_Dependency_Map::load_from_cache,
461
+			),
462
+			'EE_Messenger_Collection_Loader'                                                                              => array(
463
+				'EE_Messenger_Collection' => EE_Dependency_Map::load_new_object,
464
+			),
465
+			'EE_Message_Type_Collection_Loader'                                                                           => array(
466
+				'EE_Message_Type_Collection' => EE_Dependency_Map::load_new_object,
467
+			),
468
+			'EE_Message_Resource_Manager'                                                                                 => array(
469
+				'EE_Messenger_Collection_Loader'    => EE_Dependency_Map::load_new_object,
470
+				'EE_Message_Type_Collection_Loader' => EE_Dependency_Map::load_new_object,
471
+				'EEM_Message_Template_Group'        => EE_Dependency_Map::load_from_cache,
472
+			),
473
+			'EE_Message_Factory'                                                                                          => array(
474
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
475
+			),
476
+			'EE_messages'                                                                                                 => array(
477
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
478
+			),
479
+			'EE_Messages_Generator'                                                                                       => array(
480
+				'EE_Messages_Queue'                    => EE_Dependency_Map::load_new_object,
481
+				'EE_Messages_Data_Handler_Collection'  => EE_Dependency_Map::load_new_object,
482
+				'EE_Message_Template_Group_Collection' => EE_Dependency_Map::load_new_object,
483
+				'EEH_Parse_Shortcodes'                 => EE_Dependency_Map::load_from_cache,
484
+			),
485
+			'EE_Messages_Processor'                                                                                       => array(
486
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
487
+			),
488
+			'EE_Messages_Queue'                                                                                           => array(
489
+				'EE_Message_Repository' => EE_Dependency_Map::load_new_object,
490
+			),
491
+			'EE_Messages_Template_Defaults'                                                                               => array(
492
+				'EEM_Message_Template_Group' => EE_Dependency_Map::load_from_cache,
493
+				'EEM_Message_Template'       => EE_Dependency_Map::load_from_cache,
494
+			),
495
+			'EE_Message_To_Generate_From_Request'                                                                         => array(
496
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
497
+				'EE_Request_Handler'          => EE_Dependency_Map::load_from_cache,
498
+			),
499
+			'EventEspresso\core\services\commands\CommandBus'                                                             => array(
500
+				'EventEspresso\core\services\commands\CommandHandlerManager' => EE_Dependency_Map::load_from_cache,
501
+			),
502
+			'EventEspresso\services\commands\CommandHandler'                                                              => array(
503
+				'EE_Registry'         => EE_Dependency_Map::load_from_cache,
504
+				'CommandBusInterface' => EE_Dependency_Map::load_from_cache,
505
+			),
506
+			'EventEspresso\core\services\commands\CommandHandlerManager'                                                  => array(
507
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
508
+			),
509
+			'EventEspresso\core\services\commands\CompositeCommandHandler'                                                => array(
510
+				'EventEspresso\core\services\commands\CommandBus'     => EE_Dependency_Map::load_from_cache,
511
+				'EventEspresso\core\services\commands\CommandFactory' => EE_Dependency_Map::load_from_cache,
512
+			),
513
+			'EventEspresso\core\services\commands\CommandFactory'                                                         => array(
514
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
515
+			),
516
+			'EventEspresso\core\services\commands\middleware\CapChecker'                                                  => array(
517
+				'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
518
+			),
519
+			'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker'                                         => array(
520
+				'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
521
+			),
522
+			'EventEspresso\core\domain\services\capabilities\RegistrationsCapChecker'                                     => array(
523
+				'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
524
+			),
525
+			'EventEspresso\core\services\commands\registration\CreateRegistrationCommandHandler'                          => array(
526
+				'EventEspresso\core\domain\services\registration\CreateRegistrationService' => EE_Dependency_Map::load_from_cache,
527
+			),
528
+			'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommandHandler'                     => array(
529
+				'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
530
+			),
531
+			'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommandHandler'                    => array(
532
+				'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
533
+			),
534
+			'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler'         => array(
535
+				'EventEspresso\core\domain\services\registration\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
536
+			),
537
+			'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler' => array(
538
+				'EventEspresso\core\domain\services\registration\UpdateRegistrationService' => EE_Dependency_Map::load_from_cache,
539
+			),
540
+			'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommandHandler'                              => array(
541
+				'EventEspresso\core\domain\services\ticket\CreateTicketLineItemService' => EE_Dependency_Map::load_from_cache,
542
+			),
543
+			'EventEspresso\core\services\commands\ticket\CancelTicketLineItemCommandHandler'                              => array(
544
+				'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
545
+			),
546
+			'EventEspresso\core\domain\services\registration\CancelRegistrationService'                                   => array(
547
+				'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
548
+			),
549
+			'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler'                                  => array(
550
+				'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
551
+			),
552
+			'EventEspresso\core\services\database\TableManager'                                                           => array(
553
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
554
+			),
555
+			'EE_Data_Migration_Class_Base'                                                                                => array(
556
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
557
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
558
+			),
559
+			'EE_DMS_Core_4_1_0'                                                                                           => array(
560
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
561
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
562
+			),
563
+			'EE_DMS_Core_4_2_0'                                                                                           => array(
564
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
565
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
566
+			),
567
+			'EE_DMS_Core_4_3_0'                                                                                           => array(
568
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
569
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
570
+			),
571
+			'EE_DMS_Core_4_4_0'                                                                                           => array(
572
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
573
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
574
+			),
575
+			'EE_DMS_Core_4_5_0'                                                                                           => array(
576
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
577
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
578
+			),
579
+			'EE_DMS_Core_4_6_0'                                                                                           => array(
580
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
581
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
582
+			),
583
+			'EE_DMS_Core_4_7_0'                                                                                           => array(
584
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
585
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
586
+			),
587
+			'EE_DMS_Core_4_8_0'                                                                                           => array(
588
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
589
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
590
+			),
591
+			'EE_DMS_Core_4_9_0'                                                                                           => array(
592
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
593
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
594
+			),
595
+			'EventEspresso\core\services\assets\I18nRegistry'                                                             => array(
596
+				array(),
597
+				'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
598
+			),
599
+			'EventEspresso\core\services\assets\Registry'                                                                 => array(
600
+				'EE_Template_Config'                              => EE_Dependency_Map::load_from_cache,
601
+				'EE_Currency_Config'                              => EE_Dependency_Map::load_from_cache,
602
+				'EventEspresso\core\services\assets\I18nRegistry' => EE_Dependency_Map::load_from_cache,
603
+				'EventEspresso\core\domain\Domain'                => EE_Dependency_Map::load_from_cache,
604
+			),
605
+			'EventEspresso\core\domain\entities\shortcodes\EspressoCancelled'                                             => array(
606
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
607
+			),
608
+			'EventEspresso\core\domain\entities\shortcodes\EspressoCheckout'                                              => array(
609
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
610
+			),
611
+			'EventEspresso\core\domain\entities\shortcodes\EspressoEventAttendees'                                        => array(
612
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
613
+			),
614
+			'EventEspresso\core\domain\entities\shortcodes\EspressoEvents'                                                => array(
615
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
616
+			),
617
+			'EventEspresso\core\domain\entities\shortcodes\EspressoThankYou'                                              => array(
618
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
619
+			),
620
+			'EventEspresso\core\domain\entities\shortcodes\EspressoTicketSelector'                                        => array(
621
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
622
+			),
623
+			'EventEspresso\core\domain\entities\shortcodes\EspressoTxnPage'                                               => array(
624
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
625
+			),
626
+			'EventEspresso\core\services\cache\BasicCacheManager'                                                         => array(
627
+				'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
628
+			),
629
+			'EventEspresso\core\services\cache\PostRelatedCacheManager'                                                   => array(
630
+				'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
631
+			),
632
+			'EventEspresso\core\domain\services\validation\email\EmailValidationService'                                  => array(
633
+				'EE_Registration_Config'                     => EE_Dependency_Map::load_from_cache,
634
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
635
+			),
636
+			'EventEspresso\core\domain\values\EmailAddress'                                                               => array(
637
+				null,
638
+				'EventEspresso\core\domain\services\validation\email\EmailValidationService' => EE_Dependency_Map::load_from_cache,
639
+			),
640
+			'EventEspresso\core\services\orm\ModelFieldFactory'                                                           => array(
641
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
642
+			),
643
+			'LEGACY_MODELS'                                                                                               => array(
644
+				null,
645
+				'EventEspresso\core\services\database\ModelFieldFactory' => EE_Dependency_Map::load_from_cache,
646
+			),
647
+			'EE_Module_Request_Router'                                                                                    => array(
648
+				'EE_Request' => EE_Dependency_Map::load_from_cache,
649
+			),
650
+			'EE_Registration_Processor'                                                                                   => array(
651
+				'EE_Request' => EE_Dependency_Map::load_from_cache,
652
+			),
653
+			'EventEspresso\core\services\notifications\PersistentAdminNoticeManager'                                      => array(
654
+				null,
655
+				'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
656
+				'EE_Request'                                                          => EE_Dependency_Map::load_from_cache,
657
+			),
658
+			'EventEspresso\core\services\editor\EditorBlockRegistrationManager'      => array(
659
+				'EventEspresso\core\domain\entities\editor\EditorBlockCollection' => EE_Dependency_Map::load_from_cache,
660
+				'EE_Request'                                                      => EE_Dependency_Map::load_from_cache,
661
+				'EventEspresso\core\domain\Domain'                                => EE_Dependency_Map::load_from_cache,
662
+				'EventEspresso\core\services\assets\Registry' => EE_Dependency_Map::load_from_cache
663
+			),
664
+			'EE_Admin_Transactions_List_Table'                                                                            => array(
665
+				null,
666
+				'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache,
667
+			),
668
+			'EventEspresso\core\services\licensing\LicenseService'                                                        => array(
669
+				'EventEspresso\core\domain\services\pue\Stats'  => EE_Dependency_Map::load_from_cache,
670
+				'EventEspresso\core\domain\services\pue\Config' => EE_Dependency_Map::load_from_cache,
671
+			),
672
+			'EventEspresso\core\domain\services\pue\Stats'                                                                => array(
673
+				'EventEspresso\core\domain\services\pue\Config'        => EE_Dependency_Map::load_from_cache,
674
+				'EE_Maintenance_Mode'                                  => EE_Dependency_Map::load_from_cache,
675
+				'EventEspresso\core\domain\services\pue\StatsGatherer' => EE_Dependency_Map::load_from_cache,
676
+			),
677
+			'EventEspresso\core\domain\services\pue\Config'                                                               => array(
678
+				'EE_Network_Config' => EE_Dependency_Map::load_from_cache,
679
+				'EE_Config'         => EE_Dependency_Map::load_from_cache,
680
+			),
681
+			'EventEspresso\core\domain\services\pue\StatsGatherer'                                                        => array(
682
+				'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache,
683
+				'EEM_Event'          => EE_Dependency_Map::load_from_cache,
684
+				'EEM_Datetime'       => EE_Dependency_Map::load_from_cache,
685
+				'EEM_Ticket'         => EE_Dependency_Map::load_from_cache,
686
+				'EEM_Registration'   => EE_Dependency_Map::load_from_cache,
687
+				'EEM_Transaction'    => EE_Dependency_Map::load_from_cache,
688
+				'EE_Config'          => EE_Dependency_Map::load_from_cache,
689
+			),
690
+			'EventEspresso\core\domain\services\admin\ExitModal'                                                          => array(
691
+				'EventEspresso\core\services\assets\Registry' => EE_Dependency_Map::load_from_cache,
692
+			),
693
+			'EventEspresso\core\domain\services\admin\PluginUpsells'                                                      => array(
694
+				'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
695
+			),
696
+			'EventEspresso\caffeinated\modules\recaptcha_invisible\InvisibleRecaptcha'                                    => array(
697
+				'EE_Registration_Config' => EE_Dependency_Map::load_from_cache,
698
+				'EE_Session'             => EE_Dependency_Map::load_from_cache,
699
+			),
700
+			'EventEspresso\caffeinated\modules\recaptcha_invisible\RecaptchaAdminSettings'                                => array(
701
+				'EE_Registration_Config' => EE_Dependency_Map::load_from_cache,
702
+			),
703
+			'EventEspresso\modules\ticket_selector\ProcessTicketSelector'                                                 => array(
704
+				'EE_Core_Config'                                                          => EE_Dependency_Map::load_from_cache,
705
+				'EventEspresso\core\services\request\Request'                             => EE_Dependency_Map::load_from_cache,
706
+				'EE_Session'                                                              => EE_Dependency_Map::load_from_cache,
707
+				'EEM_Ticket'                                                              => EE_Dependency_Map::load_from_cache,
708
+				'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker' => EE_Dependency_Map::load_from_cache,
709
+			),
710
+			'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker'                                     => array(
711
+				'EEM_Datetime' => EE_Dependency_Map::load_from_cache,
712
+			),
713
+			'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions'                              => array(
714
+				'EE_Core_Config'                             => EE_Dependency_Map::load_from_cache,
715
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
716
+			),
717
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes'                                => array(
718
+				'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache,
719
+			),
720
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies'                               => array(
721
+				'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache,
722
+			),
723
+			'EE_CPT_Strategy'                                                                                             => array(
724
+				'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache,
725
+				'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache,
726
+			),
727
+			'EventEspresso\core\services\loaders\ObjectIdentifier'                                                        => array(
728
+				'EventEspresso\core\services\loaders\ClassInterfaceCache' => EE_Dependency_Map::load_from_cache,
729
+			),
730
+		);
731
+	}
732
+
733
+
734
+	/**
735
+	 * Registers how core classes are loaded.
736
+	 * This can either be done by simply providing the name of one of the EE_Registry loader methods such as:
737
+	 *        'EE_Request_Handler' => 'load_core'
738
+	 *        'EE_Messages_Queue'  => 'load_lib'
739
+	 *        'EEH_Debug_Tools'    => 'load_helper'
740
+	 * or, if greater control is required, by providing a custom closure. For example:
741
+	 *        'Some_Class' => function () {
742
+	 *            return new Some_Class();
743
+	 *        },
744
+	 * This is required for instantiating dependencies
745
+	 * where an interface has been type hinted in a class constructor. For example:
746
+	 *        'Required_Interface' => function () {
747
+	 *            return new A_Class_That_Implements_Required_Interface();
748
+	 *        },
749
+	 *
750
+	 */
751
+	protected function _register_core_class_loaders()
752
+	{
753
+		// for PHP5.3 compat, we need to register any properties called here in a variable because `$this` cannot
754
+		// be used in a closure.
755
+		$request = &$this->request;
756
+		$response = &$this->response;
757
+		$legacy_request = &$this->legacy_request;
758
+		// $loader = &$this->loader;
759
+		$this->_class_loaders = array(
760
+			// load_core
761
+			'EE_Capabilities'                              => 'load_core',
762
+			'EE_Encryption'                                => 'load_core',
763
+			'EE_Front_Controller'                          => 'load_core',
764
+			'EE_Module_Request_Router'                     => 'load_core',
765
+			'EE_Registry'                                  => 'load_core',
766
+			'EE_Request'                                   => function () use (&$legacy_request) {
767
+				return $legacy_request;
768
+			},
769
+			'EventEspresso\core\services\request\Request'  => function () use (&$request) {
770
+				return $request;
771
+			},
772
+			'EventEspresso\core\services\request\Response' => function () use (&$response) {
773
+				return $response;
774
+			},
775
+			'EE_Base'                                      => 'load_core',
776
+			'EE_Request_Handler'                           => 'load_core',
777
+			'EE_Session'                                   => 'load_core',
778
+			'EE_Cron_Tasks'                                => 'load_core',
779
+			'EE_System'                                    => 'load_core',
780
+			'EE_Maintenance_Mode'                          => 'load_core',
781
+			'EE_Register_CPTs'                             => 'load_core',
782
+			'EE_Admin'                                     => 'load_core',
783
+			'EE_CPT_Strategy'                              => 'load_core',
784
+			// load_lib
785
+			'EE_Message_Resource_Manager'                  => 'load_lib',
786
+			'EE_Message_Type_Collection'                   => 'load_lib',
787
+			'EE_Message_Type_Collection_Loader'            => 'load_lib',
788
+			'EE_Messenger_Collection'                      => 'load_lib',
789
+			'EE_Messenger_Collection_Loader'               => 'load_lib',
790
+			'EE_Messages_Processor'                        => 'load_lib',
791
+			'EE_Message_Repository'                        => 'load_lib',
792
+			'EE_Messages_Queue'                            => 'load_lib',
793
+			'EE_Messages_Data_Handler_Collection'          => 'load_lib',
794
+			'EE_Message_Template_Group_Collection'         => 'load_lib',
795
+			'EE_Payment_Method_Manager'                    => 'load_lib',
796
+			'EE_Messages_Generator'                        => function () {
797
+				return EE_Registry::instance()->load_lib(
798
+					'Messages_Generator',
799
+					array(),
800
+					false,
801
+					false
802
+				);
803
+			},
804
+			'EE_Messages_Template_Defaults'                => function ($arguments = array()) {
805
+				return EE_Registry::instance()->load_lib(
806
+					'Messages_Template_Defaults',
807
+					$arguments,
808
+					false,
809
+					false
810
+				);
811
+			},
812
+			// load_helper
813
+			'EEH_Parse_Shortcodes'                         => function () {
814
+				if (EE_Registry::instance()->load_helper('Parse_Shortcodes')) {
815
+					return new EEH_Parse_Shortcodes();
816
+				}
817
+				return null;
818
+			},
819
+			'EE_Template_Config'                           => function () {
820
+				return EE_Config::instance()->template_settings;
821
+			},
822
+			'EE_Currency_Config'                           => function () {
823
+				return EE_Config::instance()->currency;
824
+			},
825
+			'EE_Registration_Config'                       => function () {
826
+				return EE_Config::instance()->registration;
827
+			},
828
+			'EE_Core_Config'                               => function () {
829
+				return EE_Config::instance()->core;
830
+			},
831
+			'EventEspresso\core\services\loaders\Loader'   => function () {
832
+				return LoaderFactory::getLoader();
833
+			},
834
+			'EE_Network_Config'                            => function () {
835
+				return EE_Network_Config::instance();
836
+			},
837
+			'EE_Config'                                    => function () {
838
+				return EE_Config::instance();
839
+			},
840
+			'EventEspresso\core\domain\Domain'             => function () {
841
+				return DomainFactory::getEventEspressoCoreDomain();
842
+			},
843
+		);
844
+	}
845
+
846
+
847
+	/**
848
+	 * can be used for supplying alternate names for classes,
849
+	 * or for connecting interface names to instantiable classes
850
+	 */
851
+	protected function _register_core_aliases()
852
+	{
853
+		$aliases = array(
854
+			'CommandBusInterface'                                                          => 'EventEspresso\core\services\commands\CommandBusInterface',
855
+			'EventEspresso\core\services\commands\CommandBusInterface'                     => 'EventEspresso\core\services\commands\CommandBus',
856
+			'CommandHandlerManagerInterface'                                               => 'EventEspresso\core\services\commands\CommandHandlerManagerInterface',
857
+			'EventEspresso\core\services\commands\CommandHandlerManagerInterface'          => 'EventEspresso\core\services\commands\CommandHandlerManager',
858
+			'CapChecker'                                                                   => 'EventEspresso\core\services\commands\middleware\CapChecker',
859
+			'AddActionHook'                                                                => 'EventEspresso\core\services\commands\middleware\AddActionHook',
860
+			'CapabilitiesChecker'                                                          => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
861
+			'CapabilitiesCheckerInterface'                                                 => 'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface',
862
+			'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface' => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
863
+			'CreateRegistrationService'                                                    => 'EventEspresso\core\domain\services\registration\CreateRegistrationService',
864
+			'CreateRegistrationCommandHandler'                                             => 'EventEspresso\core\services\commands\registration\CreateRegistrationCommand',
865
+			'CopyRegistrationDetailsCommandHandler'                                        => 'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommand',
866
+			'CopyRegistrationPaymentsCommandHandler'                                       => 'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommand',
867
+			'CancelRegistrationAndTicketLineItemCommandHandler'                            => 'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler',
868
+			'UpdateRegistrationAndTransactionAfterChangeCommandHandler'                    => 'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler',
869
+			'CreateTicketLineItemCommandHandler'                                           => 'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommand',
870
+			'CreateTransactionCommandHandler'                                              => 'EventEspresso\core\services\commands\transaction\CreateTransactionCommandHandler',
871
+			'CreateAttendeeCommandHandler'                                                 => 'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler',
872
+			'TableManager'                                                                 => 'EventEspresso\core\services\database\TableManager',
873
+			'TableAnalysis'                                                                => 'EventEspresso\core\services\database\TableAnalysis',
874
+			'EspressoShortcode'                                                            => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
875
+			'ShortcodeInterface'                                                           => 'EventEspresso\core\services\shortcodes\ShortcodeInterface',
876
+			'EventEspresso\core\services\shortcodes\ShortcodeInterface'                    => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
877
+			'EventEspresso\core\services\cache\CacheStorageInterface'                      => 'EventEspresso\core\services\cache\TransientCacheStorage',
878
+			'LoaderInterface'                                                              => 'EventEspresso\core\services\loaders\LoaderInterface',
879
+			'EventEspresso\core\services\loaders\LoaderInterface'                          => 'EventEspresso\core\services\loaders\Loader',
880
+			'CommandFactoryInterface'                                                      => 'EventEspresso\core\services\commands\CommandFactoryInterface',
881
+			'EventEspresso\core\services\commands\CommandFactoryInterface'                 => 'EventEspresso\core\services\commands\CommandFactory',
882
+			'EventEspresso\core\domain\services\session\SessionIdentifierInterface'        => 'EE_Session',
883
+			'EmailValidatorInterface'                                                      => 'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface',
884
+			'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface'  => 'EventEspresso\core\domain\services\validation\email\EmailValidationService',
885
+			'NoticeConverterInterface'                                                     => 'EventEspresso\core\services\notices\NoticeConverterInterface',
886
+			'EventEspresso\core\services\notices\NoticeConverterInterface'                 => 'EventEspresso\core\services\notices\ConvertNoticesToEeErrors',
887
+			'NoticesContainerInterface'                                                    => 'EventEspresso\core\services\notices\NoticesContainerInterface',
888
+			'EventEspresso\core\services\notices\NoticesContainerInterface'                => 'EventEspresso\core\services\notices\NoticesContainer',
889
+			'EventEspresso\core\services\request\RequestInterface'                         => 'EventEspresso\core\services\request\Request',
890
+			'EventEspresso\core\services\request\ResponseInterface'                        => 'EventEspresso\core\services\request\Response',
891
+			'EventEspresso\core\domain\DomainInterface'                                    => 'EventEspresso\core\domain\Domain',
892
+		);
893
+		foreach ($aliases as $alias => $fqn) {
894
+			if (is_array($fqn)) {
895
+				foreach ($fqn as $class => $for_class) {
896
+					$this->class_cache->addAlias($class, $alias, $for_class);
897
+				}
898
+				continue;
899
+			}
900
+			$this->class_cache->addAlias($fqn, $alias);
901
+		}
902
+		if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
903
+			$this->class_cache->addAlias(
904
+				'EventEspresso\core\services\notices\ConvertNoticesToAdminNotices',
905
+				'EventEspresso\core\services\notices\NoticeConverterInterface'
906
+			);
907
+		}
908
+	}
909
+
910
+
911
+	/**
912
+	 * This is used to reset the internal map and class_loaders to their original default state at the beginning of the
913
+	 * request Primarily used by unit tests.
914
+	 */
915
+	public function reset()
916
+	{
917
+		$this->_register_core_class_loaders();
918
+		$this->_register_core_dependencies();
919
+	}
920
+
921
+
922
+	/**
923
+	 * PLZ NOTE: a better name for this method would be is_alias()
924
+	 * because it returns TRUE if the provided fully qualified name IS an alias
925
+	 * WHY?
926
+	 * Because if a class is type hinting for a concretion,
927
+	 * then why would we need to find another class to supply it?
928
+	 * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`,
929
+	 * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`.
930
+	 * Don't go looking for some substitute.
931
+	 * Whereas if a class is type hinting for an interface...
932
+	 * then we need to find an actual class to use.
933
+	 * So the interface IS the alias for some other FQN,
934
+	 * and we need to find out if `Fully/Qualified/Namespace/SomeInterface`
935
+	 * represents some other class.
936
+	 *
937
+	 * @deprecated $VID:$
938
+	 * @param string $fqn
939
+	 * @param string $for_class
940
+	 * @return bool
941
+	 */
942
+	public function has_alias($fqn = '', $for_class = '')
943
+	{
944
+		return $this->isAlias($fqn, $for_class);
945
+	}
946
+
947
+
948
+	/**
949
+	 * PLZ NOTE: a better name for this method would be get_fqn_for_alias()
950
+	 * because it returns a FQN for provided alias if one exists, otherwise returns the original $alias
951
+	 * functions recursively, so that multiple aliases can be used to drill down to a FQN
952
+	 *  for example:
953
+	 *      if the following two entries were added to the _aliases array:
954
+	 *          array(
955
+	 *              'interface_alias'           => 'some\namespace\interface'
956
+	 *              'some\namespace\interface'  => 'some\namespace\classname'
957
+	 *          )
958
+	 *      then one could use EE_Registry::instance()->create( 'interface_alias' )
959
+	 *      to load an instance of 'some\namespace\classname'
960
+	 *
961
+	 * @deprecated $VID:$
962
+	 * @param string $alias
963
+	 * @param string $for_class
964
+	 * @return string
965
+	 */
966
+	public function get_alias($alias = '', $for_class = '')
967
+	{
968
+		return $this->getFqnForAlias($alias, $for_class);
969
+	}
970 970
 }
Please login to merge, or discard this patch.
core/EE_System.core.php 2 patches
Spacing   +30 added lines, -30 removed lines patch added patch discarded remove patch
@@ -143,7 +143,7 @@  discard block
 block discarded – undo
143 143
         EE_Maintenance_Mode $maintenance_mode = null
144 144
     ) {
145 145
         // check if class object is instantiated
146
-        if (! self::$_instance instanceof EE_System) {
146
+        if ( ! self::$_instance instanceof EE_System) {
147 147
             self::$_instance = new self($registry, $loader, $request, $maintenance_mode);
148 148
         }
149 149
         return self::$_instance;
@@ -260,7 +260,7 @@  discard block
 block discarded – undo
260 260
         $this->capabilities = $this->loader->getShared('EE_Capabilities');
261 261
         add_action(
262 262
             'AHEE__EE_Capabilities__init_caps__before_initialization',
263
-            function () {
263
+            function() {
264 264
                 LoaderFactory::getLoader()->getShared('EE_Payment_Method_Manager');
265 265
             }
266 266
         );
@@ -301,7 +301,7 @@  discard block
 block discarded – undo
301 301
     {
302 302
         // set autoloaders for all of the classes implementing EEI_Plugin_API
303 303
         // which provide helpers for EE plugin authors to more easily register certain components with EE.
304
-        EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
304
+        EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES.'plugin_api');
305 305
         $this->loader->getShared('EE_Request_Handler');
306 306
     }
307 307
 
@@ -321,14 +321,14 @@  discard block
 block discarded – undo
321 321
         $load_callback,
322 322
         $plugin_file_constant
323 323
     ) {
324
-        if (! defined($version_constant)) {
324
+        if ( ! defined($version_constant)) {
325 325
             return;
326 326
         }
327 327
         $addon_version = constant($version_constant);
328 328
         if ($addon_version && version_compare($addon_version, $min_version_required, '<')) {
329 329
             remove_action('AHEE__EE_System__load_espresso_addons', $load_callback);
330
-            if (! function_exists('deactivate_plugins')) {
331
-                require_once ABSPATH . 'wp-admin/includes/plugin.php';
330
+            if ( ! function_exists('deactivate_plugins')) {
331
+                require_once ABSPATH.'wp-admin/includes/plugin.php';
332 332
             }
333 333
             deactivate_plugins(plugin_basename(constant($plugin_file_constant)));
334 334
             unset($_GET['activate'], $_REQUEST['activate'], $_GET['activate-multi'], $_REQUEST['activate-multi']);
@@ -342,7 +342,7 @@  discard block
 block discarded – undo
342 342
                     $min_version_required
343 343
                 ),
344 344
                 __FILE__,
345
-                __FUNCTION__ . "({$addon_name})",
345
+                __FUNCTION__."({$addon_name})",
346 346
                 __LINE__
347 347
             );
348 348
             EE_Error::get_notices(false, true);
@@ -392,7 +392,7 @@  discard block
 block discarded – undo
392 392
                 true
393 393
             )
394 394
         ) {
395
-            include_once EE_THIRD_PARTY . 'wp-api-basic-auth' . DS . 'basic-auth.php';
395
+            include_once EE_THIRD_PARTY.'wp-api-basic-auth'.DS.'basic-auth.php';
396 396
         }
397 397
         do_action('AHEE__EE_System__load_espresso_addons__complete');
398 398
     }
@@ -494,11 +494,11 @@  discard block
 block discarded – undo
494 494
     private function fix_espresso_db_upgrade_option($espresso_db_update = null)
495 495
     {
496 496
         do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__begin', $espresso_db_update);
497
-        if (! $espresso_db_update) {
497
+        if ( ! $espresso_db_update) {
498 498
             $espresso_db_update = get_option('espresso_db_update');
499 499
         }
500 500
         // check that option is an array
501
-        if (! is_array($espresso_db_update)) {
501
+        if ( ! is_array($espresso_db_update)) {
502 502
             // if option is FALSE, then it never existed
503 503
             if ($espresso_db_update === false) {
504 504
                 // make $espresso_db_update an array and save option with autoload OFF
@@ -518,10 +518,10 @@  discard block
 block discarded – undo
518 518
                     // so it must be numerically-indexed, where values are versions installed...
519 519
                     // fix it!
520 520
                     $version_string = $should_be_array;
521
-                    $corrected_db_update[ $version_string ] = array('unknown-date');
521
+                    $corrected_db_update[$version_string] = array('unknown-date');
522 522
                 } else {
523 523
                     // ok it checks out
524
-                    $corrected_db_update[ $should_be_version_string ] = $should_be_array;
524
+                    $corrected_db_update[$should_be_version_string] = $should_be_array;
525 525
                 }
526 526
             }
527 527
             $espresso_db_update = $corrected_db_update;
@@ -604,13 +604,13 @@  discard block
 block discarded – undo
604 604
      */
605 605
     public function update_list_of_installed_versions($version_history = null, $current_version_to_add = null)
606 606
     {
607
-        if (! $version_history) {
607
+        if ( ! $version_history) {
608 608
             $version_history = $this->fix_espresso_db_upgrade_option($version_history);
609 609
         }
610 610
         if ($current_version_to_add === null) {
611 611
             $current_version_to_add = espresso_version();
612 612
         }
613
-        $version_history[ $current_version_to_add ][] = date('Y-m-d H:i:s', time());
613
+        $version_history[$current_version_to_add][] = date('Y-m-d H:i:s', time());
614 614
         // re-save
615 615
         return update_option('espresso_db_update', $version_history);
616 616
     }
@@ -700,7 +700,7 @@  discard block
 block discarded – undo
700 700
         if ($activation_history_for_addon) {
701 701
             // it exists, so this isn't a completely new install
702 702
             // check if this version already in that list of previously installed versions
703
-            if (! isset($activation_history_for_addon[ $version_to_upgrade_to ])) {
703
+            if ( ! isset($activation_history_for_addon[$version_to_upgrade_to])) {
704 704
                 // it a version we haven't seen before
705 705
                 if ($version_is_higher === 1) {
706 706
                     $req_type = EE_System::req_type_upgrade;
@@ -778,7 +778,7 @@  discard block
 block discarded – undo
778 778
             foreach ($activation_history as $version => $times_activated) {
779 779
                 // check there is a record of when this version was activated. Otherwise,
780 780
                 // mark it as unknown
781
-                if (! $times_activated) {
781
+                if ( ! $times_activated) {
782 782
                     $times_activated = array('unknown-date');
783 783
                 }
784 784
                 if (is_string($times_activated)) {
@@ -809,7 +809,7 @@  discard block
 block discarded – undo
809 809
     {
810 810
         $notices = EE_Error::get_notices(false);
811 811
         // if current user is an admin and it's not an ajax or rest request
812
-        if (! isset($notices['errors'])
812
+        if ( ! isset($notices['errors'])
813 813
             && $this->request->isAdmin()
814 814
             && apply_filters(
815 815
                 'FHEE__EE_System__redirect_to_about_ee__do_redirect',
@@ -878,7 +878,7 @@  discard block
 block discarded – undo
878 878
     private function _parse_model_names()
879 879
     {
880 880
         // get all the files in the EE_MODELS folder that end in .model.php
881
-        $models = glob(EE_MODELS . '*.model.php');
881
+        $models = glob(EE_MODELS.'*.model.php');
882 882
         $model_names = array();
883 883
         $non_abstract_db_models = array();
884 884
         foreach ($models as $model) {
@@ -887,9 +887,9 @@  discard block
 block discarded – undo
887 887
             $short_name = str_replace('EEM_', '', $classname);
888 888
             $reflectionClass = new ReflectionClass($classname);
889 889
             if ($reflectionClass->isSubclassOf('EEM_Base') && ! $reflectionClass->isAbstract()) {
890
-                $non_abstract_db_models[ $short_name ] = $classname;
890
+                $non_abstract_db_models[$short_name] = $classname;
891 891
             }
892
-            $model_names[ $short_name ] = $classname;
892
+            $model_names[$short_name] = $classname;
893 893
         }
894 894
         $this->registry->models = apply_filters('FHEE__EE_System__parse_model_names', $model_names);
895 895
         $this->registry->non_abstract_db_models = apply_filters(
@@ -924,7 +924,7 @@  discard block
 block discarded – undo
924 924
             )
925 925
         );
926 926
         if ($domain->isCaffeinated()) {
927
-            require_once EE_CAFF_PATH . 'brewing_regular.php';
927
+            require_once EE_CAFF_PATH.'brewing_regular.php';
928 928
         }
929 929
     }
930 930
 
@@ -987,7 +987,7 @@  discard block
 block discarded – undo
987 987
         $class_names = EEH_Class_Tools::get_class_names_for_all_callbacks_on_hook(
988 988
             'AHEE__EE_System__register_shortcodes_modules_and_addons'
989 989
         );
990
-        if (! empty($class_names)) {
990
+        if ( ! empty($class_names)) {
991 991
             $msg = __(
992 992
                 'The following plugins, addons, or modules appear to be incompatible with this version of Event Espresso and were automatically deactivated to avoid fatal errors:',
993 993
                 'event_espresso'
@@ -999,7 +999,7 @@  discard block
 block discarded – undo
999 999
                             array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'),
1000 1000
                             '',
1001 1001
                             $class_name
1002
-                        ) . '</b></li>';
1002
+                        ).'</b></li>';
1003 1003
             }
1004 1004
             $msg .= '</ul>';
1005 1005
             $msg .= __(
@@ -1068,7 +1068,7 @@  discard block
 block discarded – undo
1068 1068
     private function _deactivate_incompatible_addons()
1069 1069
     {
1070 1070
         $incompatible_addons = get_option('ee_incompatible_addons', array());
1071
-        if (! empty($incompatible_addons)) {
1071
+        if ( ! empty($incompatible_addons)) {
1072 1072
             $active_plugins = get_option('active_plugins', array());
1073 1073
             foreach ($active_plugins as $active_plugin) {
1074 1074
                 foreach ($incompatible_addons as $incompatible_addon) {
@@ -1135,7 +1135,7 @@  discard block
 block discarded – undo
1135 1135
     {
1136 1136
         do_action('AHEE__EE_System__load_controllers__start');
1137 1137
         // let's get it started
1138
-        if (! $this->maintenance_mode->level()
1138
+        if ( ! $this->maintenance_mode->level()
1139 1139
             && ($this->request->isFrontend() || $this->request->isFrontAjax())
1140 1140
         ) {
1141 1141
             do_action('AHEE__EE_System__load_controllers__load_front_controllers');
@@ -1165,7 +1165,7 @@  discard block
 block discarded – undo
1165 1165
         }
1166 1166
         do_action('AHEE__EE_System__core_loaded_and_ready');
1167 1167
         // load_espresso_template_tags
1168
-        if (is_readable(EE_PUBLIC . 'template_tags.php')
1168
+        if (is_readable(EE_PUBLIC.'template_tags.php')
1169 1169
             && (
1170 1170
                 $this->request->isFrontend()
1171 1171
                 || $this->request->isAdmin()
@@ -1173,7 +1173,7 @@  discard block
 block discarded – undo
1173 1173
                 || $this->request->isFeed()
1174 1174
             )
1175 1175
         ) {
1176
-            require_once EE_PUBLIC . 'template_tags.php';
1176
+            require_once EE_PUBLIC.'template_tags.php';
1177 1177
         }
1178 1178
         do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
1179 1179
         if ($this->request->isAdmin() || $this->request->isFrontend() || $this->request->isIframe()) {
@@ -1238,13 +1238,13 @@  discard block
 block discarded – undo
1238 1238
     public static function do_not_cache()
1239 1239
     {
1240 1240
         // set no cache constants
1241
-        if (! defined('DONOTCACHEPAGE')) {
1241
+        if ( ! defined('DONOTCACHEPAGE')) {
1242 1242
             define('DONOTCACHEPAGE', true);
1243 1243
         }
1244
-        if (! defined('DONOTCACHCEOBJECT')) {
1244
+        if ( ! defined('DONOTCACHCEOBJECT')) {
1245 1245
             define('DONOTCACHCEOBJECT', true);
1246 1246
         }
1247
-        if (! defined('DONOTCACHEDB')) {
1247
+        if ( ! defined('DONOTCACHEDB')) {
1248 1248
             define('DONOTCACHEDB', true);
1249 1249
         }
1250 1250
         // add no cache headers
Please login to merge, or discard this patch.
Indentation   +1256 added lines, -1256 removed lines patch added patch discarded remove patch
@@ -28,1260 +28,1260 @@
 block discarded – undo
28 28
 {
29 29
 
30 30
 
31
-    /**
32
-     * indicates this is a 'normal' request. Ie, not activation, nor upgrade, nor activation.
33
-     * So examples of this would be a normal GET request on the frontend or backend, or a POST, etc
34
-     */
35
-    const req_type_normal = 0;
36
-
37
-    /**
38
-     * Indicates this is a brand new installation of EE so we should install
39
-     * tables and default data etc
40
-     */
41
-    const req_type_new_activation = 1;
42
-
43
-    /**
44
-     * we've detected that EE has been reactivated (or EE was activated during maintenance mode,
45
-     * and we just exited maintenance mode). We MUST check the database is setup properly
46
-     * and that default data is setup too
47
-     */
48
-    const req_type_reactivation = 2;
49
-
50
-    /**
51
-     * indicates that EE has been upgraded since its previous request.
52
-     * We may have data migration scripts to call and will want to trigger maintenance mode
53
-     */
54
-    const req_type_upgrade = 3;
55
-
56
-    /**
57
-     * TODO  will detect that EE has been DOWNGRADED. We probably don't want to run in this case...
58
-     */
59
-    const req_type_downgrade = 4;
60
-
61
-    /**
62
-     * @deprecated since version 4.6.0.dev.006
63
-     * Now whenever a new_activation is detected the request type is still just
64
-     * new_activation (same for reactivation, upgrade, downgrade etc), but if we'r ein maintenance mode
65
-     * EE_System::initialize_db_if_no_migrations_required and EE_Addon::initialize_db_if_no_migrations_required
66
-     * will instead enqueue that EE plugin's db initialization for when we're taken out of maintenance mode.
67
-     * (Specifically, when the migration manager indicates migrations are finished
68
-     * EE_Data_Migration_Manager::initialize_db_for_enqueued_ee_plugins() will be called)
69
-     */
70
-    const req_type_activation_but_not_installed = 5;
71
-
72
-    /**
73
-     * option prefix for recording the activation history (like core's "espresso_db_update") of addons
74
-     */
75
-    const addon_activation_history_option_prefix = 'ee_addon_activation_history_';
76
-
77
-
78
-    /**
79
-     * @var EE_System $_instance
80
-     */
81
-    private static $_instance;
82
-
83
-    /**
84
-     * @var EE_Registry $registry
85
-     */
86
-    private $registry;
87
-
88
-    /**
89
-     * @var LoaderInterface $loader
90
-     */
91
-    private $loader;
92
-
93
-    /**
94
-     * @var EE_Capabilities $capabilities
95
-     */
96
-    private $capabilities;
97
-
98
-    /**
99
-     * @var RequestInterface $request
100
-     */
101
-    private $request;
102
-
103
-    /**
104
-     * @var EE_Maintenance_Mode $maintenance_mode
105
-     */
106
-    private $maintenance_mode;
107
-
108
-    /**
109
-     * Stores which type of request this is, options being one of the constants on EE_System starting with req_type_*.
110
-     * It can be a brand-new activation, a reactivation, an upgrade, a downgrade, or a normal request.
111
-     *
112
-     * @var int $_req_type
113
-     */
114
-    private $_req_type;
115
-
116
-    /**
117
-     * Whether or not there was a non-micro version change in EE core version during this request
118
-     *
119
-     * @var boolean $_major_version_change
120
-     */
121
-    private $_major_version_change = false;
122
-
123
-    /**
124
-     * A Context DTO dedicated solely to identifying the current request type.
125
-     *
126
-     * @var RequestTypeContextCheckerInterface $request_type
127
-     */
128
-    private $request_type;
129
-
130
-
131
-    /**
132
-     * @singleton method used to instantiate class object
133
-     * @param EE_Registry|null         $registry
134
-     * @param LoaderInterface|null     $loader
135
-     * @param RequestInterface|null    $request
136
-     * @param EE_Maintenance_Mode|null $maintenance_mode
137
-     * @return EE_System
138
-     */
139
-    public static function instance(
140
-        EE_Registry $registry = null,
141
-        LoaderInterface $loader = null,
142
-        RequestInterface $request = null,
143
-        EE_Maintenance_Mode $maintenance_mode = null
144
-    ) {
145
-        // check if class object is instantiated
146
-        if (! self::$_instance instanceof EE_System) {
147
-            self::$_instance = new self($registry, $loader, $request, $maintenance_mode);
148
-        }
149
-        return self::$_instance;
150
-    }
151
-
152
-
153
-    /**
154
-     * resets the instance and returns it
155
-     *
156
-     * @return EE_System
157
-     */
158
-    public static function reset()
159
-    {
160
-        self::$_instance->_req_type = null;
161
-        // make sure none of the old hooks are left hanging around
162
-        remove_all_actions('AHEE__EE_System__perform_activations_upgrades_and_migrations');
163
-        // we need to reset the migration manager in order for it to detect DMSs properly
164
-        EE_Data_Migration_Manager::reset();
165
-        self::instance()->detect_activations_or_upgrades();
166
-        self::instance()->perform_activations_upgrades_and_migrations();
167
-        return self::instance();
168
-    }
169
-
170
-
171
-    /**
172
-     * sets hooks for running rest of system
173
-     * provides "AHEE__EE_System__construct__complete" hook for EE Addons to use as their starting point
174
-     * starting EE Addons from any other point may lead to problems
175
-     *
176
-     * @param EE_Registry         $registry
177
-     * @param LoaderInterface     $loader
178
-     * @param RequestInterface    $request
179
-     * @param EE_Maintenance_Mode $maintenance_mode
180
-     */
181
-    private function __construct(
182
-        EE_Registry $registry,
183
-        LoaderInterface $loader,
184
-        RequestInterface $request,
185
-        EE_Maintenance_Mode $maintenance_mode
186
-    ) {
187
-        $this->registry = $registry;
188
-        $this->loader = $loader;
189
-        $this->request = $request;
190
-        $this->maintenance_mode = $maintenance_mode;
191
-        do_action('AHEE__EE_System__construct__begin', $this);
192
-        add_action(
193
-            'AHEE__EE_Bootstrap__load_espresso_addons',
194
-            array($this, 'loadCapabilities'),
195
-            5
196
-        );
197
-        add_action(
198
-            'AHEE__EE_Bootstrap__load_espresso_addons',
199
-            array($this, 'loadCommandBus'),
200
-            7
201
-        );
202
-        add_action(
203
-            'AHEE__EE_Bootstrap__load_espresso_addons',
204
-            array($this, 'loadPluginApi'),
205
-            9
206
-        );
207
-        // allow addons to load first so that they can register autoloaders, set hooks for running DMS's, etc
208
-        add_action(
209
-            'AHEE__EE_Bootstrap__load_espresso_addons',
210
-            array($this, 'load_espresso_addons')
211
-        );
212
-        // when an ee addon is activated, we want to call the core hook(s) again
213
-        // because the newly-activated addon didn't get a chance to run at all
214
-        add_action('activate_plugin', array($this, 'load_espresso_addons'), 1);
215
-        // detect whether install or upgrade
216
-        add_action(
217
-            'AHEE__EE_Bootstrap__detect_activations_or_upgrades',
218
-            array($this, 'detect_activations_or_upgrades'),
219
-            3
220
-        );
221
-        // load EE_Config, EE_Textdomain, etc
222
-        add_action(
223
-            'AHEE__EE_Bootstrap__load_core_configuration',
224
-            array($this, 'load_core_configuration'),
225
-            5
226
-        );
227
-        // load EE_Config, EE_Textdomain, etc
228
-        add_action(
229
-            'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets',
230
-            array($this, 'register_shortcodes_modules_and_widgets'),
231
-            7
232
-        );
233
-        // you wanna get going? I wanna get going... let's get going!
234
-        add_action(
235
-            'AHEE__EE_Bootstrap__brew_espresso',
236
-            array($this, 'brew_espresso'),
237
-            9
238
-        );
239
-        // other housekeeping
240
-        // exclude EE critical pages from wp_list_pages
241
-        add_filter(
242
-            'wp_list_pages_excludes',
243
-            array($this, 'remove_pages_from_wp_list_pages'),
244
-            10
245
-        );
246
-        // ALL EE Addons should use the following hook point to attach their initial setup too
247
-        // it's extremely important for EE Addons to register any class autoloaders so that they can be available when the EE_Config loads
248
-        do_action('AHEE__EE_System__construct__complete', $this);
249
-    }
250
-
251
-
252
-    /**
253
-     * load and setup EE_Capabilities
254
-     *
255
-     * @return void
256
-     * @throws EE_Error
257
-     */
258
-    public function loadCapabilities()
259
-    {
260
-        $this->capabilities = $this->loader->getShared('EE_Capabilities');
261
-        add_action(
262
-            'AHEE__EE_Capabilities__init_caps__before_initialization',
263
-            function () {
264
-                LoaderFactory::getLoader()->getShared('EE_Payment_Method_Manager');
265
-            }
266
-        );
267
-    }
268
-
269
-
270
-    /**
271
-     * create and cache the CommandBus, and also add middleware
272
-     * The CapChecker middleware requires the use of EE_Capabilities
273
-     * which is why we need to load the CommandBus after Caps are set up
274
-     *
275
-     * @return void
276
-     * @throws EE_Error
277
-     */
278
-    public function loadCommandBus()
279
-    {
280
-        $this->loader->getShared(
281
-            'CommandBusInterface',
282
-            array(
283
-                null,
284
-                apply_filters(
285
-                    'FHEE__EE_Load_Espresso_Core__handle_request__CommandBus_middleware',
286
-                    array(
287
-                        $this->loader->getShared('EventEspresso\core\services\commands\middleware\CapChecker'),
288
-                        $this->loader->getShared('EventEspresso\core\services\commands\middleware\AddActionHook'),
289
-                    )
290
-                ),
291
-            )
292
-        );
293
-    }
294
-
295
-
296
-    /**
297
-     * @return void
298
-     * @throws EE_Error
299
-     */
300
-    public function loadPluginApi()
301
-    {
302
-        // set autoloaders for all of the classes implementing EEI_Plugin_API
303
-        // which provide helpers for EE plugin authors to more easily register certain components with EE.
304
-        EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
305
-        $this->loader->getShared('EE_Request_Handler');
306
-    }
307
-
308
-
309
-    /**
310
-     * @param string $addon_name
311
-     * @param string $version_constant
312
-     * @param string $min_version_required
313
-     * @param string $load_callback
314
-     * @param string $plugin_file_constant
315
-     * @return void
316
-     */
317
-    private function deactivateIncompatibleAddon(
318
-        $addon_name,
319
-        $version_constant,
320
-        $min_version_required,
321
-        $load_callback,
322
-        $plugin_file_constant
323
-    ) {
324
-        if (! defined($version_constant)) {
325
-            return;
326
-        }
327
-        $addon_version = constant($version_constant);
328
-        if ($addon_version && version_compare($addon_version, $min_version_required, '<')) {
329
-            remove_action('AHEE__EE_System__load_espresso_addons', $load_callback);
330
-            if (! function_exists('deactivate_plugins')) {
331
-                require_once ABSPATH . 'wp-admin/includes/plugin.php';
332
-            }
333
-            deactivate_plugins(plugin_basename(constant($plugin_file_constant)));
334
-            unset($_GET['activate'], $_REQUEST['activate'], $_GET['activate-multi'], $_REQUEST['activate-multi']);
335
-            EE_Error::add_error(
336
-                sprintf(
337
-                    esc_html__(
338
-                        'We\'re sorry, but the Event Espresso %1$s addon was deactivated because version %2$s or higher is required with this version of Event Espresso core.',
339
-                        'event_espresso'
340
-                    ),
341
-                    $addon_name,
342
-                    $min_version_required
343
-                ),
344
-                __FILE__,
345
-                __FUNCTION__ . "({$addon_name})",
346
-                __LINE__
347
-            );
348
-            EE_Error::get_notices(false, true);
349
-        }
350
-    }
351
-
352
-
353
-    /**
354
-     * load_espresso_addons
355
-     * allow addons to load first so that they can set hooks for running DMS's, etc
356
-     * this is hooked into both:
357
-     *    'AHEE__EE_Bootstrap__load_core_configuration'
358
-     *        which runs during the WP 'plugins_loaded' action at priority 5
359
-     *    and the WP 'activate_plugin' hook point
360
-     *
361
-     * @access public
362
-     * @return void
363
-     */
364
-    public function load_espresso_addons()
365
-    {
366
-        $this->deactivateIncompatibleAddon(
367
-            'Wait Lists',
368
-            'EE_WAIT_LISTS_VERSION',
369
-            '1.0.0.beta.074',
370
-            'load_espresso_wait_lists',
371
-            'EE_WAIT_LISTS_PLUGIN_FILE'
372
-        );
373
-        $this->deactivateIncompatibleAddon(
374
-            'Automated Upcoming Event Notifications',
375
-            'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_VERSION',
376
-            '1.0.0.beta.091',
377
-            'load_espresso_automated_upcoming_event_notification',
378
-            'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_PLUGIN_FILE'
379
-        );
380
-        do_action('AHEE__EE_System__load_espresso_addons');
381
-        // if the WP API basic auth plugin isn't already loaded, load it now.
382
-        // We want it for mobile apps. Just include the entire plugin
383
-        // also, don't load the basic auth when a plugin is getting activated, because
384
-        // it could be the basic auth plugin, and it doesn't check if its methods are already defined
385
-        // and causes a fatal error
386
-        if ($this->request->getRequestParam('activate') !== 'true'
387
-            && ! function_exists('json_basic_auth_handler')
388
-            && ! function_exists('json_basic_auth_error')
389
-            && ! in_array(
390
-                $this->request->getRequestParam('action'),
391
-                array('activate', 'activate-selected'),
392
-                true
393
-            )
394
-        ) {
395
-            include_once EE_THIRD_PARTY . 'wp-api-basic-auth' . DS . 'basic-auth.php';
396
-        }
397
-        do_action('AHEE__EE_System__load_espresso_addons__complete');
398
-    }
399
-
400
-
401
-    /**
402
-     * detect_activations_or_upgrades
403
-     * Checks for activation or upgrade of core first;
404
-     * then also checks if any registered addons have been activated or upgraded
405
-     * This is hooked into 'AHEE__EE_Bootstrap__detect_activations_or_upgrades'
406
-     * which runs during the WP 'plugins_loaded' action at priority 3
407
-     *
408
-     * @access public
409
-     * @return void
410
-     */
411
-    public function detect_activations_or_upgrades()
412
-    {
413
-        // first off: let's make sure to handle core
414
-        $this->detect_if_activation_or_upgrade();
415
-        foreach ($this->registry->addons as $addon) {
416
-            if ($addon instanceof EE_Addon) {
417
-                // detect teh request type for that addon
418
-                $addon->detect_activation_or_upgrade();
419
-            }
420
-        }
421
-    }
422
-
423
-
424
-    /**
425
-     * detect_if_activation_or_upgrade
426
-     * Takes care of detecting whether this is a brand new install or code upgrade,
427
-     * and either setting up the DB or setting up maintenance mode etc.
428
-     *
429
-     * @access public
430
-     * @return void
431
-     */
432
-    public function detect_if_activation_or_upgrade()
433
-    {
434
-        do_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin');
435
-        // check if db has been updated, or if its a brand-new installation
436
-        $espresso_db_update = $this->fix_espresso_db_upgrade_option();
437
-        $request_type = $this->detect_req_type($espresso_db_update);
438
-        // EEH_Debug_Tools::printr( $request_type, '$request_type', __FILE__, __LINE__ );
439
-        switch ($request_type) {
440
-            case EE_System::req_type_new_activation:
441
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__new_activation');
442
-                $this->_handle_core_version_change($espresso_db_update);
443
-                break;
444
-            case EE_System::req_type_reactivation:
445
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__reactivation');
446
-                $this->_handle_core_version_change($espresso_db_update);
447
-                break;
448
-            case EE_System::req_type_upgrade:
449
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__upgrade');
450
-                // migrations may be required now that we've upgraded
451
-                $this->maintenance_mode->set_maintenance_mode_if_db_old();
452
-                $this->_handle_core_version_change($espresso_db_update);
453
-                break;
454
-            case EE_System::req_type_downgrade:
455
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__downgrade');
456
-                // its possible migrations are no longer required
457
-                $this->maintenance_mode->set_maintenance_mode_if_db_old();
458
-                $this->_handle_core_version_change($espresso_db_update);
459
-                break;
460
-            case EE_System::req_type_normal:
461
-            default:
462
-                break;
463
-        }
464
-        do_action('AHEE__EE_System__detect_if_activation_or_upgrade__complete');
465
-    }
466
-
467
-
468
-    /**
469
-     * Updates the list of installed versions and sets hooks for
470
-     * initializing the database later during the request
471
-     *
472
-     * @param array $espresso_db_update
473
-     */
474
-    private function _handle_core_version_change($espresso_db_update)
475
-    {
476
-        $this->update_list_of_installed_versions($espresso_db_update);
477
-        // get ready to verify the DB is ok (provided we aren't in maintenance mode, of course)
478
-        add_action(
479
-            'AHEE__EE_System__perform_activations_upgrades_and_migrations',
480
-            array($this, 'initialize_db_if_no_migrations_required')
481
-        );
482
-    }
483
-
484
-
485
-    /**
486
-     * standardizes the wp option 'espresso_db_upgrade' which actually stores
487
-     * information about what versions of EE have been installed and activated,
488
-     * NOT necessarily the state of the database
489
-     *
490
-     * @param mixed $espresso_db_update           the value of the WordPress option.
491
-     *                                            If not supplied, fetches it from the options table
492
-     * @return array the correct value of 'espresso_db_upgrade', after saving it, if it needed correction
493
-     */
494
-    private function fix_espresso_db_upgrade_option($espresso_db_update = null)
495
-    {
496
-        do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__begin', $espresso_db_update);
497
-        if (! $espresso_db_update) {
498
-            $espresso_db_update = get_option('espresso_db_update');
499
-        }
500
-        // check that option is an array
501
-        if (! is_array($espresso_db_update)) {
502
-            // if option is FALSE, then it never existed
503
-            if ($espresso_db_update === false) {
504
-                // make $espresso_db_update an array and save option with autoload OFF
505
-                $espresso_db_update = array();
506
-                add_option('espresso_db_update', $espresso_db_update, '', 'no');
507
-            } else {
508
-                // option is NOT FALSE but also is NOT an array, so make it an array and save it
509
-                $espresso_db_update = array($espresso_db_update => array());
510
-                update_option('espresso_db_update', $espresso_db_update);
511
-            }
512
-        } else {
513
-            $corrected_db_update = array();
514
-            // if IS an array, but is it an array where KEYS are version numbers, and values are arrays?
515
-            foreach ($espresso_db_update as $should_be_version_string => $should_be_array) {
516
-                if (is_int($should_be_version_string) && ! is_array($should_be_array)) {
517
-                    // the key is an int, and the value IS NOT an array
518
-                    // so it must be numerically-indexed, where values are versions installed...
519
-                    // fix it!
520
-                    $version_string = $should_be_array;
521
-                    $corrected_db_update[ $version_string ] = array('unknown-date');
522
-                } else {
523
-                    // ok it checks out
524
-                    $corrected_db_update[ $should_be_version_string ] = $should_be_array;
525
-                }
526
-            }
527
-            $espresso_db_update = $corrected_db_update;
528
-            update_option('espresso_db_update', $espresso_db_update);
529
-        }
530
-        do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__complete', $espresso_db_update);
531
-        return $espresso_db_update;
532
-    }
533
-
534
-
535
-    /**
536
-     * Does the traditional work of setting up the plugin's database and adding default data.
537
-     * If migration script/process did not exist, this is what would happen on every activation/reactivation/upgrade.
538
-     * NOTE: if we're in maintenance mode (which would be the case if we detect there are data
539
-     * migration scripts that need to be run and a version change happens), enqueues core for database initialization,
540
-     * so that it will be done when migrations are finished
541
-     *
542
-     * @param boolean $initialize_addons_too if true, we double-check addons' database tables etc too;
543
-     * @param boolean $verify_schema         if true will re-check the database tables have the correct schema.
544
-     *                                       This is a resource-intensive job
545
-     *                                       so we prefer to only do it when necessary
546
-     * @return void
547
-     * @throws EE_Error
548
-     */
549
-    public function initialize_db_if_no_migrations_required($initialize_addons_too = false, $verify_schema = true)
550
-    {
551
-        $request_type = $this->detect_req_type();
552
-        // only initialize system if we're not in maintenance mode.
553
-        if ($this->maintenance_mode->level() !== EE_Maintenance_Mode::level_2_complete_maintenance) {
554
-            /** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
555
-            $rewrite_rules = $this->loader->getShared(
556
-                'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
557
-            );
558
-            $rewrite_rules->flush();
559
-            if ($verify_schema) {
560
-                EEH_Activation::initialize_db_and_folders();
561
-            }
562
-            EEH_Activation::initialize_db_content();
563
-            EEH_Activation::system_initialization();
564
-            if ($initialize_addons_too) {
565
-                $this->initialize_addons();
566
-            }
567
-        } else {
568
-            EE_Data_Migration_Manager::instance()->enqueue_db_initialization_for('Core');
569
-        }
570
-        if ($request_type === EE_System::req_type_new_activation
571
-            || $request_type === EE_System::req_type_reactivation
572
-            || (
573
-                $request_type === EE_System::req_type_upgrade
574
-                && $this->is_major_version_change()
575
-            )
576
-        ) {
577
-            add_action('AHEE__EE_System__initialize_last', array($this, 'redirect_to_about_ee'), 9);
578
-        }
579
-    }
580
-
581
-
582
-    /**
583
-     * Initializes the db for all registered addons
584
-     *
585
-     * @throws EE_Error
586
-     */
587
-    public function initialize_addons()
588
-    {
589
-        // foreach registered addon, make sure its db is up-to-date too
590
-        foreach ($this->registry->addons as $addon) {
591
-            if ($addon instanceof EE_Addon) {
592
-                $addon->initialize_db_if_no_migrations_required();
593
-            }
594
-        }
595
-    }
596
-
597
-
598
-    /**
599
-     * Adds the current code version to the saved wp option which stores a list of all ee versions ever installed.
600
-     *
601
-     * @param    array  $version_history
602
-     * @param    string $current_version_to_add version to be added to the version history
603
-     * @return    boolean success as to whether or not this option was changed
604
-     */
605
-    public function update_list_of_installed_versions($version_history = null, $current_version_to_add = null)
606
-    {
607
-        if (! $version_history) {
608
-            $version_history = $this->fix_espresso_db_upgrade_option($version_history);
609
-        }
610
-        if ($current_version_to_add === null) {
611
-            $current_version_to_add = espresso_version();
612
-        }
613
-        $version_history[ $current_version_to_add ][] = date('Y-m-d H:i:s', time());
614
-        // re-save
615
-        return update_option('espresso_db_update', $version_history);
616
-    }
617
-
618
-
619
-    /**
620
-     * Detects if the current version indicated in the has existed in the list of
621
-     * previously-installed versions of EE (espresso_db_update). Does NOT modify it (ie, no side-effect)
622
-     *
623
-     * @param array $espresso_db_update array from the wp option stored under the name 'espresso_db_update'.
624
-     *                                  If not supplied, fetches it from the options table.
625
-     *                                  Also, caches its result so later parts of the code can also know whether
626
-     *                                  there's been an update or not. This way we can add the current version to
627
-     *                                  espresso_db_update, but still know if this is a new install or not
628
-     * @return int one of the constants on EE_System::req_type_
629
-     */
630
-    public function detect_req_type($espresso_db_update = null)
631
-    {
632
-        if ($this->_req_type === null) {
633
-            $espresso_db_update = ! empty($espresso_db_update)
634
-                ? $espresso_db_update
635
-                : $this->fix_espresso_db_upgrade_option();
636
-            $this->_req_type = EE_System::detect_req_type_given_activation_history(
637
-                $espresso_db_update,
638
-                'ee_espresso_activation',
639
-                espresso_version()
640
-            );
641
-            $this->_major_version_change = $this->_detect_major_version_change($espresso_db_update);
642
-            $this->request->setIsActivation($this->_req_type !== EE_System::req_type_normal);
643
-        }
644
-        return $this->_req_type;
645
-    }
646
-
647
-
648
-    /**
649
-     * Returns whether or not there was a non-micro version change (ie, change in either
650
-     * the first or second number in the version. Eg 4.9.0.rc.001 to 4.10.0.rc.000,
651
-     * but not 4.9.0.rc.0001 to 4.9.1.rc.0001
652
-     *
653
-     * @param $activation_history
654
-     * @return bool
655
-     */
656
-    private function _detect_major_version_change($activation_history)
657
-    {
658
-        $previous_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history);
659
-        $previous_version_parts = explode('.', $previous_version);
660
-        $current_version_parts = explode('.', espresso_version());
661
-        return isset($previous_version_parts[0], $previous_version_parts[1], $current_version_parts[0], $current_version_parts[1])
662
-               && ($previous_version_parts[0] !== $current_version_parts[0]
663
-                   || $previous_version_parts[1] !== $current_version_parts[1]
664
-               );
665
-    }
666
-
667
-
668
-    /**
669
-     * Returns true if either the major or minor version of EE changed during this request.
670
-     * Eg 4.9.0.rc.001 to 4.10.0.rc.000, but not 4.9.0.rc.0001 to 4.9.1.rc.0001
671
-     *
672
-     * @return bool
673
-     */
674
-    public function is_major_version_change()
675
-    {
676
-        return $this->_major_version_change;
677
-    }
678
-
679
-
680
-    /**
681
-     * Determines the request type for any ee addon, given three piece of info: the current array of activation
682
-     * histories (for core that' 'espresso_db_update' wp option); the name of the WordPress option which is temporarily
683
-     * set upon activation of the plugin (for core it's 'ee_espresso_activation'); and the version that this plugin was
684
-     * just activated to (for core that will always be espresso_version())
685
-     *
686
-     * @param array  $activation_history_for_addon     the option's value which stores the activation history for this
687
-     *                                                 ee plugin. for core that's 'espresso_db_update'
688
-     * @param string $activation_indicator_option_name the name of the WordPress option that is temporarily set to
689
-     *                                                 indicate that this plugin was just activated
690
-     * @param string $version_to_upgrade_to            the version that was just upgraded to (for core that will be
691
-     *                                                 espresso_version())
692
-     * @return int one of the constants on EE_System::req_type_*
693
-     */
694
-    public static function detect_req_type_given_activation_history(
695
-        $activation_history_for_addon,
696
-        $activation_indicator_option_name,
697
-        $version_to_upgrade_to
698
-    ) {
699
-        $version_is_higher = self::_new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to);
700
-        if ($activation_history_for_addon) {
701
-            // it exists, so this isn't a completely new install
702
-            // check if this version already in that list of previously installed versions
703
-            if (! isset($activation_history_for_addon[ $version_to_upgrade_to ])) {
704
-                // it a version we haven't seen before
705
-                if ($version_is_higher === 1) {
706
-                    $req_type = EE_System::req_type_upgrade;
707
-                } else {
708
-                    $req_type = EE_System::req_type_downgrade;
709
-                }
710
-                delete_option($activation_indicator_option_name);
711
-            } else {
712
-                // its not an update. maybe a reactivation?
713
-                if (get_option($activation_indicator_option_name, false)) {
714
-                    if ($version_is_higher === -1) {
715
-                        $req_type = EE_System::req_type_downgrade;
716
-                    } elseif ($version_is_higher === 0) {
717
-                        // we've seen this version before, but it's an activation. must be a reactivation
718
-                        $req_type = EE_System::req_type_reactivation;
719
-                    } else {// $version_is_higher === 1
720
-                        $req_type = EE_System::req_type_upgrade;
721
-                    }
722
-                    delete_option($activation_indicator_option_name);
723
-                } else {
724
-                    // we've seen this version before and the activation indicate doesn't show it was just activated
725
-                    if ($version_is_higher === -1) {
726
-                        $req_type = EE_System::req_type_downgrade;
727
-                    } elseif ($version_is_higher === 0) {
728
-                        // we've seen this version before and it's not an activation. its normal request
729
-                        $req_type = EE_System::req_type_normal;
730
-                    } else {// $version_is_higher === 1
731
-                        $req_type = EE_System::req_type_upgrade;
732
-                    }
733
-                }
734
-            }
735
-        } else {
736
-            // brand new install
737
-            $req_type = EE_System::req_type_new_activation;
738
-            delete_option($activation_indicator_option_name);
739
-        }
740
-        return $req_type;
741
-    }
742
-
743
-
744
-    /**
745
-     * Detects if the $version_to_upgrade_to is higher than the most recent version in
746
-     * the $activation_history_for_addon
747
-     *
748
-     * @param array  $activation_history_for_addon (keys are versions, values are arrays of times activated,
749
-     *                                             sometimes containing 'unknown-date'
750
-     * @param string $version_to_upgrade_to        (current version)
751
-     * @return int results of version_compare( $version_to_upgrade_to, $most_recently_active_version ).
752
-     *                                             ie, -1 if $version_to_upgrade_to is LOWER (downgrade);
753
-     *                                             0 if $version_to_upgrade_to MATCHES (reactivation or normal request);
754
-     *                                             1 if $version_to_upgrade_to is HIGHER (upgrade) ;
755
-     */
756
-    private static function _new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to)
757
-    {
758
-        // find the most recently-activated version
759
-        $most_recently_active_version =
760
-            EE_System::_get_most_recently_active_version_from_activation_history($activation_history_for_addon);
761
-        return version_compare($version_to_upgrade_to, $most_recently_active_version);
762
-    }
763
-
764
-
765
-    /**
766
-     * Gets the most recently active version listed in the activation history,
767
-     * and if none are found (ie, it's a brand new install) returns '0.0.0.dev.000'.
768
-     *
769
-     * @param array $activation_history  (keys are versions, values are arrays of times activated,
770
-     *                                   sometimes containing 'unknown-date'
771
-     * @return string
772
-     */
773
-    private static function _get_most_recently_active_version_from_activation_history($activation_history)
774
-    {
775
-        $most_recently_active_version_activation = '1970-01-01 00:00:00';
776
-        $most_recently_active_version = '0.0.0.dev.000';
777
-        if (is_array($activation_history)) {
778
-            foreach ($activation_history as $version => $times_activated) {
779
-                // check there is a record of when this version was activated. Otherwise,
780
-                // mark it as unknown
781
-                if (! $times_activated) {
782
-                    $times_activated = array('unknown-date');
783
-                }
784
-                if (is_string($times_activated)) {
785
-                    $times_activated = array($times_activated);
786
-                }
787
-                foreach ($times_activated as $an_activation) {
788
-                    if ($an_activation !== 'unknown-date'
789
-                        && $an_activation
790
-                           > $most_recently_active_version_activation) {
791
-                        $most_recently_active_version = $version;
792
-                        $most_recently_active_version_activation = $an_activation === 'unknown-date'
793
-                            ? '1970-01-01 00:00:00'
794
-                            : $an_activation;
795
-                    }
796
-                }
797
-            }
798
-        }
799
-        return $most_recently_active_version;
800
-    }
801
-
802
-
803
-    /**
804
-     * This redirects to the about EE page after activation
805
-     *
806
-     * @return void
807
-     */
808
-    public function redirect_to_about_ee()
809
-    {
810
-        $notices = EE_Error::get_notices(false);
811
-        // if current user is an admin and it's not an ajax or rest request
812
-        if (! isset($notices['errors'])
813
-            && $this->request->isAdmin()
814
-            && apply_filters(
815
-                'FHEE__EE_System__redirect_to_about_ee__do_redirect',
816
-                $this->capabilities->current_user_can('manage_options', 'espresso_about_default')
817
-            )
818
-        ) {
819
-            $query_params = array('page' => 'espresso_about');
820
-            if (EE_System::instance()->detect_req_type() === EE_System::req_type_new_activation) {
821
-                $query_params['new_activation'] = true;
822
-            }
823
-            if (EE_System::instance()->detect_req_type() === EE_System::req_type_reactivation) {
824
-                $query_params['reactivation'] = true;
825
-            }
826
-            $url = add_query_arg($query_params, admin_url('admin.php'));
827
-            wp_safe_redirect($url);
828
-            exit();
829
-        }
830
-    }
831
-
832
-
833
-    /**
834
-     * load_core_configuration
835
-     * this is hooked into 'AHEE__EE_Bootstrap__load_core_configuration'
836
-     * which runs during the WP 'plugins_loaded' action at priority 5
837
-     *
838
-     * @return void
839
-     * @throws ReflectionException
840
-     */
841
-    public function load_core_configuration()
842
-    {
843
-        do_action('AHEE__EE_System__load_core_configuration__begin', $this);
844
-        $this->loader->getShared('EE_Load_Textdomain');
845
-        // load textdomain
846
-        EE_Load_Textdomain::load_textdomain();
847
-        // load and setup EE_Config and EE_Network_Config
848
-        $config = $this->loader->getShared('EE_Config');
849
-        $this->loader->getShared('EE_Network_Config');
850
-        // setup autoloaders
851
-        // enable logging?
852
-        if ($config->admin->use_full_logging) {
853
-            $this->loader->getShared('EE_Log');
854
-        }
855
-        // check for activation errors
856
-        $activation_errors = get_option('ee_plugin_activation_errors', false);
857
-        if ($activation_errors) {
858
-            EE_Error::add_error($activation_errors, __FILE__, __FUNCTION__, __LINE__);
859
-            update_option('ee_plugin_activation_errors', false);
860
-        }
861
-        // get model names
862
-        $this->_parse_model_names();
863
-        // load caf stuff a chance to play during the activation process too.
864
-        $this->_maybe_brew_regular();
865
-        // configure custom post type definitions
866
-        $this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions');
867
-        $this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions');
868
-        do_action('AHEE__EE_System__load_core_configuration__complete', $this);
869
-    }
870
-
871
-
872
-    /**
873
-     * cycles through all of the models/*.model.php files, and assembles an array of model names
874
-     *
875
-     * @return void
876
-     * @throws ReflectionException
877
-     */
878
-    private function _parse_model_names()
879
-    {
880
-        // get all the files in the EE_MODELS folder that end in .model.php
881
-        $models = glob(EE_MODELS . '*.model.php');
882
-        $model_names = array();
883
-        $non_abstract_db_models = array();
884
-        foreach ($models as $model) {
885
-            // get model classname
886
-            $classname = EEH_File::get_classname_from_filepath_with_standard_filename($model);
887
-            $short_name = str_replace('EEM_', '', $classname);
888
-            $reflectionClass = new ReflectionClass($classname);
889
-            if ($reflectionClass->isSubclassOf('EEM_Base') && ! $reflectionClass->isAbstract()) {
890
-                $non_abstract_db_models[ $short_name ] = $classname;
891
-            }
892
-            $model_names[ $short_name ] = $classname;
893
-        }
894
-        $this->registry->models = apply_filters('FHEE__EE_System__parse_model_names', $model_names);
895
-        $this->registry->non_abstract_db_models = apply_filters(
896
-            'FHEE__EE_System__parse_implemented_model_names',
897
-            $non_abstract_db_models
898
-        );
899
-    }
900
-
901
-
902
-    /**
903
-     * The purpose of this method is to simply check for a file named "caffeinated/brewing_regular.php" for any hooks
904
-     * that need to be setup before our EE_System launches.
905
-     *
906
-     * @return void
907
-     * @throws DomainException
908
-     * @throws InvalidArgumentException
909
-     * @throws InvalidDataTypeException
910
-     * @throws InvalidInterfaceException
911
-     * @throws InvalidClassException
912
-     * @throws InvalidFilePathException
913
-     */
914
-    private function _maybe_brew_regular()
915
-    {
916
-        /** @var Domain $domain */
917
-        $domain = DomainFactory::getShared(
918
-            new FullyQualifiedName(
919
-                'EventEspresso\core\domain\Domain'
920
-            ),
921
-            array(
922
-                new FilePath(EVENT_ESPRESSO_MAIN_FILE),
923
-                Version::fromString(espresso_version()),
924
-            )
925
-        );
926
-        if ($domain->isCaffeinated()) {
927
-            require_once EE_CAFF_PATH . 'brewing_regular.php';
928
-        }
929
-    }
930
-
931
-
932
-    /**
933
-     * register_shortcodes_modules_and_widgets
934
-     * generate lists of shortcodes and modules, then verify paths and classes
935
-     * This is hooked into 'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets'
936
-     * which runs during the WP 'plugins_loaded' action at priority 7
937
-     *
938
-     * @access public
939
-     * @return void
940
-     * @throws Exception
941
-     */
942
-    public function register_shortcodes_modules_and_widgets()
943
-    {
944
-        try {
945
-            // load, register, and add shortcodes the new way
946
-            if ($this->request->isFrontend() || $this->request->isIframe()) {
947
-                $this->loader->getShared(
948
-                    'EventEspresso\core\services\shortcodes\ShortcodesManager',
949
-                    array(
950
-                        // and the old way, but we'll put it under control of the new system
951
-                        EE_Config::getLegacyShortcodesManager(),
952
-                    )
953
-                );
954
-            }
955
-        } catch (Exception $exception) {
956
-            new ExceptionStackTraceDisplay($exception);
957
-        }
958
-        do_action('AHEE__EE_System__register_shortcodes_modules_and_widgets');
959
-        // check for addons using old hook point
960
-        if (has_action('AHEE__EE_System__register_shortcodes_modules_and_addons')) {
961
-            $this->_incompatible_addon_error();
962
-        }
963
-    }
964
-
965
-
966
-    /**
967
-     * _incompatible_addon_error
968
-     *
969
-     * @access public
970
-     * @return void
971
-     */
972
-    private function _incompatible_addon_error()
973
-    {
974
-        // get array of classes hooking into here
975
-        $class_names = EEH_Class_Tools::get_class_names_for_all_callbacks_on_hook(
976
-            'AHEE__EE_System__register_shortcodes_modules_and_addons'
977
-        );
978
-        if (! empty($class_names)) {
979
-            $msg = __(
980
-                'The following plugins, addons, or modules appear to be incompatible with this version of Event Espresso and were automatically deactivated to avoid fatal errors:',
981
-                'event_espresso'
982
-            );
983
-            $msg .= '<ul>';
984
-            foreach ($class_names as $class_name) {
985
-                $msg .= '<li><b>Event Espresso - '
986
-                        . str_replace(
987
-                            array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'),
988
-                            '',
989
-                            $class_name
990
-                        ) . '</b></li>';
991
-            }
992
-            $msg .= '</ul>';
993
-            $msg .= __(
994
-                'Compatibility issues can be avoided and/or resolved by keeping addons and plugins updated to the latest version.',
995
-                'event_espresso'
996
-            );
997
-            // save list of incompatible addons to wp-options for later use
998
-            add_option('ee_incompatible_addons', $class_names, '', 'no');
999
-            if (is_admin()) {
1000
-                EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
1001
-            }
1002
-        }
1003
-    }
1004
-
1005
-
1006
-    /**
1007
-     * brew_espresso
1008
-     * begins the process of setting hooks for initializing EE in the correct order
1009
-     * This is happening on the 'AHEE__EE_Bootstrap__brew_espresso' hook point
1010
-     * which runs during the WP 'plugins_loaded' action at priority 9
1011
-     *
1012
-     * @return void
1013
-     */
1014
-    public function brew_espresso()
1015
-    {
1016
-        do_action('AHEE__EE_System__brew_espresso__begin', $this);
1017
-        // load some final core systems
1018
-        add_action('init', array($this, 'set_hooks_for_core'), 1);
1019
-        add_action('init', array($this, 'perform_activations_upgrades_and_migrations'), 3);
1020
-        add_action('init', array($this, 'load_CPTs_and_session'), 5);
1021
-        add_action('init', array($this, 'load_controllers'), 7);
1022
-        add_action('init', array($this, 'core_loaded_and_ready'), 9);
1023
-        add_action('init', array($this, 'initialize'), 10);
1024
-        add_action('init', array($this, 'initialize_last'), 100);
1025
-        if (is_admin() && apply_filters('FHEE__EE_System__brew_espresso__load_pue', true)) {
1026
-            // pew pew pew
1027
-            $this->loader->getShared('EventEspresso\core\services\licensing\LicenseService');
1028
-            do_action('AHEE__EE_System__brew_espresso__after_pue_init');
1029
-        }
1030
-        do_action('AHEE__EE_System__brew_espresso__complete', $this);
1031
-    }
1032
-
1033
-
1034
-    /**
1035
-     *    set_hooks_for_core
1036
-     *
1037
-     * @access public
1038
-     * @return    void
1039
-     * @throws EE_Error
1040
-     */
1041
-    public function set_hooks_for_core()
1042
-    {
1043
-        $this->_deactivate_incompatible_addons();
1044
-        do_action('AHEE__EE_System__set_hooks_for_core');
1045
-        $this->loader->getShared('EventEspresso\core\domain\values\session\SessionLifespan');
1046
-        // caps need to be initialized on every request so that capability maps are set.
1047
-        // @see https://events.codebasehq.com/projects/event-espresso/tickets/8674
1048
-        $this->registry->CAP->init_caps();
1049
-    }
1050
-
1051
-
1052
-    /**
1053
-     * Using the information gathered in EE_System::_incompatible_addon_error,
1054
-     * deactivates any addons considered incompatible with the current version of EE
1055
-     */
1056
-    private function _deactivate_incompatible_addons()
1057
-    {
1058
-        $incompatible_addons = get_option('ee_incompatible_addons', array());
1059
-        if (! empty($incompatible_addons)) {
1060
-            $active_plugins = get_option('active_plugins', array());
1061
-            foreach ($active_plugins as $active_plugin) {
1062
-                foreach ($incompatible_addons as $incompatible_addon) {
1063
-                    if (strpos($active_plugin, $incompatible_addon) !== false) {
1064
-                        unset($_GET['activate']);
1065
-                        espresso_deactivate_plugin($active_plugin);
1066
-                    }
1067
-                }
1068
-            }
1069
-        }
1070
-    }
1071
-
1072
-
1073
-    /**
1074
-     *    perform_activations_upgrades_and_migrations
1075
-     *
1076
-     * @access public
1077
-     * @return    void
1078
-     */
1079
-    public function perform_activations_upgrades_and_migrations()
1080
-    {
1081
-        do_action('AHEE__EE_System__perform_activations_upgrades_and_migrations');
1082
-    }
1083
-
1084
-
1085
-    /**
1086
-     * @return void
1087
-     * @throws DomainException
1088
-     */
1089
-    public function load_CPTs_and_session()
1090
-    {
1091
-        do_action('AHEE__EE_System__load_CPTs_and_session__start');
1092
-        /** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies $register_custom_taxonomies */
1093
-        $register_custom_taxonomies = $this->loader->getShared(
1094
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies'
1095
-        );
1096
-        $register_custom_taxonomies->registerCustomTaxonomies();
1097
-        /** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes $register_custom_post_types */
1098
-        $register_custom_post_types = $this->loader->getShared(
1099
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes'
1100
-        );
1101
-        $register_custom_post_types->registerCustomPostTypes();
1102
-        /** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms $register_custom_taxonomy_terms */
1103
-        $register_custom_taxonomy_terms = $this->loader->getShared(
1104
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms'
1105
-        );
1106
-        $register_custom_taxonomy_terms->registerCustomTaxonomyTerms();
1107
-        // load legacy Custom Post Types and Taxonomies
1108
-        $this->loader->getShared('EE_Register_CPTs');
1109
-        do_action('AHEE__EE_System__load_CPTs_and_session__complete');
1110
-    }
1111
-
1112
-
1113
-    /**
1114
-     * load_controllers
1115
-     * this is the best place to load any additional controllers that needs access to EE core.
1116
-     * it is expected that all basic core EE systems, that are not dependant on the current request are loaded at this
1117
-     * time
1118
-     *
1119
-     * @access public
1120
-     * @return void
1121
-     */
1122
-    public function load_controllers()
1123
-    {
1124
-        do_action('AHEE__EE_System__load_controllers__start');
1125
-        // let's get it started
1126
-        if (! $this->maintenance_mode->level()
1127
-            && ($this->request->isFrontend() || $this->request->isFrontAjax())
1128
-        ) {
1129
-            do_action('AHEE__EE_System__load_controllers__load_front_controllers');
1130
-            $this->loader->getShared('EE_Front_Controller');
1131
-        } elseif ($this->request->isAdmin() || $this->request->isAdminAjax()) {
1132
-            do_action('AHEE__EE_System__load_controllers__load_admin_controllers');
1133
-            $this->loader->getShared('EE_Admin');
1134
-        }
1135
-        do_action('AHEE__EE_System__load_controllers__complete');
1136
-    }
1137
-
1138
-
1139
-    /**
1140
-     * core_loaded_and_ready
1141
-     * all of the basic EE core should be loaded at this point and available regardless of M-Mode
1142
-     *
1143
-     * @access public
1144
-     * @return void
1145
-     */
1146
-    public function core_loaded_and_ready()
1147
-    {
1148
-        if ($this->request->isAdmin()
1149
-            || $this->request->isEeAjax()
1150
-            || $this->request->isFrontend()
1151
-        ) {
1152
-            $this->loader->getShared('EE_Session');
1153
-        }
1154
-        do_action('AHEE__EE_System__core_loaded_and_ready');
1155
-        // load_espresso_template_tags
1156
-        if (is_readable(EE_PUBLIC . 'template_tags.php')
1157
-            && (
1158
-                $this->request->isFrontend()
1159
-                || $this->request->isAdmin()
1160
-                || $this->request->isIframe()
1161
-                || $this->request->isFeed()
1162
-            )
1163
-        ) {
1164
-            require_once EE_PUBLIC . 'template_tags.php';
1165
-        }
1166
-        do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
1167
-        if ($this->request->isAdmin() || $this->request->isFrontend() || $this->request->isIframe()) {
1168
-            $this->loader->getShared('EventEspresso\core\services\assets\Registry');
1169
-        }
1170
-    }
1171
-
1172
-
1173
-    /**
1174
-     * initialize
1175
-     * this is the best place to begin initializing client code
1176
-     *
1177
-     * @access public
1178
-     * @return void
1179
-     */
1180
-    public function initialize()
1181
-    {
1182
-        do_action('AHEE__EE_System__initialize');
1183
-    }
1184
-
1185
-
1186
-    /**
1187
-     * initialize_last
1188
-     * this is run really late during the WP init hook point, and ensures that mostly everything else that needs to
1189
-     * initialize has done so
1190
-     *
1191
-     * @access public
1192
-     * @return void
1193
-     */
1194
-    public function initialize_last()
1195
-    {
1196
-        do_action('AHEE__EE_System__initialize_last');
1197
-        /** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
1198
-        $rewrite_rules = $this->loader->getShared(
1199
-            'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
1200
-        );
1201
-        $rewrite_rules->flushRewriteRules();
1202
-        add_action('admin_bar_init', array($this, 'addEspressoToolbar'));
1203
-    }
1204
-
1205
-
1206
-    /**
1207
-     * @return void
1208
-     * @throws EE_Error
1209
-     */
1210
-    public function addEspressoToolbar()
1211
-    {
1212
-        $this->loader->getShared(
1213
-            'EventEspresso\core\domain\services\admin\AdminToolBar',
1214
-            array($this->registry->CAP)
1215
-        );
1216
-    }
1217
-
1218
-
1219
-    /**
1220
-     * do_not_cache
1221
-     * sets no cache headers and defines no cache constants for WP plugins
1222
-     *
1223
-     * @access public
1224
-     * @return void
1225
-     */
1226
-    public static function do_not_cache()
1227
-    {
1228
-        // set no cache constants
1229
-        if (! defined('DONOTCACHEPAGE')) {
1230
-            define('DONOTCACHEPAGE', true);
1231
-        }
1232
-        if (! defined('DONOTCACHCEOBJECT')) {
1233
-            define('DONOTCACHCEOBJECT', true);
1234
-        }
1235
-        if (! defined('DONOTCACHEDB')) {
1236
-            define('DONOTCACHEDB', true);
1237
-        }
1238
-        // add no cache headers
1239
-        add_action('send_headers', array('EE_System', 'nocache_headers'), 10);
1240
-        // plus a little extra for nginx and Google Chrome
1241
-        add_filter('nocache_headers', array('EE_System', 'extra_nocache_headers'), 10, 1);
1242
-        // prevent browsers from prefetching of the rel='next' link, because it may contain content that interferes with the registration process
1243
-        remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
1244
-    }
1245
-
1246
-
1247
-    /**
1248
-     *    extra_nocache_headers
1249
-     *
1250
-     * @access    public
1251
-     * @param $headers
1252
-     * @return    array
1253
-     */
1254
-    public static function extra_nocache_headers($headers)
1255
-    {
1256
-        // for NGINX
1257
-        $headers['X-Accel-Expires'] = 0;
1258
-        // plus extra for Google Chrome since it doesn't seem to respect "no-cache", but WILL respect "no-store"
1259
-        $headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
1260
-        return $headers;
1261
-    }
1262
-
1263
-
1264
-    /**
1265
-     *    nocache_headers
1266
-     *
1267
-     * @access    public
1268
-     * @return    void
1269
-     */
1270
-    public static function nocache_headers()
1271
-    {
1272
-        nocache_headers();
1273
-    }
1274
-
1275
-
1276
-    /**
1277
-     * simply hooks into "wp_list_pages_exclude" filter (for wp_list_pages method) and makes sure EE critical pages are
1278
-     * never returned with the function.
1279
-     *
1280
-     * @param  array $exclude_array any existing pages being excluded are in this array.
1281
-     * @return array
1282
-     */
1283
-    public function remove_pages_from_wp_list_pages($exclude_array)
1284
-    {
1285
-        return array_merge($exclude_array, $this->registry->CFG->core->get_critical_pages_array());
1286
-    }
31
+	/**
32
+	 * indicates this is a 'normal' request. Ie, not activation, nor upgrade, nor activation.
33
+	 * So examples of this would be a normal GET request on the frontend or backend, or a POST, etc
34
+	 */
35
+	const req_type_normal = 0;
36
+
37
+	/**
38
+	 * Indicates this is a brand new installation of EE so we should install
39
+	 * tables and default data etc
40
+	 */
41
+	const req_type_new_activation = 1;
42
+
43
+	/**
44
+	 * we've detected that EE has been reactivated (or EE was activated during maintenance mode,
45
+	 * and we just exited maintenance mode). We MUST check the database is setup properly
46
+	 * and that default data is setup too
47
+	 */
48
+	const req_type_reactivation = 2;
49
+
50
+	/**
51
+	 * indicates that EE has been upgraded since its previous request.
52
+	 * We may have data migration scripts to call and will want to trigger maintenance mode
53
+	 */
54
+	const req_type_upgrade = 3;
55
+
56
+	/**
57
+	 * TODO  will detect that EE has been DOWNGRADED. We probably don't want to run in this case...
58
+	 */
59
+	const req_type_downgrade = 4;
60
+
61
+	/**
62
+	 * @deprecated since version 4.6.0.dev.006
63
+	 * Now whenever a new_activation is detected the request type is still just
64
+	 * new_activation (same for reactivation, upgrade, downgrade etc), but if we'r ein maintenance mode
65
+	 * EE_System::initialize_db_if_no_migrations_required and EE_Addon::initialize_db_if_no_migrations_required
66
+	 * will instead enqueue that EE plugin's db initialization for when we're taken out of maintenance mode.
67
+	 * (Specifically, when the migration manager indicates migrations are finished
68
+	 * EE_Data_Migration_Manager::initialize_db_for_enqueued_ee_plugins() will be called)
69
+	 */
70
+	const req_type_activation_but_not_installed = 5;
71
+
72
+	/**
73
+	 * option prefix for recording the activation history (like core's "espresso_db_update") of addons
74
+	 */
75
+	const addon_activation_history_option_prefix = 'ee_addon_activation_history_';
76
+
77
+
78
+	/**
79
+	 * @var EE_System $_instance
80
+	 */
81
+	private static $_instance;
82
+
83
+	/**
84
+	 * @var EE_Registry $registry
85
+	 */
86
+	private $registry;
87
+
88
+	/**
89
+	 * @var LoaderInterface $loader
90
+	 */
91
+	private $loader;
92
+
93
+	/**
94
+	 * @var EE_Capabilities $capabilities
95
+	 */
96
+	private $capabilities;
97
+
98
+	/**
99
+	 * @var RequestInterface $request
100
+	 */
101
+	private $request;
102
+
103
+	/**
104
+	 * @var EE_Maintenance_Mode $maintenance_mode
105
+	 */
106
+	private $maintenance_mode;
107
+
108
+	/**
109
+	 * Stores which type of request this is, options being one of the constants on EE_System starting with req_type_*.
110
+	 * It can be a brand-new activation, a reactivation, an upgrade, a downgrade, or a normal request.
111
+	 *
112
+	 * @var int $_req_type
113
+	 */
114
+	private $_req_type;
115
+
116
+	/**
117
+	 * Whether or not there was a non-micro version change in EE core version during this request
118
+	 *
119
+	 * @var boolean $_major_version_change
120
+	 */
121
+	private $_major_version_change = false;
122
+
123
+	/**
124
+	 * A Context DTO dedicated solely to identifying the current request type.
125
+	 *
126
+	 * @var RequestTypeContextCheckerInterface $request_type
127
+	 */
128
+	private $request_type;
129
+
130
+
131
+	/**
132
+	 * @singleton method used to instantiate class object
133
+	 * @param EE_Registry|null         $registry
134
+	 * @param LoaderInterface|null     $loader
135
+	 * @param RequestInterface|null    $request
136
+	 * @param EE_Maintenance_Mode|null $maintenance_mode
137
+	 * @return EE_System
138
+	 */
139
+	public static function instance(
140
+		EE_Registry $registry = null,
141
+		LoaderInterface $loader = null,
142
+		RequestInterface $request = null,
143
+		EE_Maintenance_Mode $maintenance_mode = null
144
+	) {
145
+		// check if class object is instantiated
146
+		if (! self::$_instance instanceof EE_System) {
147
+			self::$_instance = new self($registry, $loader, $request, $maintenance_mode);
148
+		}
149
+		return self::$_instance;
150
+	}
151
+
152
+
153
+	/**
154
+	 * resets the instance and returns it
155
+	 *
156
+	 * @return EE_System
157
+	 */
158
+	public static function reset()
159
+	{
160
+		self::$_instance->_req_type = null;
161
+		// make sure none of the old hooks are left hanging around
162
+		remove_all_actions('AHEE__EE_System__perform_activations_upgrades_and_migrations');
163
+		// we need to reset the migration manager in order for it to detect DMSs properly
164
+		EE_Data_Migration_Manager::reset();
165
+		self::instance()->detect_activations_or_upgrades();
166
+		self::instance()->perform_activations_upgrades_and_migrations();
167
+		return self::instance();
168
+	}
169
+
170
+
171
+	/**
172
+	 * sets hooks for running rest of system
173
+	 * provides "AHEE__EE_System__construct__complete" hook for EE Addons to use as their starting point
174
+	 * starting EE Addons from any other point may lead to problems
175
+	 *
176
+	 * @param EE_Registry         $registry
177
+	 * @param LoaderInterface     $loader
178
+	 * @param RequestInterface    $request
179
+	 * @param EE_Maintenance_Mode $maintenance_mode
180
+	 */
181
+	private function __construct(
182
+		EE_Registry $registry,
183
+		LoaderInterface $loader,
184
+		RequestInterface $request,
185
+		EE_Maintenance_Mode $maintenance_mode
186
+	) {
187
+		$this->registry = $registry;
188
+		$this->loader = $loader;
189
+		$this->request = $request;
190
+		$this->maintenance_mode = $maintenance_mode;
191
+		do_action('AHEE__EE_System__construct__begin', $this);
192
+		add_action(
193
+			'AHEE__EE_Bootstrap__load_espresso_addons',
194
+			array($this, 'loadCapabilities'),
195
+			5
196
+		);
197
+		add_action(
198
+			'AHEE__EE_Bootstrap__load_espresso_addons',
199
+			array($this, 'loadCommandBus'),
200
+			7
201
+		);
202
+		add_action(
203
+			'AHEE__EE_Bootstrap__load_espresso_addons',
204
+			array($this, 'loadPluginApi'),
205
+			9
206
+		);
207
+		// allow addons to load first so that they can register autoloaders, set hooks for running DMS's, etc
208
+		add_action(
209
+			'AHEE__EE_Bootstrap__load_espresso_addons',
210
+			array($this, 'load_espresso_addons')
211
+		);
212
+		// when an ee addon is activated, we want to call the core hook(s) again
213
+		// because the newly-activated addon didn't get a chance to run at all
214
+		add_action('activate_plugin', array($this, 'load_espresso_addons'), 1);
215
+		// detect whether install or upgrade
216
+		add_action(
217
+			'AHEE__EE_Bootstrap__detect_activations_or_upgrades',
218
+			array($this, 'detect_activations_or_upgrades'),
219
+			3
220
+		);
221
+		// load EE_Config, EE_Textdomain, etc
222
+		add_action(
223
+			'AHEE__EE_Bootstrap__load_core_configuration',
224
+			array($this, 'load_core_configuration'),
225
+			5
226
+		);
227
+		// load EE_Config, EE_Textdomain, etc
228
+		add_action(
229
+			'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets',
230
+			array($this, 'register_shortcodes_modules_and_widgets'),
231
+			7
232
+		);
233
+		// you wanna get going? I wanna get going... let's get going!
234
+		add_action(
235
+			'AHEE__EE_Bootstrap__brew_espresso',
236
+			array($this, 'brew_espresso'),
237
+			9
238
+		);
239
+		// other housekeeping
240
+		// exclude EE critical pages from wp_list_pages
241
+		add_filter(
242
+			'wp_list_pages_excludes',
243
+			array($this, 'remove_pages_from_wp_list_pages'),
244
+			10
245
+		);
246
+		// ALL EE Addons should use the following hook point to attach their initial setup too
247
+		// it's extremely important for EE Addons to register any class autoloaders so that they can be available when the EE_Config loads
248
+		do_action('AHEE__EE_System__construct__complete', $this);
249
+	}
250
+
251
+
252
+	/**
253
+	 * load and setup EE_Capabilities
254
+	 *
255
+	 * @return void
256
+	 * @throws EE_Error
257
+	 */
258
+	public function loadCapabilities()
259
+	{
260
+		$this->capabilities = $this->loader->getShared('EE_Capabilities');
261
+		add_action(
262
+			'AHEE__EE_Capabilities__init_caps__before_initialization',
263
+			function () {
264
+				LoaderFactory::getLoader()->getShared('EE_Payment_Method_Manager');
265
+			}
266
+		);
267
+	}
268
+
269
+
270
+	/**
271
+	 * create and cache the CommandBus, and also add middleware
272
+	 * The CapChecker middleware requires the use of EE_Capabilities
273
+	 * which is why we need to load the CommandBus after Caps are set up
274
+	 *
275
+	 * @return void
276
+	 * @throws EE_Error
277
+	 */
278
+	public function loadCommandBus()
279
+	{
280
+		$this->loader->getShared(
281
+			'CommandBusInterface',
282
+			array(
283
+				null,
284
+				apply_filters(
285
+					'FHEE__EE_Load_Espresso_Core__handle_request__CommandBus_middleware',
286
+					array(
287
+						$this->loader->getShared('EventEspresso\core\services\commands\middleware\CapChecker'),
288
+						$this->loader->getShared('EventEspresso\core\services\commands\middleware\AddActionHook'),
289
+					)
290
+				),
291
+			)
292
+		);
293
+	}
294
+
295
+
296
+	/**
297
+	 * @return void
298
+	 * @throws EE_Error
299
+	 */
300
+	public function loadPluginApi()
301
+	{
302
+		// set autoloaders for all of the classes implementing EEI_Plugin_API
303
+		// which provide helpers for EE plugin authors to more easily register certain components with EE.
304
+		EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
305
+		$this->loader->getShared('EE_Request_Handler');
306
+	}
307
+
308
+
309
+	/**
310
+	 * @param string $addon_name
311
+	 * @param string $version_constant
312
+	 * @param string $min_version_required
313
+	 * @param string $load_callback
314
+	 * @param string $plugin_file_constant
315
+	 * @return void
316
+	 */
317
+	private function deactivateIncompatibleAddon(
318
+		$addon_name,
319
+		$version_constant,
320
+		$min_version_required,
321
+		$load_callback,
322
+		$plugin_file_constant
323
+	) {
324
+		if (! defined($version_constant)) {
325
+			return;
326
+		}
327
+		$addon_version = constant($version_constant);
328
+		if ($addon_version && version_compare($addon_version, $min_version_required, '<')) {
329
+			remove_action('AHEE__EE_System__load_espresso_addons', $load_callback);
330
+			if (! function_exists('deactivate_plugins')) {
331
+				require_once ABSPATH . 'wp-admin/includes/plugin.php';
332
+			}
333
+			deactivate_plugins(plugin_basename(constant($plugin_file_constant)));
334
+			unset($_GET['activate'], $_REQUEST['activate'], $_GET['activate-multi'], $_REQUEST['activate-multi']);
335
+			EE_Error::add_error(
336
+				sprintf(
337
+					esc_html__(
338
+						'We\'re sorry, but the Event Espresso %1$s addon was deactivated because version %2$s or higher is required with this version of Event Espresso core.',
339
+						'event_espresso'
340
+					),
341
+					$addon_name,
342
+					$min_version_required
343
+				),
344
+				__FILE__,
345
+				__FUNCTION__ . "({$addon_name})",
346
+				__LINE__
347
+			);
348
+			EE_Error::get_notices(false, true);
349
+		}
350
+	}
351
+
352
+
353
+	/**
354
+	 * load_espresso_addons
355
+	 * allow addons to load first so that they can set hooks for running DMS's, etc
356
+	 * this is hooked into both:
357
+	 *    'AHEE__EE_Bootstrap__load_core_configuration'
358
+	 *        which runs during the WP 'plugins_loaded' action at priority 5
359
+	 *    and the WP 'activate_plugin' hook point
360
+	 *
361
+	 * @access public
362
+	 * @return void
363
+	 */
364
+	public function load_espresso_addons()
365
+	{
366
+		$this->deactivateIncompatibleAddon(
367
+			'Wait Lists',
368
+			'EE_WAIT_LISTS_VERSION',
369
+			'1.0.0.beta.074',
370
+			'load_espresso_wait_lists',
371
+			'EE_WAIT_LISTS_PLUGIN_FILE'
372
+		);
373
+		$this->deactivateIncompatibleAddon(
374
+			'Automated Upcoming Event Notifications',
375
+			'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_VERSION',
376
+			'1.0.0.beta.091',
377
+			'load_espresso_automated_upcoming_event_notification',
378
+			'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_PLUGIN_FILE'
379
+		);
380
+		do_action('AHEE__EE_System__load_espresso_addons');
381
+		// if the WP API basic auth plugin isn't already loaded, load it now.
382
+		// We want it for mobile apps. Just include the entire plugin
383
+		// also, don't load the basic auth when a plugin is getting activated, because
384
+		// it could be the basic auth plugin, and it doesn't check if its methods are already defined
385
+		// and causes a fatal error
386
+		if ($this->request->getRequestParam('activate') !== 'true'
387
+			&& ! function_exists('json_basic_auth_handler')
388
+			&& ! function_exists('json_basic_auth_error')
389
+			&& ! in_array(
390
+				$this->request->getRequestParam('action'),
391
+				array('activate', 'activate-selected'),
392
+				true
393
+			)
394
+		) {
395
+			include_once EE_THIRD_PARTY . 'wp-api-basic-auth' . DS . 'basic-auth.php';
396
+		}
397
+		do_action('AHEE__EE_System__load_espresso_addons__complete');
398
+	}
399
+
400
+
401
+	/**
402
+	 * detect_activations_or_upgrades
403
+	 * Checks for activation or upgrade of core first;
404
+	 * then also checks if any registered addons have been activated or upgraded
405
+	 * This is hooked into 'AHEE__EE_Bootstrap__detect_activations_or_upgrades'
406
+	 * which runs during the WP 'plugins_loaded' action at priority 3
407
+	 *
408
+	 * @access public
409
+	 * @return void
410
+	 */
411
+	public function detect_activations_or_upgrades()
412
+	{
413
+		// first off: let's make sure to handle core
414
+		$this->detect_if_activation_or_upgrade();
415
+		foreach ($this->registry->addons as $addon) {
416
+			if ($addon instanceof EE_Addon) {
417
+				// detect teh request type for that addon
418
+				$addon->detect_activation_or_upgrade();
419
+			}
420
+		}
421
+	}
422
+
423
+
424
+	/**
425
+	 * detect_if_activation_or_upgrade
426
+	 * Takes care of detecting whether this is a brand new install or code upgrade,
427
+	 * and either setting up the DB or setting up maintenance mode etc.
428
+	 *
429
+	 * @access public
430
+	 * @return void
431
+	 */
432
+	public function detect_if_activation_or_upgrade()
433
+	{
434
+		do_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin');
435
+		// check if db has been updated, or if its a brand-new installation
436
+		$espresso_db_update = $this->fix_espresso_db_upgrade_option();
437
+		$request_type = $this->detect_req_type($espresso_db_update);
438
+		// EEH_Debug_Tools::printr( $request_type, '$request_type', __FILE__, __LINE__ );
439
+		switch ($request_type) {
440
+			case EE_System::req_type_new_activation:
441
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__new_activation');
442
+				$this->_handle_core_version_change($espresso_db_update);
443
+				break;
444
+			case EE_System::req_type_reactivation:
445
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__reactivation');
446
+				$this->_handle_core_version_change($espresso_db_update);
447
+				break;
448
+			case EE_System::req_type_upgrade:
449
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__upgrade');
450
+				// migrations may be required now that we've upgraded
451
+				$this->maintenance_mode->set_maintenance_mode_if_db_old();
452
+				$this->_handle_core_version_change($espresso_db_update);
453
+				break;
454
+			case EE_System::req_type_downgrade:
455
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__downgrade');
456
+				// its possible migrations are no longer required
457
+				$this->maintenance_mode->set_maintenance_mode_if_db_old();
458
+				$this->_handle_core_version_change($espresso_db_update);
459
+				break;
460
+			case EE_System::req_type_normal:
461
+			default:
462
+				break;
463
+		}
464
+		do_action('AHEE__EE_System__detect_if_activation_or_upgrade__complete');
465
+	}
466
+
467
+
468
+	/**
469
+	 * Updates the list of installed versions and sets hooks for
470
+	 * initializing the database later during the request
471
+	 *
472
+	 * @param array $espresso_db_update
473
+	 */
474
+	private function _handle_core_version_change($espresso_db_update)
475
+	{
476
+		$this->update_list_of_installed_versions($espresso_db_update);
477
+		// get ready to verify the DB is ok (provided we aren't in maintenance mode, of course)
478
+		add_action(
479
+			'AHEE__EE_System__perform_activations_upgrades_and_migrations',
480
+			array($this, 'initialize_db_if_no_migrations_required')
481
+		);
482
+	}
483
+
484
+
485
+	/**
486
+	 * standardizes the wp option 'espresso_db_upgrade' which actually stores
487
+	 * information about what versions of EE have been installed and activated,
488
+	 * NOT necessarily the state of the database
489
+	 *
490
+	 * @param mixed $espresso_db_update           the value of the WordPress option.
491
+	 *                                            If not supplied, fetches it from the options table
492
+	 * @return array the correct value of 'espresso_db_upgrade', after saving it, if it needed correction
493
+	 */
494
+	private function fix_espresso_db_upgrade_option($espresso_db_update = null)
495
+	{
496
+		do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__begin', $espresso_db_update);
497
+		if (! $espresso_db_update) {
498
+			$espresso_db_update = get_option('espresso_db_update');
499
+		}
500
+		// check that option is an array
501
+		if (! is_array($espresso_db_update)) {
502
+			// if option is FALSE, then it never existed
503
+			if ($espresso_db_update === false) {
504
+				// make $espresso_db_update an array and save option with autoload OFF
505
+				$espresso_db_update = array();
506
+				add_option('espresso_db_update', $espresso_db_update, '', 'no');
507
+			} else {
508
+				// option is NOT FALSE but also is NOT an array, so make it an array and save it
509
+				$espresso_db_update = array($espresso_db_update => array());
510
+				update_option('espresso_db_update', $espresso_db_update);
511
+			}
512
+		} else {
513
+			$corrected_db_update = array();
514
+			// if IS an array, but is it an array where KEYS are version numbers, and values are arrays?
515
+			foreach ($espresso_db_update as $should_be_version_string => $should_be_array) {
516
+				if (is_int($should_be_version_string) && ! is_array($should_be_array)) {
517
+					// the key is an int, and the value IS NOT an array
518
+					// so it must be numerically-indexed, where values are versions installed...
519
+					// fix it!
520
+					$version_string = $should_be_array;
521
+					$corrected_db_update[ $version_string ] = array('unknown-date');
522
+				} else {
523
+					// ok it checks out
524
+					$corrected_db_update[ $should_be_version_string ] = $should_be_array;
525
+				}
526
+			}
527
+			$espresso_db_update = $corrected_db_update;
528
+			update_option('espresso_db_update', $espresso_db_update);
529
+		}
530
+		do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__complete', $espresso_db_update);
531
+		return $espresso_db_update;
532
+	}
533
+
534
+
535
+	/**
536
+	 * Does the traditional work of setting up the plugin's database and adding default data.
537
+	 * If migration script/process did not exist, this is what would happen on every activation/reactivation/upgrade.
538
+	 * NOTE: if we're in maintenance mode (which would be the case if we detect there are data
539
+	 * migration scripts that need to be run and a version change happens), enqueues core for database initialization,
540
+	 * so that it will be done when migrations are finished
541
+	 *
542
+	 * @param boolean $initialize_addons_too if true, we double-check addons' database tables etc too;
543
+	 * @param boolean $verify_schema         if true will re-check the database tables have the correct schema.
544
+	 *                                       This is a resource-intensive job
545
+	 *                                       so we prefer to only do it when necessary
546
+	 * @return void
547
+	 * @throws EE_Error
548
+	 */
549
+	public function initialize_db_if_no_migrations_required($initialize_addons_too = false, $verify_schema = true)
550
+	{
551
+		$request_type = $this->detect_req_type();
552
+		// only initialize system if we're not in maintenance mode.
553
+		if ($this->maintenance_mode->level() !== EE_Maintenance_Mode::level_2_complete_maintenance) {
554
+			/** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
555
+			$rewrite_rules = $this->loader->getShared(
556
+				'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
557
+			);
558
+			$rewrite_rules->flush();
559
+			if ($verify_schema) {
560
+				EEH_Activation::initialize_db_and_folders();
561
+			}
562
+			EEH_Activation::initialize_db_content();
563
+			EEH_Activation::system_initialization();
564
+			if ($initialize_addons_too) {
565
+				$this->initialize_addons();
566
+			}
567
+		} else {
568
+			EE_Data_Migration_Manager::instance()->enqueue_db_initialization_for('Core');
569
+		}
570
+		if ($request_type === EE_System::req_type_new_activation
571
+			|| $request_type === EE_System::req_type_reactivation
572
+			|| (
573
+				$request_type === EE_System::req_type_upgrade
574
+				&& $this->is_major_version_change()
575
+			)
576
+		) {
577
+			add_action('AHEE__EE_System__initialize_last', array($this, 'redirect_to_about_ee'), 9);
578
+		}
579
+	}
580
+
581
+
582
+	/**
583
+	 * Initializes the db for all registered addons
584
+	 *
585
+	 * @throws EE_Error
586
+	 */
587
+	public function initialize_addons()
588
+	{
589
+		// foreach registered addon, make sure its db is up-to-date too
590
+		foreach ($this->registry->addons as $addon) {
591
+			if ($addon instanceof EE_Addon) {
592
+				$addon->initialize_db_if_no_migrations_required();
593
+			}
594
+		}
595
+	}
596
+
597
+
598
+	/**
599
+	 * Adds the current code version to the saved wp option which stores a list of all ee versions ever installed.
600
+	 *
601
+	 * @param    array  $version_history
602
+	 * @param    string $current_version_to_add version to be added to the version history
603
+	 * @return    boolean success as to whether or not this option was changed
604
+	 */
605
+	public function update_list_of_installed_versions($version_history = null, $current_version_to_add = null)
606
+	{
607
+		if (! $version_history) {
608
+			$version_history = $this->fix_espresso_db_upgrade_option($version_history);
609
+		}
610
+		if ($current_version_to_add === null) {
611
+			$current_version_to_add = espresso_version();
612
+		}
613
+		$version_history[ $current_version_to_add ][] = date('Y-m-d H:i:s', time());
614
+		// re-save
615
+		return update_option('espresso_db_update', $version_history);
616
+	}
617
+
618
+
619
+	/**
620
+	 * Detects if the current version indicated in the has existed in the list of
621
+	 * previously-installed versions of EE (espresso_db_update). Does NOT modify it (ie, no side-effect)
622
+	 *
623
+	 * @param array $espresso_db_update array from the wp option stored under the name 'espresso_db_update'.
624
+	 *                                  If not supplied, fetches it from the options table.
625
+	 *                                  Also, caches its result so later parts of the code can also know whether
626
+	 *                                  there's been an update or not. This way we can add the current version to
627
+	 *                                  espresso_db_update, but still know if this is a new install or not
628
+	 * @return int one of the constants on EE_System::req_type_
629
+	 */
630
+	public function detect_req_type($espresso_db_update = null)
631
+	{
632
+		if ($this->_req_type === null) {
633
+			$espresso_db_update = ! empty($espresso_db_update)
634
+				? $espresso_db_update
635
+				: $this->fix_espresso_db_upgrade_option();
636
+			$this->_req_type = EE_System::detect_req_type_given_activation_history(
637
+				$espresso_db_update,
638
+				'ee_espresso_activation',
639
+				espresso_version()
640
+			);
641
+			$this->_major_version_change = $this->_detect_major_version_change($espresso_db_update);
642
+			$this->request->setIsActivation($this->_req_type !== EE_System::req_type_normal);
643
+		}
644
+		return $this->_req_type;
645
+	}
646
+
647
+
648
+	/**
649
+	 * Returns whether or not there was a non-micro version change (ie, change in either
650
+	 * the first or second number in the version. Eg 4.9.0.rc.001 to 4.10.0.rc.000,
651
+	 * but not 4.9.0.rc.0001 to 4.9.1.rc.0001
652
+	 *
653
+	 * @param $activation_history
654
+	 * @return bool
655
+	 */
656
+	private function _detect_major_version_change($activation_history)
657
+	{
658
+		$previous_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history);
659
+		$previous_version_parts = explode('.', $previous_version);
660
+		$current_version_parts = explode('.', espresso_version());
661
+		return isset($previous_version_parts[0], $previous_version_parts[1], $current_version_parts[0], $current_version_parts[1])
662
+			   && ($previous_version_parts[0] !== $current_version_parts[0]
663
+				   || $previous_version_parts[1] !== $current_version_parts[1]
664
+			   );
665
+	}
666
+
667
+
668
+	/**
669
+	 * Returns true if either the major or minor version of EE changed during this request.
670
+	 * Eg 4.9.0.rc.001 to 4.10.0.rc.000, but not 4.9.0.rc.0001 to 4.9.1.rc.0001
671
+	 *
672
+	 * @return bool
673
+	 */
674
+	public function is_major_version_change()
675
+	{
676
+		return $this->_major_version_change;
677
+	}
678
+
679
+
680
+	/**
681
+	 * Determines the request type for any ee addon, given three piece of info: the current array of activation
682
+	 * histories (for core that' 'espresso_db_update' wp option); the name of the WordPress option which is temporarily
683
+	 * set upon activation of the plugin (for core it's 'ee_espresso_activation'); and the version that this plugin was
684
+	 * just activated to (for core that will always be espresso_version())
685
+	 *
686
+	 * @param array  $activation_history_for_addon     the option's value which stores the activation history for this
687
+	 *                                                 ee plugin. for core that's 'espresso_db_update'
688
+	 * @param string $activation_indicator_option_name the name of the WordPress option that is temporarily set to
689
+	 *                                                 indicate that this plugin was just activated
690
+	 * @param string $version_to_upgrade_to            the version that was just upgraded to (for core that will be
691
+	 *                                                 espresso_version())
692
+	 * @return int one of the constants on EE_System::req_type_*
693
+	 */
694
+	public static function detect_req_type_given_activation_history(
695
+		$activation_history_for_addon,
696
+		$activation_indicator_option_name,
697
+		$version_to_upgrade_to
698
+	) {
699
+		$version_is_higher = self::_new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to);
700
+		if ($activation_history_for_addon) {
701
+			// it exists, so this isn't a completely new install
702
+			// check if this version already in that list of previously installed versions
703
+			if (! isset($activation_history_for_addon[ $version_to_upgrade_to ])) {
704
+				// it a version we haven't seen before
705
+				if ($version_is_higher === 1) {
706
+					$req_type = EE_System::req_type_upgrade;
707
+				} else {
708
+					$req_type = EE_System::req_type_downgrade;
709
+				}
710
+				delete_option($activation_indicator_option_name);
711
+			} else {
712
+				// its not an update. maybe a reactivation?
713
+				if (get_option($activation_indicator_option_name, false)) {
714
+					if ($version_is_higher === -1) {
715
+						$req_type = EE_System::req_type_downgrade;
716
+					} elseif ($version_is_higher === 0) {
717
+						// we've seen this version before, but it's an activation. must be a reactivation
718
+						$req_type = EE_System::req_type_reactivation;
719
+					} else {// $version_is_higher === 1
720
+						$req_type = EE_System::req_type_upgrade;
721
+					}
722
+					delete_option($activation_indicator_option_name);
723
+				} else {
724
+					// we've seen this version before and the activation indicate doesn't show it was just activated
725
+					if ($version_is_higher === -1) {
726
+						$req_type = EE_System::req_type_downgrade;
727
+					} elseif ($version_is_higher === 0) {
728
+						// we've seen this version before and it's not an activation. its normal request
729
+						$req_type = EE_System::req_type_normal;
730
+					} else {// $version_is_higher === 1
731
+						$req_type = EE_System::req_type_upgrade;
732
+					}
733
+				}
734
+			}
735
+		} else {
736
+			// brand new install
737
+			$req_type = EE_System::req_type_new_activation;
738
+			delete_option($activation_indicator_option_name);
739
+		}
740
+		return $req_type;
741
+	}
742
+
743
+
744
+	/**
745
+	 * Detects if the $version_to_upgrade_to is higher than the most recent version in
746
+	 * the $activation_history_for_addon
747
+	 *
748
+	 * @param array  $activation_history_for_addon (keys are versions, values are arrays of times activated,
749
+	 *                                             sometimes containing 'unknown-date'
750
+	 * @param string $version_to_upgrade_to        (current version)
751
+	 * @return int results of version_compare( $version_to_upgrade_to, $most_recently_active_version ).
752
+	 *                                             ie, -1 if $version_to_upgrade_to is LOWER (downgrade);
753
+	 *                                             0 if $version_to_upgrade_to MATCHES (reactivation or normal request);
754
+	 *                                             1 if $version_to_upgrade_to is HIGHER (upgrade) ;
755
+	 */
756
+	private static function _new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to)
757
+	{
758
+		// find the most recently-activated version
759
+		$most_recently_active_version =
760
+			EE_System::_get_most_recently_active_version_from_activation_history($activation_history_for_addon);
761
+		return version_compare($version_to_upgrade_to, $most_recently_active_version);
762
+	}
763
+
764
+
765
+	/**
766
+	 * Gets the most recently active version listed in the activation history,
767
+	 * and if none are found (ie, it's a brand new install) returns '0.0.0.dev.000'.
768
+	 *
769
+	 * @param array $activation_history  (keys are versions, values are arrays of times activated,
770
+	 *                                   sometimes containing 'unknown-date'
771
+	 * @return string
772
+	 */
773
+	private static function _get_most_recently_active_version_from_activation_history($activation_history)
774
+	{
775
+		$most_recently_active_version_activation = '1970-01-01 00:00:00';
776
+		$most_recently_active_version = '0.0.0.dev.000';
777
+		if (is_array($activation_history)) {
778
+			foreach ($activation_history as $version => $times_activated) {
779
+				// check there is a record of when this version was activated. Otherwise,
780
+				// mark it as unknown
781
+				if (! $times_activated) {
782
+					$times_activated = array('unknown-date');
783
+				}
784
+				if (is_string($times_activated)) {
785
+					$times_activated = array($times_activated);
786
+				}
787
+				foreach ($times_activated as $an_activation) {
788
+					if ($an_activation !== 'unknown-date'
789
+						&& $an_activation
790
+						   > $most_recently_active_version_activation) {
791
+						$most_recently_active_version = $version;
792
+						$most_recently_active_version_activation = $an_activation === 'unknown-date'
793
+							? '1970-01-01 00:00:00'
794
+							: $an_activation;
795
+					}
796
+				}
797
+			}
798
+		}
799
+		return $most_recently_active_version;
800
+	}
801
+
802
+
803
+	/**
804
+	 * This redirects to the about EE page after activation
805
+	 *
806
+	 * @return void
807
+	 */
808
+	public function redirect_to_about_ee()
809
+	{
810
+		$notices = EE_Error::get_notices(false);
811
+		// if current user is an admin and it's not an ajax or rest request
812
+		if (! isset($notices['errors'])
813
+			&& $this->request->isAdmin()
814
+			&& apply_filters(
815
+				'FHEE__EE_System__redirect_to_about_ee__do_redirect',
816
+				$this->capabilities->current_user_can('manage_options', 'espresso_about_default')
817
+			)
818
+		) {
819
+			$query_params = array('page' => 'espresso_about');
820
+			if (EE_System::instance()->detect_req_type() === EE_System::req_type_new_activation) {
821
+				$query_params['new_activation'] = true;
822
+			}
823
+			if (EE_System::instance()->detect_req_type() === EE_System::req_type_reactivation) {
824
+				$query_params['reactivation'] = true;
825
+			}
826
+			$url = add_query_arg($query_params, admin_url('admin.php'));
827
+			wp_safe_redirect($url);
828
+			exit();
829
+		}
830
+	}
831
+
832
+
833
+	/**
834
+	 * load_core_configuration
835
+	 * this is hooked into 'AHEE__EE_Bootstrap__load_core_configuration'
836
+	 * which runs during the WP 'plugins_loaded' action at priority 5
837
+	 *
838
+	 * @return void
839
+	 * @throws ReflectionException
840
+	 */
841
+	public function load_core_configuration()
842
+	{
843
+		do_action('AHEE__EE_System__load_core_configuration__begin', $this);
844
+		$this->loader->getShared('EE_Load_Textdomain');
845
+		// load textdomain
846
+		EE_Load_Textdomain::load_textdomain();
847
+		// load and setup EE_Config and EE_Network_Config
848
+		$config = $this->loader->getShared('EE_Config');
849
+		$this->loader->getShared('EE_Network_Config');
850
+		// setup autoloaders
851
+		// enable logging?
852
+		if ($config->admin->use_full_logging) {
853
+			$this->loader->getShared('EE_Log');
854
+		}
855
+		// check for activation errors
856
+		$activation_errors = get_option('ee_plugin_activation_errors', false);
857
+		if ($activation_errors) {
858
+			EE_Error::add_error($activation_errors, __FILE__, __FUNCTION__, __LINE__);
859
+			update_option('ee_plugin_activation_errors', false);
860
+		}
861
+		// get model names
862
+		$this->_parse_model_names();
863
+		// load caf stuff a chance to play during the activation process too.
864
+		$this->_maybe_brew_regular();
865
+		// configure custom post type definitions
866
+		$this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions');
867
+		$this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions');
868
+		do_action('AHEE__EE_System__load_core_configuration__complete', $this);
869
+	}
870
+
871
+
872
+	/**
873
+	 * cycles through all of the models/*.model.php files, and assembles an array of model names
874
+	 *
875
+	 * @return void
876
+	 * @throws ReflectionException
877
+	 */
878
+	private function _parse_model_names()
879
+	{
880
+		// get all the files in the EE_MODELS folder that end in .model.php
881
+		$models = glob(EE_MODELS . '*.model.php');
882
+		$model_names = array();
883
+		$non_abstract_db_models = array();
884
+		foreach ($models as $model) {
885
+			// get model classname
886
+			$classname = EEH_File::get_classname_from_filepath_with_standard_filename($model);
887
+			$short_name = str_replace('EEM_', '', $classname);
888
+			$reflectionClass = new ReflectionClass($classname);
889
+			if ($reflectionClass->isSubclassOf('EEM_Base') && ! $reflectionClass->isAbstract()) {
890
+				$non_abstract_db_models[ $short_name ] = $classname;
891
+			}
892
+			$model_names[ $short_name ] = $classname;
893
+		}
894
+		$this->registry->models = apply_filters('FHEE__EE_System__parse_model_names', $model_names);
895
+		$this->registry->non_abstract_db_models = apply_filters(
896
+			'FHEE__EE_System__parse_implemented_model_names',
897
+			$non_abstract_db_models
898
+		);
899
+	}
900
+
901
+
902
+	/**
903
+	 * The purpose of this method is to simply check for a file named "caffeinated/brewing_regular.php" for any hooks
904
+	 * that need to be setup before our EE_System launches.
905
+	 *
906
+	 * @return void
907
+	 * @throws DomainException
908
+	 * @throws InvalidArgumentException
909
+	 * @throws InvalidDataTypeException
910
+	 * @throws InvalidInterfaceException
911
+	 * @throws InvalidClassException
912
+	 * @throws InvalidFilePathException
913
+	 */
914
+	private function _maybe_brew_regular()
915
+	{
916
+		/** @var Domain $domain */
917
+		$domain = DomainFactory::getShared(
918
+			new FullyQualifiedName(
919
+				'EventEspresso\core\domain\Domain'
920
+			),
921
+			array(
922
+				new FilePath(EVENT_ESPRESSO_MAIN_FILE),
923
+				Version::fromString(espresso_version()),
924
+			)
925
+		);
926
+		if ($domain->isCaffeinated()) {
927
+			require_once EE_CAFF_PATH . 'brewing_regular.php';
928
+		}
929
+	}
930
+
931
+
932
+	/**
933
+	 * register_shortcodes_modules_and_widgets
934
+	 * generate lists of shortcodes and modules, then verify paths and classes
935
+	 * This is hooked into 'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets'
936
+	 * which runs during the WP 'plugins_loaded' action at priority 7
937
+	 *
938
+	 * @access public
939
+	 * @return void
940
+	 * @throws Exception
941
+	 */
942
+	public function register_shortcodes_modules_and_widgets()
943
+	{
944
+		try {
945
+			// load, register, and add shortcodes the new way
946
+			if ($this->request->isFrontend() || $this->request->isIframe()) {
947
+				$this->loader->getShared(
948
+					'EventEspresso\core\services\shortcodes\ShortcodesManager',
949
+					array(
950
+						// and the old way, but we'll put it under control of the new system
951
+						EE_Config::getLegacyShortcodesManager(),
952
+					)
953
+				);
954
+			}
955
+		} catch (Exception $exception) {
956
+			new ExceptionStackTraceDisplay($exception);
957
+		}
958
+		do_action('AHEE__EE_System__register_shortcodes_modules_and_widgets');
959
+		// check for addons using old hook point
960
+		if (has_action('AHEE__EE_System__register_shortcodes_modules_and_addons')) {
961
+			$this->_incompatible_addon_error();
962
+		}
963
+	}
964
+
965
+
966
+	/**
967
+	 * _incompatible_addon_error
968
+	 *
969
+	 * @access public
970
+	 * @return void
971
+	 */
972
+	private function _incompatible_addon_error()
973
+	{
974
+		// get array of classes hooking into here
975
+		$class_names = EEH_Class_Tools::get_class_names_for_all_callbacks_on_hook(
976
+			'AHEE__EE_System__register_shortcodes_modules_and_addons'
977
+		);
978
+		if (! empty($class_names)) {
979
+			$msg = __(
980
+				'The following plugins, addons, or modules appear to be incompatible with this version of Event Espresso and were automatically deactivated to avoid fatal errors:',
981
+				'event_espresso'
982
+			);
983
+			$msg .= '<ul>';
984
+			foreach ($class_names as $class_name) {
985
+				$msg .= '<li><b>Event Espresso - '
986
+						. str_replace(
987
+							array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'),
988
+							'',
989
+							$class_name
990
+						) . '</b></li>';
991
+			}
992
+			$msg .= '</ul>';
993
+			$msg .= __(
994
+				'Compatibility issues can be avoided and/or resolved by keeping addons and plugins updated to the latest version.',
995
+				'event_espresso'
996
+			);
997
+			// save list of incompatible addons to wp-options for later use
998
+			add_option('ee_incompatible_addons', $class_names, '', 'no');
999
+			if (is_admin()) {
1000
+				EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
1001
+			}
1002
+		}
1003
+	}
1004
+
1005
+
1006
+	/**
1007
+	 * brew_espresso
1008
+	 * begins the process of setting hooks for initializing EE in the correct order
1009
+	 * This is happening on the 'AHEE__EE_Bootstrap__brew_espresso' hook point
1010
+	 * which runs during the WP 'plugins_loaded' action at priority 9
1011
+	 *
1012
+	 * @return void
1013
+	 */
1014
+	public function brew_espresso()
1015
+	{
1016
+		do_action('AHEE__EE_System__brew_espresso__begin', $this);
1017
+		// load some final core systems
1018
+		add_action('init', array($this, 'set_hooks_for_core'), 1);
1019
+		add_action('init', array($this, 'perform_activations_upgrades_and_migrations'), 3);
1020
+		add_action('init', array($this, 'load_CPTs_and_session'), 5);
1021
+		add_action('init', array($this, 'load_controllers'), 7);
1022
+		add_action('init', array($this, 'core_loaded_and_ready'), 9);
1023
+		add_action('init', array($this, 'initialize'), 10);
1024
+		add_action('init', array($this, 'initialize_last'), 100);
1025
+		if (is_admin() && apply_filters('FHEE__EE_System__brew_espresso__load_pue', true)) {
1026
+			// pew pew pew
1027
+			$this->loader->getShared('EventEspresso\core\services\licensing\LicenseService');
1028
+			do_action('AHEE__EE_System__brew_espresso__after_pue_init');
1029
+		}
1030
+		do_action('AHEE__EE_System__brew_espresso__complete', $this);
1031
+	}
1032
+
1033
+
1034
+	/**
1035
+	 *    set_hooks_for_core
1036
+	 *
1037
+	 * @access public
1038
+	 * @return    void
1039
+	 * @throws EE_Error
1040
+	 */
1041
+	public function set_hooks_for_core()
1042
+	{
1043
+		$this->_deactivate_incompatible_addons();
1044
+		do_action('AHEE__EE_System__set_hooks_for_core');
1045
+		$this->loader->getShared('EventEspresso\core\domain\values\session\SessionLifespan');
1046
+		// caps need to be initialized on every request so that capability maps are set.
1047
+		// @see https://events.codebasehq.com/projects/event-espresso/tickets/8674
1048
+		$this->registry->CAP->init_caps();
1049
+	}
1050
+
1051
+
1052
+	/**
1053
+	 * Using the information gathered in EE_System::_incompatible_addon_error,
1054
+	 * deactivates any addons considered incompatible with the current version of EE
1055
+	 */
1056
+	private function _deactivate_incompatible_addons()
1057
+	{
1058
+		$incompatible_addons = get_option('ee_incompatible_addons', array());
1059
+		if (! empty($incompatible_addons)) {
1060
+			$active_plugins = get_option('active_plugins', array());
1061
+			foreach ($active_plugins as $active_plugin) {
1062
+				foreach ($incompatible_addons as $incompatible_addon) {
1063
+					if (strpos($active_plugin, $incompatible_addon) !== false) {
1064
+						unset($_GET['activate']);
1065
+						espresso_deactivate_plugin($active_plugin);
1066
+					}
1067
+				}
1068
+			}
1069
+		}
1070
+	}
1071
+
1072
+
1073
+	/**
1074
+	 *    perform_activations_upgrades_and_migrations
1075
+	 *
1076
+	 * @access public
1077
+	 * @return    void
1078
+	 */
1079
+	public function perform_activations_upgrades_and_migrations()
1080
+	{
1081
+		do_action('AHEE__EE_System__perform_activations_upgrades_and_migrations');
1082
+	}
1083
+
1084
+
1085
+	/**
1086
+	 * @return void
1087
+	 * @throws DomainException
1088
+	 */
1089
+	public function load_CPTs_and_session()
1090
+	{
1091
+		do_action('AHEE__EE_System__load_CPTs_and_session__start');
1092
+		/** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies $register_custom_taxonomies */
1093
+		$register_custom_taxonomies = $this->loader->getShared(
1094
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies'
1095
+		);
1096
+		$register_custom_taxonomies->registerCustomTaxonomies();
1097
+		/** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes $register_custom_post_types */
1098
+		$register_custom_post_types = $this->loader->getShared(
1099
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes'
1100
+		);
1101
+		$register_custom_post_types->registerCustomPostTypes();
1102
+		/** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms $register_custom_taxonomy_terms */
1103
+		$register_custom_taxonomy_terms = $this->loader->getShared(
1104
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms'
1105
+		);
1106
+		$register_custom_taxonomy_terms->registerCustomTaxonomyTerms();
1107
+		// load legacy Custom Post Types and Taxonomies
1108
+		$this->loader->getShared('EE_Register_CPTs');
1109
+		do_action('AHEE__EE_System__load_CPTs_and_session__complete');
1110
+	}
1111
+
1112
+
1113
+	/**
1114
+	 * load_controllers
1115
+	 * this is the best place to load any additional controllers that needs access to EE core.
1116
+	 * it is expected that all basic core EE systems, that are not dependant on the current request are loaded at this
1117
+	 * time
1118
+	 *
1119
+	 * @access public
1120
+	 * @return void
1121
+	 */
1122
+	public function load_controllers()
1123
+	{
1124
+		do_action('AHEE__EE_System__load_controllers__start');
1125
+		// let's get it started
1126
+		if (! $this->maintenance_mode->level()
1127
+			&& ($this->request->isFrontend() || $this->request->isFrontAjax())
1128
+		) {
1129
+			do_action('AHEE__EE_System__load_controllers__load_front_controllers');
1130
+			$this->loader->getShared('EE_Front_Controller');
1131
+		} elseif ($this->request->isAdmin() || $this->request->isAdminAjax()) {
1132
+			do_action('AHEE__EE_System__load_controllers__load_admin_controllers');
1133
+			$this->loader->getShared('EE_Admin');
1134
+		}
1135
+		do_action('AHEE__EE_System__load_controllers__complete');
1136
+	}
1137
+
1138
+
1139
+	/**
1140
+	 * core_loaded_and_ready
1141
+	 * all of the basic EE core should be loaded at this point and available regardless of M-Mode
1142
+	 *
1143
+	 * @access public
1144
+	 * @return void
1145
+	 */
1146
+	public function core_loaded_and_ready()
1147
+	{
1148
+		if ($this->request->isAdmin()
1149
+			|| $this->request->isEeAjax()
1150
+			|| $this->request->isFrontend()
1151
+		) {
1152
+			$this->loader->getShared('EE_Session');
1153
+		}
1154
+		do_action('AHEE__EE_System__core_loaded_and_ready');
1155
+		// load_espresso_template_tags
1156
+		if (is_readable(EE_PUBLIC . 'template_tags.php')
1157
+			&& (
1158
+				$this->request->isFrontend()
1159
+				|| $this->request->isAdmin()
1160
+				|| $this->request->isIframe()
1161
+				|| $this->request->isFeed()
1162
+			)
1163
+		) {
1164
+			require_once EE_PUBLIC . 'template_tags.php';
1165
+		}
1166
+		do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
1167
+		if ($this->request->isAdmin() || $this->request->isFrontend() || $this->request->isIframe()) {
1168
+			$this->loader->getShared('EventEspresso\core\services\assets\Registry');
1169
+		}
1170
+	}
1171
+
1172
+
1173
+	/**
1174
+	 * initialize
1175
+	 * this is the best place to begin initializing client code
1176
+	 *
1177
+	 * @access public
1178
+	 * @return void
1179
+	 */
1180
+	public function initialize()
1181
+	{
1182
+		do_action('AHEE__EE_System__initialize');
1183
+	}
1184
+
1185
+
1186
+	/**
1187
+	 * initialize_last
1188
+	 * this is run really late during the WP init hook point, and ensures that mostly everything else that needs to
1189
+	 * initialize has done so
1190
+	 *
1191
+	 * @access public
1192
+	 * @return void
1193
+	 */
1194
+	public function initialize_last()
1195
+	{
1196
+		do_action('AHEE__EE_System__initialize_last');
1197
+		/** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
1198
+		$rewrite_rules = $this->loader->getShared(
1199
+			'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
1200
+		);
1201
+		$rewrite_rules->flushRewriteRules();
1202
+		add_action('admin_bar_init', array($this, 'addEspressoToolbar'));
1203
+	}
1204
+
1205
+
1206
+	/**
1207
+	 * @return void
1208
+	 * @throws EE_Error
1209
+	 */
1210
+	public function addEspressoToolbar()
1211
+	{
1212
+		$this->loader->getShared(
1213
+			'EventEspresso\core\domain\services\admin\AdminToolBar',
1214
+			array($this->registry->CAP)
1215
+		);
1216
+	}
1217
+
1218
+
1219
+	/**
1220
+	 * do_not_cache
1221
+	 * sets no cache headers and defines no cache constants for WP plugins
1222
+	 *
1223
+	 * @access public
1224
+	 * @return void
1225
+	 */
1226
+	public static function do_not_cache()
1227
+	{
1228
+		// set no cache constants
1229
+		if (! defined('DONOTCACHEPAGE')) {
1230
+			define('DONOTCACHEPAGE', true);
1231
+		}
1232
+		if (! defined('DONOTCACHCEOBJECT')) {
1233
+			define('DONOTCACHCEOBJECT', true);
1234
+		}
1235
+		if (! defined('DONOTCACHEDB')) {
1236
+			define('DONOTCACHEDB', true);
1237
+		}
1238
+		// add no cache headers
1239
+		add_action('send_headers', array('EE_System', 'nocache_headers'), 10);
1240
+		// plus a little extra for nginx and Google Chrome
1241
+		add_filter('nocache_headers', array('EE_System', 'extra_nocache_headers'), 10, 1);
1242
+		// prevent browsers from prefetching of the rel='next' link, because it may contain content that interferes with the registration process
1243
+		remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
1244
+	}
1245
+
1246
+
1247
+	/**
1248
+	 *    extra_nocache_headers
1249
+	 *
1250
+	 * @access    public
1251
+	 * @param $headers
1252
+	 * @return    array
1253
+	 */
1254
+	public static function extra_nocache_headers($headers)
1255
+	{
1256
+		// for NGINX
1257
+		$headers['X-Accel-Expires'] = 0;
1258
+		// plus extra for Google Chrome since it doesn't seem to respect "no-cache", but WILL respect "no-store"
1259
+		$headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
1260
+		return $headers;
1261
+	}
1262
+
1263
+
1264
+	/**
1265
+	 *    nocache_headers
1266
+	 *
1267
+	 * @access    public
1268
+	 * @return    void
1269
+	 */
1270
+	public static function nocache_headers()
1271
+	{
1272
+		nocache_headers();
1273
+	}
1274
+
1275
+
1276
+	/**
1277
+	 * simply hooks into "wp_list_pages_exclude" filter (for wp_list_pages method) and makes sure EE critical pages are
1278
+	 * never returned with the function.
1279
+	 *
1280
+	 * @param  array $exclude_array any existing pages being excluded are in this array.
1281
+	 * @return array
1282
+	 */
1283
+	public function remove_pages_from_wp_list_pages($exclude_array)
1284
+	{
1285
+		return array_merge($exclude_array, $this->registry->CFG->core->get_critical_pages_array());
1286
+	}
1287 1287
 }
Please login to merge, or discard this patch.
core/services/collections/CollectionInterface.php 1 patch
Indentation   +155 added lines, -155 removed lines patch added patch discarded remove patch
@@ -16,159 +16,159 @@
 block discarded – undo
16 16
 interface CollectionInterface extends Countable, Iterator, Serializable, ArrayAccess
17 17
 {
18 18
 
19
-    /**
20
-     * add
21
-     * attaches an object to the Collection
22
-     * and sets any supplied data associated with the current iterator entry
23
-     * by calling EE_Object_Collection::set_identifier()
24
-     *
25
-     * @access public
26
-     * @param        $object
27
-     * @param  mixed $identifier
28
-     * @return bool
29
-     */
30
-    public function add($object, $identifier = null);
31
-
32
-    /**
33
-     * setIdentifier
34
-     * Sets the data associated with an object in the Collection
35
-     * if no $identifier is supplied, then the spl_object_hash() is used
36
-     *
37
-     * @access public
38
-     * @param        $object
39
-     * @param  mixed $identifier
40
-     * @return bool
41
-     */
42
-    public function setIdentifier($object, $identifier = null);
43
-
44
-    /**
45
-     * get
46
-     * finds and returns an object in the Collection based on the identifier that was set using addObject()
47
-     * PLZ NOTE: the pointer is reset to the beginning of the collection before returning
48
-     *
49
-     * @access public
50
-     * @param mixed $identifier
51
-     * @return mixed
52
-     */
53
-    public function get($identifier);
54
-
55
-    /**
56
-     * has
57
-     * returns TRUE or FALSE
58
-     * depending on whether the object is within the Collection
59
-     * based on the supplied $identifier
60
-     *
61
-     * @access public
62
-     * @param  mixed $identifier
63
-     * @return bool
64
-     */
65
-    public function has($identifier);
66
-
67
-    /**
68
-     * hasObject
69
-     * returns TRUE or FALSE depending on whether the supplied object is within the Collection
70
-     *
71
-     * @access public
72
-     * @param $object
73
-     * @return bool
74
-     */
75
-    public function hasObject($object);
76
-
77
-    /**
78
-     * remove
79
-     * detaches an object from the Collection
80
-     *
81
-     * @access public
82
-     * @param $object
83
-     * @return bool
84
-     */
85
-    public function remove($object);
86
-
87
-    /**
88
-     * setCurrent
89
-     * advances pointer to the object whose identifier matches that which was provided
90
-     *
91
-     * @access public
92
-     * @param mixed $identifier
93
-     * @return boolean
94
-     */
95
-    public function setCurrent($identifier);
96
-
97
-    /**
98
-     * setCurrentUsingObject
99
-     * advances pointer to the provided object
100
-     *
101
-     * @access public
102
-     * @param $object
103
-     * @return boolean
104
-     */
105
-    public function setCurrentUsingObject($object);
106
-
107
-    /**
108
-     * Returns the object occupying the index before the current object,
109
-     * unless this is already the first object, in which case it just returns the first object
110
-     *
111
-     * @return mixed
112
-     */
113
-    public function previous();
114
-
115
-        /**
116
-     * Returns the index of a given object, or false if not found
117
-     *
118
-     * @see http://stackoverflow.com/a/8736013
119
-     * @param $object
120
-     * @return boolean|int|string
121
-     */
122
-    public function indexOf($object);
123
-
124
-
125
-    /**
126
-     * Returns the object at the given index
127
-     *
128
-     * @see http://stackoverflow.com/a/8736013
129
-     * @param $index
130
-     * @return mixed
131
-     */
132
-    public function objectAtIndex($index);
133
-
134
-    /**
135
-     * Returns the sequence of objects as specified by the offset and length
136
-     *
137
-     * @see http://stackoverflow.com/a/8736013
138
-     * @param int $offset
139
-     * @param int $length
140
-     * @return array
141
-     */
142
-    public function slice($offset, $length);
143
-
144
-    /**
145
-     * Inserts an object (or an array of objects) at a certain point
146
-     *
147
-     * @see http://stackoverflow.com/a/8736013
148
-     * @param mixed   $objects A single object or an array of objects
149
-     * @param integer $index
150
-     */
151
-    public function insertAt($objects, $index);
152
-
153
-    /**
154
-     * Removes the object at the given index
155
-     *
156
-     * @see http://stackoverflow.com/a/8736013
157
-     * @param integer $index
158
-     */
159
-    public function removeAt($index);
160
-
161
-
162
-
163
-    /**
164
-     * detaches ALL objects from the Collection
165
-     */
166
-    public function detachAll();
167
-
168
-
169
-
170
-    /**
171
-     * unsets and detaches ALL objects from the Collection
172
-     */
173
-    public function trashAndDetachAll();
19
+	/**
20
+	 * add
21
+	 * attaches an object to the Collection
22
+	 * and sets any supplied data associated with the current iterator entry
23
+	 * by calling EE_Object_Collection::set_identifier()
24
+	 *
25
+	 * @access public
26
+	 * @param        $object
27
+	 * @param  mixed $identifier
28
+	 * @return bool
29
+	 */
30
+	public function add($object, $identifier = null);
31
+
32
+	/**
33
+	 * setIdentifier
34
+	 * Sets the data associated with an object in the Collection
35
+	 * if no $identifier is supplied, then the spl_object_hash() is used
36
+	 *
37
+	 * @access public
38
+	 * @param        $object
39
+	 * @param  mixed $identifier
40
+	 * @return bool
41
+	 */
42
+	public function setIdentifier($object, $identifier = null);
43
+
44
+	/**
45
+	 * get
46
+	 * finds and returns an object in the Collection based on the identifier that was set using addObject()
47
+	 * PLZ NOTE: the pointer is reset to the beginning of the collection before returning
48
+	 *
49
+	 * @access public
50
+	 * @param mixed $identifier
51
+	 * @return mixed
52
+	 */
53
+	public function get($identifier);
54
+
55
+	/**
56
+	 * has
57
+	 * returns TRUE or FALSE
58
+	 * depending on whether the object is within the Collection
59
+	 * based on the supplied $identifier
60
+	 *
61
+	 * @access public
62
+	 * @param  mixed $identifier
63
+	 * @return bool
64
+	 */
65
+	public function has($identifier);
66
+
67
+	/**
68
+	 * hasObject
69
+	 * returns TRUE or FALSE depending on whether the supplied object is within the Collection
70
+	 *
71
+	 * @access public
72
+	 * @param $object
73
+	 * @return bool
74
+	 */
75
+	public function hasObject($object);
76
+
77
+	/**
78
+	 * remove
79
+	 * detaches an object from the Collection
80
+	 *
81
+	 * @access public
82
+	 * @param $object
83
+	 * @return bool
84
+	 */
85
+	public function remove($object);
86
+
87
+	/**
88
+	 * setCurrent
89
+	 * advances pointer to the object whose identifier matches that which was provided
90
+	 *
91
+	 * @access public
92
+	 * @param mixed $identifier
93
+	 * @return boolean
94
+	 */
95
+	public function setCurrent($identifier);
96
+
97
+	/**
98
+	 * setCurrentUsingObject
99
+	 * advances pointer to the provided object
100
+	 *
101
+	 * @access public
102
+	 * @param $object
103
+	 * @return boolean
104
+	 */
105
+	public function setCurrentUsingObject($object);
106
+
107
+	/**
108
+	 * Returns the object occupying the index before the current object,
109
+	 * unless this is already the first object, in which case it just returns the first object
110
+	 *
111
+	 * @return mixed
112
+	 */
113
+	public function previous();
114
+
115
+		/**
116
+		 * Returns the index of a given object, or false if not found
117
+		 *
118
+		 * @see http://stackoverflow.com/a/8736013
119
+		 * @param $object
120
+		 * @return boolean|int|string
121
+		 */
122
+	public function indexOf($object);
123
+
124
+
125
+	/**
126
+	 * Returns the object at the given index
127
+	 *
128
+	 * @see http://stackoverflow.com/a/8736013
129
+	 * @param $index
130
+	 * @return mixed
131
+	 */
132
+	public function objectAtIndex($index);
133
+
134
+	/**
135
+	 * Returns the sequence of objects as specified by the offset and length
136
+	 *
137
+	 * @see http://stackoverflow.com/a/8736013
138
+	 * @param int $offset
139
+	 * @param int $length
140
+	 * @return array
141
+	 */
142
+	public function slice($offset, $length);
143
+
144
+	/**
145
+	 * Inserts an object (or an array of objects) at a certain point
146
+	 *
147
+	 * @see http://stackoverflow.com/a/8736013
148
+	 * @param mixed   $objects A single object or an array of objects
149
+	 * @param integer $index
150
+	 */
151
+	public function insertAt($objects, $index);
152
+
153
+	/**
154
+	 * Removes the object at the given index
155
+	 *
156
+	 * @see http://stackoverflow.com/a/8736013
157
+	 * @param integer $index
158
+	 */
159
+	public function removeAt($index);
160
+
161
+
162
+
163
+	/**
164
+	 * detaches ALL objects from the Collection
165
+	 */
166
+	public function detachAll();
167
+
168
+
169
+
170
+	/**
171
+	 * unsets and detaches ALL objects from the Collection
172
+	 */
173
+	public function trashAndDetachAll();
174 174
 }
Please login to merge, or discard this patch.
core/services/bootstrap/BootstrapCore.php 1 patch
Indentation   +199 added lines, -199 removed lines patch added patch discarded remove patch
@@ -46,225 +46,225 @@
 block discarded – undo
46 46
 class BootstrapCore
47 47
 {
48 48
 
49
-    /**
50
-     * @type LoaderInterface $loader
51
-     */
52
-    private $loader;
49
+	/**
50
+	 * @type LoaderInterface $loader
51
+	 */
52
+	private $loader;
53 53
 
54
-    /**
55
-     * @var RequestInterface $request
56
-     */
57
-    protected $request;
54
+	/**
55
+	 * @var RequestInterface $request
56
+	 */
57
+	protected $request;
58 58
 
59
-    /**
60
-     * @var ResponseInterface $response
61
-     */
62
-    protected $response;
59
+	/**
60
+	 * @var ResponseInterface $response
61
+	 */
62
+	protected $response;
63 63
 
64
-    /**
65
-     * @var RequestStackBuilder $request_stack_builder
66
-     */
67
-    protected $request_stack_builder;
64
+	/**
65
+	 * @var RequestStackBuilder $request_stack_builder
66
+	 */
67
+	protected $request_stack_builder;
68 68
 
69
-    /**
70
-     * @var RequestStack $request_stack
71
-     */
72
-    protected $request_stack;
69
+	/**
70
+	 * @var RequestStack $request_stack
71
+	 */
72
+	protected $request_stack;
73 73
 
74 74
 
75
-    /**
76
-     * BootstrapCore constructor.
77
-     */
78
-    public function __construct()
79
-    {
80
-        do_action('AHEE__EventEspresso_core_services_bootstrap_BootstrapCore___construct');
81
-        // construct request stack and run middleware apps as soon as all WP plugins are loaded
82
-        add_action('plugins_loaded', array($this, 'initialize'), 0);
83
-    }
75
+	/**
76
+	 * BootstrapCore constructor.
77
+	 */
78
+	public function __construct()
79
+	{
80
+		do_action('AHEE__EventEspresso_core_services_bootstrap_BootstrapCore___construct');
81
+		// construct request stack and run middleware apps as soon as all WP plugins are loaded
82
+		add_action('plugins_loaded', array($this, 'initialize'), 0);
83
+	}
84 84
 
85 85
 
86
-    /**
87
-     * @throws DomainException
88
-     * @throws EE_Error
89
-     * @throws Exception
90
-     * @throws InvalidArgumentException
91
-     * @throws InvalidClassException
92
-     * @throws InvalidDataTypeException
93
-     * @throws InvalidFilePathException
94
-     * @throws InvalidInterfaceException
95
-     * @throws InvalidRequestStackMiddlewareException
96
-     * @throws OutOfBoundsException
97
-     * @throws ReflectionException
98
-     */
99
-    public function initialize()
100
-    {
101
-        $this->bootstrapDependencyInjectionContainer();
102
-        $this->bootstrapDomain();
103
-        $bootstrap_request = $this->bootstrapRequestResponseObjects();
104
-        add_action(
105
-            'EE_Load_Espresso_Core__handle_request__initialize_core_loading',
106
-            array($bootstrap_request, 'setupLegacyRequest')
107
-        );
108
-        $this->runRequestStack();
109
-    }
86
+	/**
87
+	 * @throws DomainException
88
+	 * @throws EE_Error
89
+	 * @throws Exception
90
+	 * @throws InvalidArgumentException
91
+	 * @throws InvalidClassException
92
+	 * @throws InvalidDataTypeException
93
+	 * @throws InvalidFilePathException
94
+	 * @throws InvalidInterfaceException
95
+	 * @throws InvalidRequestStackMiddlewareException
96
+	 * @throws OutOfBoundsException
97
+	 * @throws ReflectionException
98
+	 */
99
+	public function initialize()
100
+	{
101
+		$this->bootstrapDependencyInjectionContainer();
102
+		$this->bootstrapDomain();
103
+		$bootstrap_request = $this->bootstrapRequestResponseObjects();
104
+		add_action(
105
+			'EE_Load_Espresso_Core__handle_request__initialize_core_loading',
106
+			array($bootstrap_request, 'setupLegacyRequest')
107
+		);
108
+		$this->runRequestStack();
109
+	}
110 110
 
111 111
 
112
-    /**
113
-     * @throws ReflectionException
114
-     * @throws EE_Error
115
-     * @throws InvalidArgumentException
116
-     * @throws InvalidDataTypeException
117
-     * @throws InvalidInterfaceException
118
-     * @throws OutOfBoundsException
119
-     */
120
-    private function bootstrapDependencyInjectionContainer()
121
-    {
122
-        $bootstrap_di = new BootstrapDependencyInjectionContainer();
123
-        $bootstrap_di->buildLegacyDependencyInjectionContainer();
124
-        $bootstrap_di->buildLoader();
125
-        $registry = $bootstrap_di->getRegistry();
126
-        $dependency_map = $bootstrap_di->getDependencyMap();
127
-        $dependency_map->initialize();
128
-        $registry->initialize();
129
-        $this->loader = $bootstrap_di->getLoader();
130
-    }
112
+	/**
113
+	 * @throws ReflectionException
114
+	 * @throws EE_Error
115
+	 * @throws InvalidArgumentException
116
+	 * @throws InvalidDataTypeException
117
+	 * @throws InvalidInterfaceException
118
+	 * @throws OutOfBoundsException
119
+	 */
120
+	private function bootstrapDependencyInjectionContainer()
121
+	{
122
+		$bootstrap_di = new BootstrapDependencyInjectionContainer();
123
+		$bootstrap_di->buildLegacyDependencyInjectionContainer();
124
+		$bootstrap_di->buildLoader();
125
+		$registry = $bootstrap_di->getRegistry();
126
+		$dependency_map = $bootstrap_di->getDependencyMap();
127
+		$dependency_map->initialize();
128
+		$registry->initialize();
129
+		$this->loader = $bootstrap_di->getLoader();
130
+	}
131 131
 
132 132
 
133
-    /**
134
-     * configures the Domain object for core
135
-     *
136
-     * @return void
137
-     * @throws DomainException
138
-     * @throws InvalidArgumentException
139
-     * @throws InvalidDataTypeException
140
-     * @throws InvalidClassException
141
-     * @throws InvalidFilePathException
142
-     * @throws InvalidInterfaceException
143
-     */
144
-    private function bootstrapDomain()
145
-    {
146
-        DomainFactory::getEventEspressoCoreDomain();
147
-    }
133
+	/**
134
+	 * configures the Domain object for core
135
+	 *
136
+	 * @return void
137
+	 * @throws DomainException
138
+	 * @throws InvalidArgumentException
139
+	 * @throws InvalidDataTypeException
140
+	 * @throws InvalidClassException
141
+	 * @throws InvalidFilePathException
142
+	 * @throws InvalidInterfaceException
143
+	 */
144
+	private function bootstrapDomain()
145
+	{
146
+		DomainFactory::getEventEspressoCoreDomain();
147
+	}
148 148
 
149 149
 
150
-    /**
151
-     * sets up the request and response objects
152
-     *
153
-     * @return BootstrapRequestResponseObjects
154
-     * @throws InvalidArgumentException
155
-     */
156
-    private function bootstrapRequestResponseObjects()
157
-    {
158
-        /** @var BootstrapRequestResponseObjects $bootstrap_request */
159
-        $bootstrap_request = $this->loader->getShared(
160
-            'EventEspresso\core\services\bootstrap\BootstrapRequestResponseObjects',
161
-            array($this->loader)
162
-        );
163
-        $bootstrap_request->buildRequestResponse();
164
-        $bootstrap_request->shareRequestResponse();
165
-        $this->request = $this->loader->getShared('EventEspresso\core\services\request\Request');
166
-        $this->response = $this->loader->getShared('EventEspresso\core\services\request\Response');
167
-        return $bootstrap_request;
168
-    }
150
+	/**
151
+	 * sets up the request and response objects
152
+	 *
153
+	 * @return BootstrapRequestResponseObjects
154
+	 * @throws InvalidArgumentException
155
+	 */
156
+	private function bootstrapRequestResponseObjects()
157
+	{
158
+		/** @var BootstrapRequestResponseObjects $bootstrap_request */
159
+		$bootstrap_request = $this->loader->getShared(
160
+			'EventEspresso\core\services\bootstrap\BootstrapRequestResponseObjects',
161
+			array($this->loader)
162
+		);
163
+		$bootstrap_request->buildRequestResponse();
164
+		$bootstrap_request->shareRequestResponse();
165
+		$this->request = $this->loader->getShared('EventEspresso\core\services\request\Request');
166
+		$this->response = $this->loader->getShared('EventEspresso\core\services\request\Response');
167
+		return $bootstrap_request;
168
+	}
169 169
 
170 170
 
171
-    /**
172
-     * run_request_stack
173
-     * construct request stack and run middleware apps
174
-     *
175
-     * @throws EE_Error
176
-     * @throws Exception
177
-     */
178
-    public function runRequestStack()
179
-    {
180
-        $this->loadAutoloader();
181
-        $this->setAutoloadersForRequiredFiles();
182
-        $this->request_stack_builder = $this->buildRequestStack();
183
-        $this->request_stack = $this->request_stack_builder->resolve(
184
-            new RequestStackCoreApp()
185
-        );
186
-        $this->request_stack->handleRequest($this->request, $this->response);
187
-        $this->request_stack->handleResponse();
188
-    }
171
+	/**
172
+	 * run_request_stack
173
+	 * construct request stack and run middleware apps
174
+	 *
175
+	 * @throws EE_Error
176
+	 * @throws Exception
177
+	 */
178
+	public function runRequestStack()
179
+	{
180
+		$this->loadAutoloader();
181
+		$this->setAutoloadersForRequiredFiles();
182
+		$this->request_stack_builder = $this->buildRequestStack();
183
+		$this->request_stack = $this->request_stack_builder->resolve(
184
+			new RequestStackCoreApp()
185
+		);
186
+		$this->request_stack->handleRequest($this->request, $this->response);
187
+		$this->request_stack->handleResponse();
188
+	}
189 189
 
190 190
 
191
-    /**
192
-     * load_autoloader
193
-     *
194
-     * @throws EE_Error
195
-     */
196
-    protected function loadAutoloader()
197
-    {
198
-        // load interfaces
199
-        espresso_load_required(
200
-            'EEH_Autoloader',
201
-            EE_CORE . 'helpers' . DS . 'EEH_Autoloader.helper.php'
202
-        );
203
-        EEH_Autoloader::instance();
204
-    }
191
+	/**
192
+	 * load_autoloader
193
+	 *
194
+	 * @throws EE_Error
195
+	 */
196
+	protected function loadAutoloader()
197
+	{
198
+		// load interfaces
199
+		espresso_load_required(
200
+			'EEH_Autoloader',
201
+			EE_CORE . 'helpers' . DS . 'EEH_Autoloader.helper.php'
202
+		);
203
+		EEH_Autoloader::instance();
204
+	}
205 205
 
206 206
 
207
-    /**
208
-     * load_required_files
209
-     *
210
-     * @throws EE_Error
211
-     */
212
-    protected function setAutoloadersForRequiredFiles()
213
-    {
214
-        // load interfaces
215
-        EEH_Autoloader::register_autoloaders_for_each_file_in_folder(EE_CORE . 'interfaces', true);
216
-        // load helpers
217
-        EEH_Autoloader::register_autoloaders_for_each_file_in_folder(EE_HELPERS);
218
-        // register legacy request stack classes just in case
219
-        EEH_Autoloader::register_autoloaders_for_each_file_in_folder(EE_CORE . 'request_stack' . DS);
220
-        // register legacy middleware classes just in case
221
-        EEH_Autoloader::register_autoloaders_for_each_file_in_folder(EE_CORE . 'middleware' . DS);
222
-    }
207
+	/**
208
+	 * load_required_files
209
+	 *
210
+	 * @throws EE_Error
211
+	 */
212
+	protected function setAutoloadersForRequiredFiles()
213
+	{
214
+		// load interfaces
215
+		EEH_Autoloader::register_autoloaders_for_each_file_in_folder(EE_CORE . 'interfaces', true);
216
+		// load helpers
217
+		EEH_Autoloader::register_autoloaders_for_each_file_in_folder(EE_HELPERS);
218
+		// register legacy request stack classes just in case
219
+		EEH_Autoloader::register_autoloaders_for_each_file_in_folder(EE_CORE . 'request_stack' . DS);
220
+		// register legacy middleware classes just in case
221
+		EEH_Autoloader::register_autoloaders_for_each_file_in_folder(EE_CORE . 'middleware' . DS);
222
+	}
223 223
 
224 224
 
225
-    /**
226
-     * build_request_stack
227
-     *
228
-     * @return RequestStackBuilder
229
-     */
230
-    public function buildRequestStack()
231
-    {
232
-        $request_stack_builder = new RequestStackBuilder($this->loader);
233
-        /**
234
-         * ! IMPORTANT ! The middleware stack operates FILO : FIRST IN LAST OUT
235
-         * so items at the beginning of the final middleware stack will run last.
236
-         * First parameter is the middleware classname, second is an array of arguments
237
-         */
238
-        $stack_apps = apply_filters(
239
-            'FHEE__EventEspresso_core_services_bootstrap_BootstrapCore__buildRequestStack__stack_apps',
240
-            array(
241
-                // first in last out
242
-                'EventEspresso\core\services\request\middleware\BotDetector'                 => array(),
243
-                'EventEspresso\core\services\request\middleware\DetectFileEditorRequest'     => array(),
244
-                'EventEspresso\core\services\request\middleware\PreProductionVersionWarning' => array(),
245
-                'EventEspresso\core\services\request\middleware\RecommendedVersions'         => array(),
246
-                // last in first out
247
-                'EventEspresso\core\services\request\middleware\DetectLogin'                 => array(),
248
-            )
249
-        );
250
-        // legacy filter for backwards compatibility
251
-        $stack_apps = apply_filters(
252
-            'FHEE__EE_Bootstrap__build_request_stack__stack_apps',
253
-            $stack_apps
254
-        );
255
-        // load middleware onto stack : FILO (First In Last Out)
256
-        // items at the beginning of the $stack_apps array will run last
257
-        foreach ((array) $stack_apps as $stack_app => $stack_app_args) {
258
-            $request_stack_builder->push(array($stack_app, $stack_app_args));
259
-        }
260
-        // finally, we'll add this on its own because we need it to always be part of the stack
261
-        // and we also need it to always run first because the rest of the system relies on it
262
-        $request_stack_builder->push(
263
-            array('EventEspresso\core\services\request\middleware\SetRequestTypeContextChecker', array())
264
-        );
265
-        return apply_filters(
266
-            'FHEE__EE_Bootstrap__build_request_stack__request_stack_builder',
267
-            $request_stack_builder
268
-        );
269
-    }
225
+	/**
226
+	 * build_request_stack
227
+	 *
228
+	 * @return RequestStackBuilder
229
+	 */
230
+	public function buildRequestStack()
231
+	{
232
+		$request_stack_builder = new RequestStackBuilder($this->loader);
233
+		/**
234
+		 * ! IMPORTANT ! The middleware stack operates FILO : FIRST IN LAST OUT
235
+		 * so items at the beginning of the final middleware stack will run last.
236
+		 * First parameter is the middleware classname, second is an array of arguments
237
+		 */
238
+		$stack_apps = apply_filters(
239
+			'FHEE__EventEspresso_core_services_bootstrap_BootstrapCore__buildRequestStack__stack_apps',
240
+			array(
241
+				// first in last out
242
+				'EventEspresso\core\services\request\middleware\BotDetector'                 => array(),
243
+				'EventEspresso\core\services\request\middleware\DetectFileEditorRequest'     => array(),
244
+				'EventEspresso\core\services\request\middleware\PreProductionVersionWarning' => array(),
245
+				'EventEspresso\core\services\request\middleware\RecommendedVersions'         => array(),
246
+				// last in first out
247
+				'EventEspresso\core\services\request\middleware\DetectLogin'                 => array(),
248
+			)
249
+		);
250
+		// legacy filter for backwards compatibility
251
+		$stack_apps = apply_filters(
252
+			'FHEE__EE_Bootstrap__build_request_stack__stack_apps',
253
+			$stack_apps
254
+		);
255
+		// load middleware onto stack : FILO (First In Last Out)
256
+		// items at the beginning of the $stack_apps array will run last
257
+		foreach ((array) $stack_apps as $stack_app => $stack_app_args) {
258
+			$request_stack_builder->push(array($stack_app, $stack_app_args));
259
+		}
260
+		// finally, we'll add this on its own because we need it to always be part of the stack
261
+		// and we also need it to always run first because the rest of the system relies on it
262
+		$request_stack_builder->push(
263
+			array('EventEspresso\core\services\request\middleware\SetRequestTypeContextChecker', array())
264
+		);
265
+		return apply_filters(
266
+			'FHEE__EE_Bootstrap__build_request_stack__request_stack_builder',
267
+			$request_stack_builder
268
+		);
269
+	}
270 270
 }
Please login to merge, or discard this patch.
modules/core_rest_api/EED_Core_Rest_Api.module.php 2 patches
Indentation   +1240 added lines, -1240 removed lines patch added patch discarded remove patch
@@ -22,1244 +22,1244 @@
 block discarded – undo
22 22
 class EED_Core_Rest_Api extends \EED_Module
23 23
 {
24 24
 
25
-    const ee_api_namespace = Domain::API_NAMESPACE;
26
-
27
-    const ee_api_namespace_for_regex = 'ee\/v([^/]*)\/';
28
-
29
-    const saved_routes_option_names = 'ee_core_routes';
30
-
31
-    /**
32
-     * string used in _links response bodies to make them globally unique.
33
-     *
34
-     * @see http://v2.wp-api.org/extending/linking/
35
-     */
36
-    const ee_api_link_namespace = 'https://api.eventespresso.com/';
37
-
38
-    /**
39
-     * @var CalculatedModelFields
40
-     */
41
-    protected static $_field_calculator;
42
-
43
-
44
-    /**
45
-     * @return EED_Core_Rest_Api|EED_Module
46
-     */
47
-    public static function instance()
48
-    {
49
-        self::$_field_calculator = new CalculatedModelFields();
50
-        return parent::get_instance(__CLASS__);
51
-    }
52
-
53
-
54
-    /**
55
-     *    set_hooks - for hooking into EE Core, other modules, etc
56
-     *
57
-     * @access    public
58
-     * @return    void
59
-     */
60
-    public static function set_hooks()
61
-    {
62
-        self::set_hooks_both();
63
-    }
64
-
65
-
66
-    /**
67
-     *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
68
-     *
69
-     * @access    public
70
-     * @return    void
71
-     */
72
-    public static function set_hooks_admin()
73
-    {
74
-        self::set_hooks_both();
75
-    }
76
-
77
-
78
-    public static function set_hooks_both()
79
-    {
80
-        add_action('rest_api_init', array('EED_Core_Rest_Api', 'register_routes'), 10);
81
-        add_action('rest_api_init', array('EED_Core_Rest_Api', 'set_hooks_rest_api'), 5);
82
-        add_filter('rest_route_data', array('EED_Core_Rest_Api', 'hide_old_endpoints'), 10, 2);
83
-        add_filter(
84
-            'rest_index',
85
-            array('EventEspresso\core\libraries\rest_api\controllers\model\Meta', 'filterEeMetadataIntoIndex')
86
-        );
87
-        EED_Core_Rest_Api::invalidate_cached_route_data_on_version_change();
88
-    }
89
-
90
-
91
-    /**
92
-     * sets up hooks which only need to be included as part of REST API requests;
93
-     * other requests like to the frontend or admin etc don't need them
94
-     *
95
-     * @throws \EE_Error
96
-     */
97
-    public static function set_hooks_rest_api()
98
-    {
99
-        // set hooks which account for changes made to the API
100
-        EED_Core_Rest_Api::_set_hooks_for_changes();
101
-    }
102
-
103
-
104
-    /**
105
-     * public wrapper of _set_hooks_for_changes.
106
-     * Loads all the hooks which make requests to old versions of the API
107
-     * appear the same as they always did
108
-     *
109
-     * @throws EE_Error
110
-     */
111
-    public static function set_hooks_for_changes()
112
-    {
113
-        self::_set_hooks_for_changes();
114
-    }
115
-
116
-
117
-    /**
118
-     * Loads all the hooks which make requests to old versions of the API
119
-     * appear the same as they always did
120
-     *
121
-     * @throws EE_Error
122
-     */
123
-    protected static function _set_hooks_for_changes()
124
-    {
125
-        $folder_contents = EEH_File::get_contents_of_folders(array(EE_LIBRARIES . 'rest_api' . DS . 'changes'), false);
126
-        foreach ($folder_contents as $classname_in_namespace => $filepath) {
127
-            // ignore the base parent class
128
-            // and legacy named classes
129
-            if ($classname_in_namespace === 'ChangesInBase'
130
-                || strpos($classname_in_namespace, 'Changes_In_') === 0
131
-            ) {
132
-                continue;
133
-            }
134
-            $full_classname = 'EventEspresso\core\libraries\rest_api\changes\\' . $classname_in_namespace;
135
-            if (class_exists($full_classname)) {
136
-                $instance_of_class = new $full_classname;
137
-                if ($instance_of_class instanceof ChangesInBase) {
138
-                    $instance_of_class->setHooks();
139
-                }
140
-            }
141
-        }
142
-    }
143
-
144
-
145
-    /**
146
-     * Filters the WP routes to add our EE-related ones. This takes a bit of time
147
-     * so we actually prefer to only do it when an EE plugin is activated or upgraded
148
-     *
149
-     * @throws \EE_Error
150
-     */
151
-    public static function register_routes()
152
-    {
153
-        foreach (EED_Core_Rest_Api::get_ee_route_data() as $namespace => $relative_routes) {
154
-            foreach ($relative_routes as $relative_route => $data_for_multiple_endpoints) {
155
-                /**
156
-                 * @var array     $data_for_multiple_endpoints numerically indexed array
157
-                 *                                         but can also contain route options like {
158
-                 * @type array    $schema                      {
159
-                 * @type callable $schema_callback
160
-                 * @type array    $callback_args               arguments that will be passed to the callback, after the
161
-                 * WP_REST_Request of course
162
-                 * }
163
-                 * }
164
-                 */
165
-                // when registering routes, register all the endpoints' data at the same time
166
-                $multiple_endpoint_args = array();
167
-                foreach ($data_for_multiple_endpoints as $endpoint_key => $data_for_single_endpoint) {
168
-                    /**
169
-                     * @var array     $data_for_single_endpoint {
170
-                     * @type callable $callback
171
-                     * @type string methods
172
-                     * @type array args
173
-                     * @type array _links
174
-                     * @type array    $callback_args            arguments that will be passed to the callback, after the
175
-                     * WP_REST_Request of course
176
-                     * }
177
-                     */
178
-                    // skip route options
179
-                    if (! is_numeric($endpoint_key)) {
180
-                        continue;
181
-                    }
182
-                    if (! isset($data_for_single_endpoint['callback'], $data_for_single_endpoint['methods'])) {
183
-                        throw new EE_Error(
184
-                            esc_html__(
185
-                            // @codingStandardsIgnoreStart
186
-                                'Endpoint configuration data needs to have entries "callback" (callable) and "methods" (comma-separated list of accepts HTTP methods).',
187
-                                // @codingStandardsIgnoreEnd
188
-                                'event_espresso'
189
-                            )
190
-                        );
191
-                    }
192
-                    $callback = $data_for_single_endpoint['callback'];
193
-                    $single_endpoint_args = array(
194
-                        'methods' => $data_for_single_endpoint['methods'],
195
-                        'args'    => isset($data_for_single_endpoint['args']) ? $data_for_single_endpoint['args']
196
-                            : array(),
197
-                    );
198
-                    if (isset($data_for_single_endpoint['_links'])) {
199
-                        $single_endpoint_args['_links'] = $data_for_single_endpoint['_links'];
200
-                    }
201
-                    if (isset($data_for_single_endpoint['callback_args'])) {
202
-                        $callback_args = $data_for_single_endpoint['callback_args'];
203
-                        $single_endpoint_args['callback'] = function (\WP_REST_Request $request) use (
204
-                            $callback,
205
-                            $callback_args
206
-                        ) {
207
-                            array_unshift($callback_args, $request);
208
-                            return call_user_func_array(
209
-                                $callback,
210
-                                $callback_args
211
-                            );
212
-                        };
213
-                    } else {
214
-                        $single_endpoint_args['callback'] = $data_for_single_endpoint['callback'];
215
-                    }
216
-                    $multiple_endpoint_args[] = $single_endpoint_args;
217
-                }
218
-                if (isset($data_for_multiple_endpoints['schema'])) {
219
-                    $schema_route_data = $data_for_multiple_endpoints['schema'];
220
-                    $schema_callback = $schema_route_data['schema_callback'];
221
-                    $callback_args = $schema_route_data['callback_args'];
222
-                    $multiple_endpoint_args['schema'] = function () use ($schema_callback, $callback_args) {
223
-                        return call_user_func_array(
224
-                            $schema_callback,
225
-                            $callback_args
226
-                        );
227
-                    };
228
-                }
229
-                register_rest_route(
230
-                    $namespace,
231
-                    $relative_route,
232
-                    $multiple_endpoint_args
233
-                );
234
-            }
235
-        }
236
-    }
237
-
238
-
239
-    /**
240
-     * Checks if there was a version change or something that merits invalidating the cached
241
-     * route data. If so, invalidates the cached route data so that it gets refreshed
242
-     * next time the WP API is used
243
-     */
244
-    public static function invalidate_cached_route_data_on_version_change()
245
-    {
246
-        if (EE_System::instance()->detect_req_type() !== EE_System::req_type_normal) {
247
-            EED_Core_Rest_Api::invalidate_cached_route_data();
248
-        }
249
-        foreach (EE_Registry::instance()->addons as $addon) {
250
-            if ($addon instanceof EE_Addon && $addon->detect_req_type() !== EE_System::req_type_normal) {
251
-                EED_Core_Rest_Api::invalidate_cached_route_data();
252
-            }
253
-        }
254
-    }
255
-
256
-
257
-    /**
258
-     * Removes the cached route data so it will get refreshed next time the WP API is used
259
-     */
260
-    public static function invalidate_cached_route_data()
261
-    {
262
-        // delete the saved EE REST API routes
263
-        foreach (EED_Core_Rest_Api::versions_served() as $version => $hidden) {
264
-            delete_option(EED_Core_Rest_Api::saved_routes_option_names . $version);
265
-        }
266
-    }
267
-
268
-
269
-    /**
270
-     * Gets the EE route data
271
-     *
272
-     * @return array top-level key is the namespace, next-level key is the route and its value is array{
273
-     * @throws \EE_Error
274
-     * @type string|array $callback
275
-     * @type string       $methods
276
-     * @type boolean      $hidden_endpoint
277
-     * }
278
-     */
279
-    public static function get_ee_route_data()
280
-    {
281
-        $ee_routes = array();
282
-        foreach (self::versions_served() as $version => $hidden_endpoints) {
283
-            $ee_routes[ self::ee_api_namespace . $version ] = self::_get_ee_route_data_for_version(
284
-                $version,
285
-                $hidden_endpoints
286
-            );
287
-        }
288
-        return $ee_routes;
289
-    }
290
-
291
-
292
-    /**
293
-     * Gets the EE route data from the wp options if it exists already,
294
-     * otherwise re-generates it and saves it to the option
295
-     *
296
-     * @param string  $version
297
-     * @param boolean $hidden_endpoints
298
-     * @return array
299
-     * @throws \EE_Error
300
-     */
301
-    protected static function _get_ee_route_data_for_version($version, $hidden_endpoints = false)
302
-    {
303
-        $ee_routes = get_option(self::saved_routes_option_names . $version, null);
304
-        if (! $ee_routes || (defined('EE_REST_API_DEBUG_MODE') && EE_REST_API_DEBUG_MODE)) {
305
-            $ee_routes = self::_save_ee_route_data_for_version($version, $hidden_endpoints);
306
-        }
307
-        return $ee_routes;
308
-    }
309
-
310
-
311
-    /**
312
-     * Saves the EE REST API route data to a wp option and returns it
313
-     *
314
-     * @param string  $version
315
-     * @param boolean $hidden_endpoints
316
-     * @return mixed|null
317
-     * @throws \EE_Error
318
-     */
319
-    protected static function _save_ee_route_data_for_version($version, $hidden_endpoints = false)
320
-    {
321
-        $instance = self::instance();
322
-        $routes = apply_filters(
323
-            'EED_Core_Rest_Api__save_ee_route_data_for_version__routes',
324
-            array_replace_recursive(
325
-                $instance->_get_config_route_data_for_version($version, $hidden_endpoints),
326
-                $instance->_get_meta_route_data_for_version($version, $hidden_endpoints),
327
-                $instance->_get_model_route_data_for_version($version, $hidden_endpoints),
328
-                $instance->_get_rpc_route_data_for_version($version, $hidden_endpoints)
329
-            )
330
-        );
331
-        $option_name = self::saved_routes_option_names . $version;
332
-        if (get_option($option_name)) {
333
-            update_option($option_name, $routes, true);
334
-        } else {
335
-            add_option($option_name, $routes, null, 'no');
336
-        }
337
-        return $routes;
338
-    }
339
-
340
-
341
-    /**
342
-     * Calculates all the EE routes and saves it to a WordPress option so we don't
343
-     * need to calculate it on every request
344
-     *
345
-     * @deprecated since version 4.9.1
346
-     * @return void
347
-     */
348
-    public static function save_ee_routes()
349
-    {
350
-        if (EE_Maintenance_Mode::instance()->models_can_query()) {
351
-            $instance = self::instance();
352
-            $routes = apply_filters(
353
-                'EED_Core_Rest_Api__save_ee_routes__routes',
354
-                array_replace_recursive(
355
-                    $instance->_register_config_routes(),
356
-                    $instance->_register_meta_routes(),
357
-                    $instance->_register_model_routes(),
358
-                    $instance->_register_rpc_routes()
359
-                )
360
-            );
361
-            update_option(self::saved_routes_option_names, $routes, true);
362
-        }
363
-    }
364
-
365
-
366
-    /**
367
-     * Gets all the route information relating to EE models
368
-     *
369
-     * @return array @see get_ee_route_data
370
-     * @deprecated since version 4.9.1
371
-     */
372
-    protected function _register_model_routes()
373
-    {
374
-        $model_routes = array();
375
-        foreach (self::versions_served() as $version => $hidden_endpoint) {
376
-            $model_routes[ EED_Core_Rest_Api::ee_api_namespace
377
-                           . $version ] = $this->_get_config_route_data_for_version($version, $hidden_endpoint);
378
-        }
379
-        return $model_routes;
380
-    }
381
-
382
-
383
-    /**
384
-     * Decides whether or not to add write endpoints for this model.
385
-     *
386
-     * Currently, this defaults to exclude all global tables and models
387
-     * which would allow inserting WP core data (we don't want to duplicate
388
-     * what WP API does, as it's unnecessary, extra work, and potentially extra bugs)
389
-     *
390
-     * @param EEM_Base $model
391
-     * @return bool
392
-     */
393
-    public static function should_have_write_endpoints(EEM_Base $model)
394
-    {
395
-        if ($model->is_wp_core_model()) {
396
-            return false;
397
-        }
398
-        foreach ($model->get_tables() as $table) {
399
-            if ($table->is_global()) {
400
-                return false;
401
-            }
402
-        }
403
-        return true;
404
-    }
405
-
406
-
407
-    /**
408
-     * Gets the names of all models which should have plural routes (eg `ee/v4.8.36/events`)
409
-     * in this versioned namespace of EE4
410
-     *
411
-     * @param $version
412
-     * @return array keys are model names (eg 'Event') and values ar either classnames (eg 'EEM_Event')
413
-     */
414
-    public static function model_names_with_plural_routes($version)
415
-    {
416
-        $model_version_info = new ModelVersionInfo($version);
417
-        $models_to_register = $model_version_info->modelsForRequestedVersion();
418
-        // let's not bother having endpoints for extra metas
419
-        unset(
420
-            $models_to_register['Extra_Meta'],
421
-            $models_to_register['Extra_Join'],
422
-            $models_to_register['Post_Meta']
423
-        );
424
-        return apply_filters(
425
-            'FHEE__EED_Core_REST_API___register_model_routes',
426
-            $models_to_register
427
-        );
428
-    }
429
-
430
-
431
-    /**
432
-     * Gets the route data for EE models in the specified version
433
-     *
434
-     * @param string  $version
435
-     * @param boolean $hidden_endpoint
436
-     * @return array
437
-     * @throws EE_Error
438
-     */
439
-    protected function _get_model_route_data_for_version($version, $hidden_endpoint = false)
440
-    {
441
-        $model_routes = array();
442
-        $model_version_info = new ModelVersionInfo($version);
443
-        foreach (EED_Core_Rest_Api::model_names_with_plural_routes($version) as $model_name => $model_classname) {
444
-            $model = \EE_Registry::instance()->load_model($model_name);
445
-            // if this isn't a valid model then let's skip iterate to the next item in the loop.
446
-            if (! $model instanceof EEM_Base) {
447
-                continue;
448
-            }
449
-            // yes we could just register one route for ALL models, but then they wouldn't show up in the index
450
-            $plural_model_route = EED_Core_Rest_Api::get_collection_route($model);
451
-            $singular_model_route = EED_Core_Rest_Api::get_entity_route($model, '(?P<id>[^\/]+)');
452
-            $model_routes[ $plural_model_route ] = array(
453
-                array(
454
-                    'callback'        => array(
455
-                        'EventEspresso\core\libraries\rest_api\controllers\model\Read',
456
-                        'handleRequestGetAll',
457
-                    ),
458
-                    'callback_args'   => array($version, $model_name),
459
-                    'methods'         => WP_REST_Server::READABLE,
460
-                    'hidden_endpoint' => $hidden_endpoint,
461
-                    'args'            => $this->_get_read_query_params($model, $version),
462
-                    '_links'          => array(
463
-                        'self' => rest_url(EED_Core_Rest_Api::ee_api_namespace . $version . $singular_model_route),
464
-                    ),
465
-                ),
466
-                'schema' => array(
467
-                    'schema_callback' => array(
468
-                        'EventEspresso\core\libraries\rest_api\controllers\model\Read',
469
-                        'handleSchemaRequest',
470
-                    ),
471
-                    'callback_args'   => array($version, $model_name),
472
-                ),
473
-            );
474
-            $model_routes[ $singular_model_route ] = array(
475
-                array(
476
-                    'callback'        => array(
477
-                        'EventEspresso\core\libraries\rest_api\controllers\model\Read',
478
-                        'handleRequestGetOne',
479
-                    ),
480
-                    'callback_args'   => array($version, $model_name),
481
-                    'methods'         => WP_REST_Server::READABLE,
482
-                    'hidden_endpoint' => $hidden_endpoint,
483
-                    'args'            => $this->_get_response_selection_query_params($model, $version),
484
-                ),
485
-            );
486
-            if (apply_filters(
487
-                'FHEE__EED_Core_Rest_Api___get_model_route_data_for_version__add_write_endpoints',
488
-                EED_Core_Rest_Api::should_have_write_endpoints($model),
489
-                $model
490
-            )) {
491
-                $model_routes[ $plural_model_route ][] = array(
492
-                    'callback'        => array(
493
-                        'EventEspresso\core\libraries\rest_api\controllers\model\Write',
494
-                        'handleRequestInsert',
495
-                    ),
496
-                    'callback_args'   => array($version, $model_name),
497
-                    'methods'         => WP_REST_Server::CREATABLE,
498
-                    'hidden_endpoint' => $hidden_endpoint,
499
-                    'args'            => $this->_get_write_params($model_name, $model_version_info, true),
500
-                );
501
-                $model_routes[ $singular_model_route ] = array_merge(
502
-                    $model_routes[ $singular_model_route ],
503
-                    array(
504
-                        array(
505
-                            'callback'        => array(
506
-                                'EventEspresso\core\libraries\rest_api\controllers\model\Write',
507
-                                'handleRequestUpdate',
508
-                            ),
509
-                            'callback_args'   => array($version, $model_name),
510
-                            'methods'         => WP_REST_Server::EDITABLE,
511
-                            'hidden_endpoint' => $hidden_endpoint,
512
-                            'args'            => $this->_get_write_params($model_name, $model_version_info),
513
-                        ),
514
-                        array(
515
-                            'callback'        => array(
516
-                                'EventEspresso\core\libraries\rest_api\controllers\model\Write',
517
-                                'handleRequestDelete',
518
-                            ),
519
-                            'callback_args'   => array($version, $model_name),
520
-                            'methods'         => WP_REST_Server::DELETABLE,
521
-                            'hidden_endpoint' => $hidden_endpoint,
522
-                            'args'            => $this->_get_delete_query_params($model, $version),
523
-                        ),
524
-                    )
525
-                );
526
-            }
527
-            foreach ($model->relation_settings() as $relation_name => $relation_obj) {
528
-                $related_route = EED_Core_Rest_Api::get_relation_route_via(
529
-                    $model,
530
-                    '(?P<id>[^\/]+)',
531
-                    $relation_obj
532
-                );
533
-                $endpoints = array(
534
-                    array(
535
-                        'callback'        => array(
536
-                            'EventEspresso\core\libraries\rest_api\controllers\model\Read',
537
-                            'handleRequestGetRelated',
538
-                        ),
539
-                        'callback_args'   => array($version, $model_name, $relation_name),
540
-                        'methods'         => WP_REST_Server::READABLE,
541
-                        'hidden_endpoint' => $hidden_endpoint,
542
-                        'args'            => $this->_get_read_query_params($relation_obj->get_other_model(), $version),
543
-                    ),
544
-                );
545
-                $model_routes[ $related_route ] = $endpoints;
546
-            }
547
-        }
548
-        return $model_routes;
549
-    }
550
-
551
-
552
-    /**
553
-     * Gets the relative URI to a model's REST API plural route, after the EE4 versioned namespace,
554
-     * excluding the preceding slash.
555
-     * Eg you pass get_plural_route_to('Event') = 'events'
556
-     *
557
-     * @param EEM_Base $model
558
-     * @return string
559
-     */
560
-    public static function get_collection_route(EEM_Base $model)
561
-    {
562
-        return EEH_Inflector::pluralize_and_lower($model->get_this_model_name());
563
-    }
564
-
565
-
566
-    /**
567
-     * Gets the relative URI to a model's REST API singular route, after the EE4 versioned namespace,
568
-     * excluding the preceding slash.
569
-     * Eg you pass get_plural_route_to('Event', 12) = 'events/12'
570
-     *
571
-     * @param EEM_Base $model eg Event or Venue
572
-     * @param string   $id
573
-     * @return string
574
-     */
575
-    public static function get_entity_route($model, $id)
576
-    {
577
-        return EED_Core_Rest_Api::get_collection_route($model) . '/' . $id;
578
-    }
579
-
580
-
581
-    /**
582
-     * Gets the relative URI to a model's REST API singular route, after the EE4 versioned namespace,
583
-     * excluding the preceding slash.
584
-     * Eg you pass get_plural_route_to('Event', 12) = 'events/12'
585
-     *
586
-     * @param EEM_Base               $model eg Event or Venue
587
-     * @param string                 $id
588
-     * @param EE_Model_Relation_Base $relation_obj
589
-     * @return string
590
-     */
591
-    public static function get_relation_route_via(EEM_Base $model, $id, EE_Model_Relation_Base $relation_obj)
592
-    {
593
-        $related_model_name_endpoint_part = ModelRead::getRelatedEntityName(
594
-            $relation_obj->get_other_model()->get_this_model_name(),
595
-            $relation_obj
596
-        );
597
-        return EED_Core_Rest_Api::get_entity_route($model, $id) . '/' . $related_model_name_endpoint_part;
598
-    }
599
-
600
-
601
-    /**
602
-     * Adds onto the $relative_route the EE4 REST API versioned namespace.
603
-     * Eg if given '4.8.36' and 'events', will return 'ee/v4.8.36/events'
604
-     *
605
-     * @param string $relative_route
606
-     * @param string $version
607
-     * @return string
608
-     */
609
-    public static function get_versioned_route_to($relative_route, $version = '4.8.36')
610
-    {
611
-        return '/' . EED_Core_Rest_Api::ee_api_namespace . $version . '/' . $relative_route;
612
-    }
613
-
614
-
615
-    /**
616
-     * Adds all the RPC-style routes (remote procedure call-like routes, ie
617
-     * routes that don't conform to the traditional REST CRUD-style).
618
-     *
619
-     * @deprecated since 4.9.1
620
-     */
621
-    protected function _register_rpc_routes()
622
-    {
623
-        $routes = array();
624
-        foreach (self::versions_served() as $version => $hidden_endpoint) {
625
-            $routes[ self::ee_api_namespace . $version ] = $this->_get_rpc_route_data_for_version(
626
-                $version,
627
-                $hidden_endpoint
628
-            );
629
-        }
630
-        return $routes;
631
-    }
632
-
633
-
634
-    /**
635
-     * @param string  $version
636
-     * @param boolean $hidden_endpoint
637
-     * @return array
638
-     */
639
-    protected function _get_rpc_route_data_for_version($version, $hidden_endpoint = false)
640
-    {
641
-        $this_versions_routes = array();
642
-        // checkin endpoint
643
-        $this_versions_routes['registrations/(?P<REG_ID>\d+)/toggle_checkin_for_datetime/(?P<DTT_ID>\d+)'] = array(
644
-            array(
645
-                'callback'        => array(
646
-                    'EventEspresso\core\libraries\rest_api\controllers\rpc\Checkin',
647
-                    'handleRequestToggleCheckin',
648
-                ),
649
-                'methods'         => WP_REST_Server::CREATABLE,
650
-                'hidden_endpoint' => $hidden_endpoint,
651
-                'args'            => array(
652
-                    'force' => array(
653
-                        'required'    => false,
654
-                        'default'     => false,
655
-                        'description' => __(
656
-                        // @codingStandardsIgnoreStart
657
-                            'Whether to force toggle checkin, or to verify the registration status and allowed ticket uses',
658
-                            // @codingStandardsIgnoreEnd
659
-                            'event_espresso'
660
-                        ),
661
-                    ),
662
-                ),
663
-                'callback_args'   => array($version),
664
-            ),
665
-        );
666
-        return apply_filters(
667
-            'FHEE__EED_Core_Rest_Api___register_rpc_routes__this_versions_routes',
668
-            $this_versions_routes,
669
-            $version,
670
-            $hidden_endpoint
671
-        );
672
-    }
673
-
674
-
675
-    /**
676
-     * Gets the query params that can be used when request one or many
677
-     *
678
-     * @param EEM_Base $model
679
-     * @param string   $version
680
-     * @return array
681
-     */
682
-    protected function _get_response_selection_query_params(\EEM_Base $model, $version)
683
-    {
684
-        return apply_filters(
685
-            'FHEE__EED_Core_Rest_Api___get_response_selection_query_params',
686
-            array(
687
-                'include'   => array(
688
-                    'required' => false,
689
-                    'default'  => '*',
690
-                    'type'     => 'string',
691
-                ),
692
-                'calculate' => array(
693
-                    'required'          => false,
694
-                    'default'           => '',
695
-                    'enum'              => self::$_field_calculator->retrieveCalculatedFieldsForModel($model),
696
-                    'type'              => 'string',
697
-                    // because we accept a CSV'd list of the enumerated strings, WP core validation and sanitization
698
-                    // freaks out. We'll just validate this argument while handling the request
699
-                    'validate_callback' => null,
700
-                    'sanitize_callback' => null,
701
-                ),
702
-            ),
703
-            $model,
704
-            $version
705
-        );
706
-    }
707
-
708
-
709
-    /**
710
-     * Gets the parameters acceptable for delete requests
711
-     *
712
-     * @param \EEM_Base $model
713
-     * @param string    $version
714
-     * @return array
715
-     */
716
-    protected function _get_delete_query_params(\EEM_Base $model, $version)
717
-    {
718
-        $params_for_delete = array(
719
-            'allow_blocking' => array(
720
-                'required' => false,
721
-                'default'  => true,
722
-                'type'     => 'boolean',
723
-            ),
724
-        );
725
-        $params_for_delete['force'] = array(
726
-            'required' => false,
727
-            'default'  => false,
728
-            'type'     => 'boolean',
729
-        );
730
-        return apply_filters(
731
-            'FHEE__EED_Core_Rest_Api___get_delete_query_params',
732
-            $params_for_delete,
733
-            $model,
734
-            $version
735
-        );
736
-    }
737
-
738
-
739
-    /**
740
-     * Gets info about reading query params that are acceptable
741
-     *
742
-     * @param \EEM_Base $model eg 'Event' or 'Venue'
743
-     * @param  string   $version
744
-     * @return array    describing the args acceptable when querying this model
745
-     * @throws EE_Error
746
-     */
747
-    protected function _get_read_query_params(\EEM_Base $model, $version)
748
-    {
749
-        $default_orderby = array();
750
-        foreach ($model->get_combined_primary_key_fields() as $key_field) {
751
-            $default_orderby[ $key_field->get_name() ] = 'ASC';
752
-        }
753
-        return array_merge(
754
-            $this->_get_response_selection_query_params($model, $version),
755
-            array(
756
-                'where'    => array(
757
-                    'required'          => false,
758
-                    'default'           => array(),
759
-                    'type'              => 'object',
760
-                    // because we accept an almost infinite list of possible where conditions, WP
761
-                    // core validation and sanitization freaks out. We'll just validate this argument
762
-                    // while handling the request
763
-                    'validate_callback' => null,
764
-                    'sanitize_callback' => null,
765
-                ),
766
-                'limit'    => array(
767
-                    'required'          => false,
768
-                    'default'           => EED_Core_Rest_Api::get_default_query_limit(),
769
-                    'type'              => array(
770
-                        'array',
771
-                        'string',
772
-                        'integer',
773
-                    ),
774
-                    // because we accept a variety of types, WP core validation and sanitization
775
-                    // freaks out. We'll just validate this argument while handling the request
776
-                    'validate_callback' => null,
777
-                    'sanitize_callback' => null,
778
-                ),
779
-                'order_by' => array(
780
-                    'required'          => false,
781
-                    'default'           => $default_orderby,
782
-                    'type'              => array(
783
-                        'object',
784
-                        'string',
785
-                    ),// because we accept a variety of types, WP core validation and sanitization
786
-                    // freaks out. We'll just validate this argument while handling the request
787
-                    'validate_callback' => null,
788
-                    'sanitize_callback' => null,
789
-                ),
790
-                'group_by' => array(
791
-                    'required'          => false,
792
-                    'default'           => null,
793
-                    'type'              => array(
794
-                        'object',
795
-                        'string',
796
-                    ),
797
-                    // because we accept  an almost infinite list of possible groupings,
798
-                    // WP core validation and sanitization
799
-                    // freaks out. We'll just validate this argument while handling the request
800
-                    'validate_callback' => null,
801
-                    'sanitize_callback' => null,
802
-                ),
803
-                'having'   => array(
804
-                    'required'          => false,
805
-                    'default'           => null,
806
-                    'type'              => 'object',
807
-                    // because we accept an almost infinite list of possible where conditions, WP
808
-                    // core validation and sanitization freaks out. We'll just validate this argument
809
-                    // while handling the request
810
-                    'validate_callback' => null,
811
-                    'sanitize_callback' => null,
812
-                ),
813
-                'caps'     => array(
814
-                    'required' => false,
815
-                    'default'  => EEM_Base::caps_read,
816
-                    'type'     => 'string',
817
-                    'enum'     => array(
818
-                        EEM_Base::caps_read,
819
-                        EEM_Base::caps_read_admin,
820
-                        EEM_Base::caps_edit,
821
-                        EEM_Base::caps_delete,
822
-                    ),
823
-                ),
824
-            )
825
-        );
826
-    }
827
-
828
-
829
-    /**
830
-     * Gets parameter information for a model regarding writing data
831
-     *
832
-     * @param string           $model_name
833
-     * @param ModelVersionInfo $model_version_info
834
-     * @param boolean          $create                                       whether this is for request to create (in
835
-     *                                                                       which case we need all required params) or
836
-     *                                                                       just to update (in which case we don't
837
-     *                                                                       need those on every request)
838
-     * @return array
839
-     */
840
-    protected function _get_write_params(
841
-        $model_name,
842
-        ModelVersionInfo $model_version_info,
843
-        $create = false
844
-    ) {
845
-        $model = EE_Registry::instance()->load_model($model_name);
846
-        $fields = $model_version_info->fieldsOnModelInThisVersion($model);
847
-        $args_info = array();
848
-        foreach ($fields as $field_name => $field_obj) {
849
-            if ($field_obj->is_auto_increment()) {
850
-                // totally ignore auto increment IDs
851
-                continue;
852
-            }
853
-            $arg_info = $field_obj->getSchema();
854
-            $required = $create && ! $field_obj->is_nullable() && $field_obj->get_default_value() === null;
855
-            $arg_info['required'] = $required;
856
-            // remove the read-only flag. If it were read-only we wouldn't list it as an argument while writing, right?
857
-            unset($arg_info['readonly']);
858
-            $schema_properties = $field_obj->getSchemaProperties();
859
-            if (isset($schema_properties['raw'])
860
-                && $field_obj->getSchemaType() === 'object'
861
-            ) {
862
-                // if there's a "raw" form of this argument, use those properties instead
863
-                $arg_info = array_replace(
864
-                    $arg_info,
865
-                    $schema_properties['raw']
866
-                );
867
-            }
868
-            $arg_info['default'] = ModelDataTranslator::prepareFieldValueForJson(
869
-                $field_obj,
870
-                $field_obj->get_default_value(),
871
-                $model_version_info->requestedVersion()
872
-            );
873
-            // we do our own validation and sanitization within the controller
874
-            if (function_exists('rest_validate_value_from_schema')) {
875
-                $sanitize_callback = array(
876
-                    'EED_Core_Rest_Api',
877
-                    'default_sanitize_callback',
878
-                );
879
-            } else {
880
-                $sanitize_callback = null;
881
-            }
882
-            $arg_info['sanitize_callback'] = $sanitize_callback;
883
-            $args_info[ $field_name ] = $arg_info;
884
-            if ($field_obj instanceof EE_Datetime_Field) {
885
-                $gmt_arg_info = $arg_info;
886
-                $gmt_arg_info['description'] = sprintf(
887
-                    esc_html__(
888
-                        '%1$s - the value for this field in UTC. Ignored if %2$s is provided.',
889
-                        'event_espresso'
890
-                    ),
891
-                    $field_obj->get_nicename(),
892
-                    $field_name
893
-                );
894
-                $args_info[ $field_name . '_gmt' ] = $gmt_arg_info;
895
-            }
896
-        }
897
-        return $args_info;
898
-    }
899
-
900
-
901
-    /**
902
-     * Replacement for WP API's 'rest_parse_request_arg'.
903
-     * If the value is blank but not required, don't bother validating it.
904
-     * Also, it uses our email validation instead of WP API's default.
905
-     *
906
-     * @param                 $value
907
-     * @param WP_REST_Request $request
908
-     * @param                 $param
909
-     * @return bool|true|WP_Error
910
-     * @throws InvalidArgumentException
911
-     * @throws InvalidInterfaceException
912
-     * @throws InvalidDataTypeException
913
-     */
914
-    public static function default_sanitize_callback($value, WP_REST_Request $request, $param)
915
-    {
916
-        $attributes = $request->get_attributes();
917
-        if (! isset($attributes['args'][ $param ])
918
-            || ! is_array($attributes['args'][ $param ])) {
919
-            $validation_result = true;
920
-        } else {
921
-            $args = $attributes['args'][ $param ];
922
-            if ((
923
-                    $value === ''
924
-                    || $value === null
925
-                )
926
-                && (! isset($args['required'])
927
-                    || $args['required'] === false
928
-                )
929
-            ) {
930
-                // not required and not provided? that's cool
931
-                $validation_result = true;
932
-            } elseif (isset($args['format'])
933
-                      && $args['format'] === 'email'
934
-            ) {
935
-                $validation_result = true;
936
-                if (! self::_validate_email($value)) {
937
-                    $validation_result = new WP_Error(
938
-                        'rest_invalid_param',
939
-                        esc_html__(
940
-                            'The email address is not valid or does not exist.',
941
-                            'event_espresso'
942
-                        )
943
-                    );
944
-                }
945
-            } else {
946
-                $validation_result = rest_validate_value_from_schema($value, $args, $param);
947
-            }
948
-        }
949
-        if (is_wp_error($validation_result)) {
950
-            return $validation_result;
951
-        }
952
-        return rest_sanitize_request_arg($value, $request, $param);
953
-    }
954
-
955
-
956
-    /**
957
-     * Returns whether or not this email address is valid. Copied from EE_Email_Validation_Strategy::_validate_email()
958
-     *
959
-     * @param $email
960
-     * @return bool
961
-     * @throws InvalidArgumentException
962
-     * @throws InvalidInterfaceException
963
-     * @throws InvalidDataTypeException
964
-     */
965
-    protected static function _validate_email($email)
966
-    {
967
-        try {
968
-            EmailAddressFactory::create($email);
969
-            return true;
970
-        } catch (EmailValidationException $e) {
971
-            return false;
972
-        }
973
-    }
974
-
975
-
976
-    /**
977
-     * Gets routes for the config
978
-     *
979
-     * @return array @see _register_model_routes
980
-     * @deprecated since version 4.9.1
981
-     */
982
-    protected function _register_config_routes()
983
-    {
984
-        $config_routes = array();
985
-        foreach (self::versions_served() as $version => $hidden_endpoint) {
986
-            $config_routes[ self::ee_api_namespace . $version ] = $this->_get_config_route_data_for_version(
987
-                $version,
988
-                $hidden_endpoint
989
-            );
990
-        }
991
-        return $config_routes;
992
-    }
993
-
994
-
995
-    /**
996
-     * Gets routes for the config for the specified version
997
-     *
998
-     * @param string  $version
999
-     * @param boolean $hidden_endpoint
1000
-     * @return array
1001
-     */
1002
-    protected function _get_config_route_data_for_version($version, $hidden_endpoint)
1003
-    {
1004
-        return array(
1005
-            'config'    => array(
1006
-                array(
1007
-                    'callback'        => array(
1008
-                        'EventEspresso\core\libraries\rest_api\controllers\config\Read',
1009
-                        'handleRequest',
1010
-                    ),
1011
-                    'methods'         => WP_REST_Server::READABLE,
1012
-                    'hidden_endpoint' => $hidden_endpoint,
1013
-                    'callback_args'   => array($version),
1014
-                ),
1015
-            ),
1016
-            'site_info' => array(
1017
-                array(
1018
-                    'callback'        => array(
1019
-                        'EventEspresso\core\libraries\rest_api\controllers\config\Read',
1020
-                        'handleRequestSiteInfo',
1021
-                    ),
1022
-                    'methods'         => WP_REST_Server::READABLE,
1023
-                    'hidden_endpoint' => $hidden_endpoint,
1024
-                    'callback_args'   => array($version),
1025
-                ),
1026
-            ),
1027
-        );
1028
-    }
1029
-
1030
-
1031
-    /**
1032
-     * Gets the meta info routes
1033
-     *
1034
-     * @return array @see _register_model_routes
1035
-     * @deprecated since version 4.9.1
1036
-     */
1037
-    protected function _register_meta_routes()
1038
-    {
1039
-        $meta_routes = array();
1040
-        foreach (self::versions_served() as $version => $hidden_endpoint) {
1041
-            $meta_routes[ self::ee_api_namespace . $version ] = $this->_get_meta_route_data_for_version(
1042
-                $version,
1043
-                $hidden_endpoint
1044
-            );
1045
-        }
1046
-        return $meta_routes;
1047
-    }
1048
-
1049
-
1050
-    /**
1051
-     * @param string  $version
1052
-     * @param boolean $hidden_endpoint
1053
-     * @return array
1054
-     */
1055
-    protected function _get_meta_route_data_for_version($version, $hidden_endpoint = false)
1056
-    {
1057
-        return array(
1058
-            'resources' => array(
1059
-                array(
1060
-                    'callback'        => array(
1061
-                        'EventEspresso\core\libraries\rest_api\controllers\model\Meta',
1062
-                        'handleRequestModelsMeta',
1063
-                    ),
1064
-                    'methods'         => WP_REST_Server::READABLE,
1065
-                    'hidden_endpoint' => $hidden_endpoint,
1066
-                    'callback_args'   => array($version),
1067
-                ),
1068
-            ),
1069
-        );
1070
-    }
1071
-
1072
-
1073
-    /**
1074
-     * Tries to hide old 4.6 endpoints from the
1075
-     *
1076
-     * @param array $route_data
1077
-     * @return array
1078
-     * @throws \EE_Error
1079
-     */
1080
-    public static function hide_old_endpoints($route_data)
1081
-    {
1082
-        // allow API clients to override which endpoints get hidden, in case
1083
-        // they want to discover particular endpoints
1084
-        // also, we don't have access to the request so we have to just grab it from the superglobal
1085
-        $force_show_ee_namespace = ltrim(
1086
-            EEH_Array::is_set($_REQUEST, 'force_show_ee_namespace', ''),
1087
-            '/'
1088
-        );
1089
-        foreach (EED_Core_Rest_Api::get_ee_route_data() as $namespace => $relative_urls) {
1090
-            foreach ($relative_urls as $resource_name => $endpoints) {
1091
-                foreach ($endpoints as $key => $endpoint) {
1092
-                    // skip schema and other route options
1093
-                    if (! is_numeric($key)) {
1094
-                        continue;
1095
-                    }
1096
-                    // by default, hide "hidden_endpoint"s, unless the request indicates
1097
-                    // to $force_show_ee_namespace, in which case only show that one
1098
-                    // namespace's endpoints (and hide all others)
1099
-                    if (($force_show_ee_namespace !== '' && $force_show_ee_namespace !== $namespace)
1100
-                        || ($endpoint['hidden_endpoint'] && $force_show_ee_namespace === '')
1101
-                    ) {
1102
-                        $full_route = '/' . ltrim($namespace, '/');
1103
-                        $full_route .= '/' . ltrim($resource_name, '/');
1104
-                        unset($route_data[ $full_route ]);
1105
-                    }
1106
-                }
1107
-            }
1108
-        }
1109
-        return $route_data;
1110
-    }
1111
-
1112
-
1113
-    /**
1114
-     * Returns an array describing which versions of core support serving requests for.
1115
-     * Keys are core versions' major and minor version, and values are the
1116
-     * LOWEST requested version they can serve. Eg, 4.7 can serve requests for 4.6-like
1117
-     * data by just removing a few models and fields from the responses. However, 4.15 might remove
1118
-     * the answers table entirely, in which case it would be very difficult for
1119
-     * it to serve 4.6-style responses.
1120
-     * Versions of core that are missing from this array are unknowns.
1121
-     * previous ver
1122
-     *
1123
-     * @return array
1124
-     */
1125
-    public static function version_compatibilities()
1126
-    {
1127
-        return apply_filters(
1128
-            'FHEE__EED_Core_REST_API__version_compatibilities',
1129
-            array(
1130
-                '4.8.29' => '4.8.29',
1131
-                '4.8.33' => '4.8.29',
1132
-                '4.8.34' => '4.8.29',
1133
-                '4.8.36' => '4.8.29',
1134
-            )
1135
-        );
1136
-    }
1137
-
1138
-
1139
-    /**
1140
-     * Gets the latest API version served. Eg if there
1141
-     * are two versions served of the API, 4.8.29 and 4.8.32, and
1142
-     * we are on core version 4.8.34, it will return the string "4.8.32"
1143
-     *
1144
-     * @return string
1145
-     */
1146
-    public static function latest_rest_api_version()
1147
-    {
1148
-        $versions_served = \EED_Core_Rest_Api::versions_served();
1149
-        $versions_served_keys = array_keys($versions_served);
1150
-        return end($versions_served_keys);
1151
-    }
1152
-
1153
-
1154
-    /**
1155
-     * Using EED_Core_Rest_Api::version_compatibilities(), determines what version of
1156
-     * EE the API can serve requests for. Eg, if we are on 4.15 of core, and
1157
-     * we can serve requests from 4.12 or later, this will return array( '4.12', '4.13', '4.14', '4.15' ).
1158
-     * We also indicate whether or not this version should be put in the index or not
1159
-     *
1160
-     * @return array keys are API version numbers (just major and minor numbers), and values
1161
-     * are whether or not they should be hidden
1162
-     */
1163
-    public static function versions_served()
1164
-    {
1165
-        $versions_served = array();
1166
-        $possibly_served_versions = EED_Core_Rest_Api::version_compatibilities();
1167
-        $lowest_compatible_version = end($possibly_served_versions);
1168
-        reset($possibly_served_versions);
1169
-        $versions_served_historically = array_keys($possibly_served_versions);
1170
-        $latest_version = end($versions_served_historically);
1171
-        reset($versions_served_historically);
1172
-        // for each version of core we have ever served:
1173
-        foreach ($versions_served_historically as $key_versioned_endpoint) {
1174
-            // if it's not above the current core version, and it's compatible with the current version of core
1175
-            if ($key_versioned_endpoint === $latest_version) {
1176
-                // don't hide the latest version in the index
1177
-                $versions_served[ $key_versioned_endpoint ] = false;
1178
-            } elseif ($key_versioned_endpoint >= $lowest_compatible_version
1179
-                && $key_versioned_endpoint < EED_Core_Rest_Api::core_version()
1180
-            ) {
1181
-                // include, but hide, previous versions which are still supported
1182
-                $versions_served[ $key_versioned_endpoint ] = true;
1183
-            } elseif (apply_filters(
1184
-                'FHEE__EED_Core_Rest_Api__versions_served__include_incompatible_versions',
1185
-                false,
1186
-                $possibly_served_versions
1187
-            )) {
1188
-                // if a version is no longer supported, don't include it in index or list of versions served
1189
-                $versions_served[ $key_versioned_endpoint ] = true;
1190
-            }
1191
-        }
1192
-        return $versions_served;
1193
-    }
1194
-
1195
-
1196
-    /**
1197
-     * Gets the major and minor version of EE core's version string
1198
-     *
1199
-     * @return string
1200
-     */
1201
-    public static function core_version()
1202
-    {
1203
-        return apply_filters(
1204
-            'FHEE__EED_Core_REST_API__core_version',
1205
-            implode(
1206
-                '.',
1207
-                array_slice(
1208
-                    explode(
1209
-                        '.',
1210
-                        espresso_version()
1211
-                    ),
1212
-                    0,
1213
-                    3
1214
-                )
1215
-            )
1216
-        );
1217
-    }
1218
-
1219
-
1220
-    /**
1221
-     * Gets the default limit that should be used when querying for resources
1222
-     *
1223
-     * @return int
1224
-     */
1225
-    public static function get_default_query_limit()
1226
-    {
1227
-        // we actually don't use a const because we want folks to always use
1228
-        // this method, not the const directly
1229
-        return apply_filters(
1230
-            'FHEE__EED_Core_Rest_Api__get_default_query_limit',
1231
-            50
1232
-        );
1233
-    }
1234
-
1235
-
1236
-    /**
1237
-     *
1238
-     * @param string $version api version string (i.e. '4.8.36')
1239
-     * @return array
1240
-     */
1241
-    public static function getCollectionRoutesIndexedByModelName($version = '')
1242
-    {
1243
-        $version = empty($version) ? self::latest_rest_api_version() : $version;
1244
-        $model_names = self::model_names_with_plural_routes($version);
1245
-        $collection_routes = array();
1246
-        foreach ($model_names as $model_name => $model_class_name) {
1247
-            $collection_routes[ strtolower($model_name) ] = '/' . self::ee_api_namespace . $version . '/'
1248
-                                                            . EEH_Inflector::pluralize_and_lower($model_name);
1249
-        }
1250
-        return $collection_routes;
1251
-    }
1252
-
1253
-
1254
-
1255
-    /**
1256
-     *    run - initial module setup
1257
-     *
1258
-     * @access    public
1259
-     * @param  WP $WP
1260
-     * @return    void
1261
-     */
1262
-    public function run($WP)
1263
-    {
1264
-    }
25
+	const ee_api_namespace = Domain::API_NAMESPACE;
26
+
27
+	const ee_api_namespace_for_regex = 'ee\/v([^/]*)\/';
28
+
29
+	const saved_routes_option_names = 'ee_core_routes';
30
+
31
+	/**
32
+	 * string used in _links response bodies to make them globally unique.
33
+	 *
34
+	 * @see http://v2.wp-api.org/extending/linking/
35
+	 */
36
+	const ee_api_link_namespace = 'https://api.eventespresso.com/';
37
+
38
+	/**
39
+	 * @var CalculatedModelFields
40
+	 */
41
+	protected static $_field_calculator;
42
+
43
+
44
+	/**
45
+	 * @return EED_Core_Rest_Api|EED_Module
46
+	 */
47
+	public static function instance()
48
+	{
49
+		self::$_field_calculator = new CalculatedModelFields();
50
+		return parent::get_instance(__CLASS__);
51
+	}
52
+
53
+
54
+	/**
55
+	 *    set_hooks - for hooking into EE Core, other modules, etc
56
+	 *
57
+	 * @access    public
58
+	 * @return    void
59
+	 */
60
+	public static function set_hooks()
61
+	{
62
+		self::set_hooks_both();
63
+	}
64
+
65
+
66
+	/**
67
+	 *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
68
+	 *
69
+	 * @access    public
70
+	 * @return    void
71
+	 */
72
+	public static function set_hooks_admin()
73
+	{
74
+		self::set_hooks_both();
75
+	}
76
+
77
+
78
+	public static function set_hooks_both()
79
+	{
80
+		add_action('rest_api_init', array('EED_Core_Rest_Api', 'register_routes'), 10);
81
+		add_action('rest_api_init', array('EED_Core_Rest_Api', 'set_hooks_rest_api'), 5);
82
+		add_filter('rest_route_data', array('EED_Core_Rest_Api', 'hide_old_endpoints'), 10, 2);
83
+		add_filter(
84
+			'rest_index',
85
+			array('EventEspresso\core\libraries\rest_api\controllers\model\Meta', 'filterEeMetadataIntoIndex')
86
+		);
87
+		EED_Core_Rest_Api::invalidate_cached_route_data_on_version_change();
88
+	}
89
+
90
+
91
+	/**
92
+	 * sets up hooks which only need to be included as part of REST API requests;
93
+	 * other requests like to the frontend or admin etc don't need them
94
+	 *
95
+	 * @throws \EE_Error
96
+	 */
97
+	public static function set_hooks_rest_api()
98
+	{
99
+		// set hooks which account for changes made to the API
100
+		EED_Core_Rest_Api::_set_hooks_for_changes();
101
+	}
102
+
103
+
104
+	/**
105
+	 * public wrapper of _set_hooks_for_changes.
106
+	 * Loads all the hooks which make requests to old versions of the API
107
+	 * appear the same as they always did
108
+	 *
109
+	 * @throws EE_Error
110
+	 */
111
+	public static function set_hooks_for_changes()
112
+	{
113
+		self::_set_hooks_for_changes();
114
+	}
115
+
116
+
117
+	/**
118
+	 * Loads all the hooks which make requests to old versions of the API
119
+	 * appear the same as they always did
120
+	 *
121
+	 * @throws EE_Error
122
+	 */
123
+	protected static function _set_hooks_for_changes()
124
+	{
125
+		$folder_contents = EEH_File::get_contents_of_folders(array(EE_LIBRARIES . 'rest_api' . DS . 'changes'), false);
126
+		foreach ($folder_contents as $classname_in_namespace => $filepath) {
127
+			// ignore the base parent class
128
+			// and legacy named classes
129
+			if ($classname_in_namespace === 'ChangesInBase'
130
+				|| strpos($classname_in_namespace, 'Changes_In_') === 0
131
+			) {
132
+				continue;
133
+			}
134
+			$full_classname = 'EventEspresso\core\libraries\rest_api\changes\\' . $classname_in_namespace;
135
+			if (class_exists($full_classname)) {
136
+				$instance_of_class = new $full_classname;
137
+				if ($instance_of_class instanceof ChangesInBase) {
138
+					$instance_of_class->setHooks();
139
+				}
140
+			}
141
+		}
142
+	}
143
+
144
+
145
+	/**
146
+	 * Filters the WP routes to add our EE-related ones. This takes a bit of time
147
+	 * so we actually prefer to only do it when an EE plugin is activated or upgraded
148
+	 *
149
+	 * @throws \EE_Error
150
+	 */
151
+	public static function register_routes()
152
+	{
153
+		foreach (EED_Core_Rest_Api::get_ee_route_data() as $namespace => $relative_routes) {
154
+			foreach ($relative_routes as $relative_route => $data_for_multiple_endpoints) {
155
+				/**
156
+				 * @var array     $data_for_multiple_endpoints numerically indexed array
157
+				 *                                         but can also contain route options like {
158
+				 * @type array    $schema                      {
159
+				 * @type callable $schema_callback
160
+				 * @type array    $callback_args               arguments that will be passed to the callback, after the
161
+				 * WP_REST_Request of course
162
+				 * }
163
+				 * }
164
+				 */
165
+				// when registering routes, register all the endpoints' data at the same time
166
+				$multiple_endpoint_args = array();
167
+				foreach ($data_for_multiple_endpoints as $endpoint_key => $data_for_single_endpoint) {
168
+					/**
169
+					 * @var array     $data_for_single_endpoint {
170
+					 * @type callable $callback
171
+					 * @type string methods
172
+					 * @type array args
173
+					 * @type array _links
174
+					 * @type array    $callback_args            arguments that will be passed to the callback, after the
175
+					 * WP_REST_Request of course
176
+					 * }
177
+					 */
178
+					// skip route options
179
+					if (! is_numeric($endpoint_key)) {
180
+						continue;
181
+					}
182
+					if (! isset($data_for_single_endpoint['callback'], $data_for_single_endpoint['methods'])) {
183
+						throw new EE_Error(
184
+							esc_html__(
185
+							// @codingStandardsIgnoreStart
186
+								'Endpoint configuration data needs to have entries "callback" (callable) and "methods" (comma-separated list of accepts HTTP methods).',
187
+								// @codingStandardsIgnoreEnd
188
+								'event_espresso'
189
+							)
190
+						);
191
+					}
192
+					$callback = $data_for_single_endpoint['callback'];
193
+					$single_endpoint_args = array(
194
+						'methods' => $data_for_single_endpoint['methods'],
195
+						'args'    => isset($data_for_single_endpoint['args']) ? $data_for_single_endpoint['args']
196
+							: array(),
197
+					);
198
+					if (isset($data_for_single_endpoint['_links'])) {
199
+						$single_endpoint_args['_links'] = $data_for_single_endpoint['_links'];
200
+					}
201
+					if (isset($data_for_single_endpoint['callback_args'])) {
202
+						$callback_args = $data_for_single_endpoint['callback_args'];
203
+						$single_endpoint_args['callback'] = function (\WP_REST_Request $request) use (
204
+							$callback,
205
+							$callback_args
206
+						) {
207
+							array_unshift($callback_args, $request);
208
+							return call_user_func_array(
209
+								$callback,
210
+								$callback_args
211
+							);
212
+						};
213
+					} else {
214
+						$single_endpoint_args['callback'] = $data_for_single_endpoint['callback'];
215
+					}
216
+					$multiple_endpoint_args[] = $single_endpoint_args;
217
+				}
218
+				if (isset($data_for_multiple_endpoints['schema'])) {
219
+					$schema_route_data = $data_for_multiple_endpoints['schema'];
220
+					$schema_callback = $schema_route_data['schema_callback'];
221
+					$callback_args = $schema_route_data['callback_args'];
222
+					$multiple_endpoint_args['schema'] = function () use ($schema_callback, $callback_args) {
223
+						return call_user_func_array(
224
+							$schema_callback,
225
+							$callback_args
226
+						);
227
+					};
228
+				}
229
+				register_rest_route(
230
+					$namespace,
231
+					$relative_route,
232
+					$multiple_endpoint_args
233
+				);
234
+			}
235
+		}
236
+	}
237
+
238
+
239
+	/**
240
+	 * Checks if there was a version change or something that merits invalidating the cached
241
+	 * route data. If so, invalidates the cached route data so that it gets refreshed
242
+	 * next time the WP API is used
243
+	 */
244
+	public static function invalidate_cached_route_data_on_version_change()
245
+	{
246
+		if (EE_System::instance()->detect_req_type() !== EE_System::req_type_normal) {
247
+			EED_Core_Rest_Api::invalidate_cached_route_data();
248
+		}
249
+		foreach (EE_Registry::instance()->addons as $addon) {
250
+			if ($addon instanceof EE_Addon && $addon->detect_req_type() !== EE_System::req_type_normal) {
251
+				EED_Core_Rest_Api::invalidate_cached_route_data();
252
+			}
253
+		}
254
+	}
255
+
256
+
257
+	/**
258
+	 * Removes the cached route data so it will get refreshed next time the WP API is used
259
+	 */
260
+	public static function invalidate_cached_route_data()
261
+	{
262
+		// delete the saved EE REST API routes
263
+		foreach (EED_Core_Rest_Api::versions_served() as $version => $hidden) {
264
+			delete_option(EED_Core_Rest_Api::saved_routes_option_names . $version);
265
+		}
266
+	}
267
+
268
+
269
+	/**
270
+	 * Gets the EE route data
271
+	 *
272
+	 * @return array top-level key is the namespace, next-level key is the route and its value is array{
273
+	 * @throws \EE_Error
274
+	 * @type string|array $callback
275
+	 * @type string       $methods
276
+	 * @type boolean      $hidden_endpoint
277
+	 * }
278
+	 */
279
+	public static function get_ee_route_data()
280
+	{
281
+		$ee_routes = array();
282
+		foreach (self::versions_served() as $version => $hidden_endpoints) {
283
+			$ee_routes[ self::ee_api_namespace . $version ] = self::_get_ee_route_data_for_version(
284
+				$version,
285
+				$hidden_endpoints
286
+			);
287
+		}
288
+		return $ee_routes;
289
+	}
290
+
291
+
292
+	/**
293
+	 * Gets the EE route data from the wp options if it exists already,
294
+	 * otherwise re-generates it and saves it to the option
295
+	 *
296
+	 * @param string  $version
297
+	 * @param boolean $hidden_endpoints
298
+	 * @return array
299
+	 * @throws \EE_Error
300
+	 */
301
+	protected static function _get_ee_route_data_for_version($version, $hidden_endpoints = false)
302
+	{
303
+		$ee_routes = get_option(self::saved_routes_option_names . $version, null);
304
+		if (! $ee_routes || (defined('EE_REST_API_DEBUG_MODE') && EE_REST_API_DEBUG_MODE)) {
305
+			$ee_routes = self::_save_ee_route_data_for_version($version, $hidden_endpoints);
306
+		}
307
+		return $ee_routes;
308
+	}
309
+
310
+
311
+	/**
312
+	 * Saves the EE REST API route data to a wp option and returns it
313
+	 *
314
+	 * @param string  $version
315
+	 * @param boolean $hidden_endpoints
316
+	 * @return mixed|null
317
+	 * @throws \EE_Error
318
+	 */
319
+	protected static function _save_ee_route_data_for_version($version, $hidden_endpoints = false)
320
+	{
321
+		$instance = self::instance();
322
+		$routes = apply_filters(
323
+			'EED_Core_Rest_Api__save_ee_route_data_for_version__routes',
324
+			array_replace_recursive(
325
+				$instance->_get_config_route_data_for_version($version, $hidden_endpoints),
326
+				$instance->_get_meta_route_data_for_version($version, $hidden_endpoints),
327
+				$instance->_get_model_route_data_for_version($version, $hidden_endpoints),
328
+				$instance->_get_rpc_route_data_for_version($version, $hidden_endpoints)
329
+			)
330
+		);
331
+		$option_name = self::saved_routes_option_names . $version;
332
+		if (get_option($option_name)) {
333
+			update_option($option_name, $routes, true);
334
+		} else {
335
+			add_option($option_name, $routes, null, 'no');
336
+		}
337
+		return $routes;
338
+	}
339
+
340
+
341
+	/**
342
+	 * Calculates all the EE routes and saves it to a WordPress option so we don't
343
+	 * need to calculate it on every request
344
+	 *
345
+	 * @deprecated since version 4.9.1
346
+	 * @return void
347
+	 */
348
+	public static function save_ee_routes()
349
+	{
350
+		if (EE_Maintenance_Mode::instance()->models_can_query()) {
351
+			$instance = self::instance();
352
+			$routes = apply_filters(
353
+				'EED_Core_Rest_Api__save_ee_routes__routes',
354
+				array_replace_recursive(
355
+					$instance->_register_config_routes(),
356
+					$instance->_register_meta_routes(),
357
+					$instance->_register_model_routes(),
358
+					$instance->_register_rpc_routes()
359
+				)
360
+			);
361
+			update_option(self::saved_routes_option_names, $routes, true);
362
+		}
363
+	}
364
+
365
+
366
+	/**
367
+	 * Gets all the route information relating to EE models
368
+	 *
369
+	 * @return array @see get_ee_route_data
370
+	 * @deprecated since version 4.9.1
371
+	 */
372
+	protected function _register_model_routes()
373
+	{
374
+		$model_routes = array();
375
+		foreach (self::versions_served() as $version => $hidden_endpoint) {
376
+			$model_routes[ EED_Core_Rest_Api::ee_api_namespace
377
+						   . $version ] = $this->_get_config_route_data_for_version($version, $hidden_endpoint);
378
+		}
379
+		return $model_routes;
380
+	}
381
+
382
+
383
+	/**
384
+	 * Decides whether or not to add write endpoints for this model.
385
+	 *
386
+	 * Currently, this defaults to exclude all global tables and models
387
+	 * which would allow inserting WP core data (we don't want to duplicate
388
+	 * what WP API does, as it's unnecessary, extra work, and potentially extra bugs)
389
+	 *
390
+	 * @param EEM_Base $model
391
+	 * @return bool
392
+	 */
393
+	public static function should_have_write_endpoints(EEM_Base $model)
394
+	{
395
+		if ($model->is_wp_core_model()) {
396
+			return false;
397
+		}
398
+		foreach ($model->get_tables() as $table) {
399
+			if ($table->is_global()) {
400
+				return false;
401
+			}
402
+		}
403
+		return true;
404
+	}
405
+
406
+
407
+	/**
408
+	 * Gets the names of all models which should have plural routes (eg `ee/v4.8.36/events`)
409
+	 * in this versioned namespace of EE4
410
+	 *
411
+	 * @param $version
412
+	 * @return array keys are model names (eg 'Event') and values ar either classnames (eg 'EEM_Event')
413
+	 */
414
+	public static function model_names_with_plural_routes($version)
415
+	{
416
+		$model_version_info = new ModelVersionInfo($version);
417
+		$models_to_register = $model_version_info->modelsForRequestedVersion();
418
+		// let's not bother having endpoints for extra metas
419
+		unset(
420
+			$models_to_register['Extra_Meta'],
421
+			$models_to_register['Extra_Join'],
422
+			$models_to_register['Post_Meta']
423
+		);
424
+		return apply_filters(
425
+			'FHEE__EED_Core_REST_API___register_model_routes',
426
+			$models_to_register
427
+		);
428
+	}
429
+
430
+
431
+	/**
432
+	 * Gets the route data for EE models in the specified version
433
+	 *
434
+	 * @param string  $version
435
+	 * @param boolean $hidden_endpoint
436
+	 * @return array
437
+	 * @throws EE_Error
438
+	 */
439
+	protected function _get_model_route_data_for_version($version, $hidden_endpoint = false)
440
+	{
441
+		$model_routes = array();
442
+		$model_version_info = new ModelVersionInfo($version);
443
+		foreach (EED_Core_Rest_Api::model_names_with_plural_routes($version) as $model_name => $model_classname) {
444
+			$model = \EE_Registry::instance()->load_model($model_name);
445
+			// if this isn't a valid model then let's skip iterate to the next item in the loop.
446
+			if (! $model instanceof EEM_Base) {
447
+				continue;
448
+			}
449
+			// yes we could just register one route for ALL models, but then they wouldn't show up in the index
450
+			$plural_model_route = EED_Core_Rest_Api::get_collection_route($model);
451
+			$singular_model_route = EED_Core_Rest_Api::get_entity_route($model, '(?P<id>[^\/]+)');
452
+			$model_routes[ $plural_model_route ] = array(
453
+				array(
454
+					'callback'        => array(
455
+						'EventEspresso\core\libraries\rest_api\controllers\model\Read',
456
+						'handleRequestGetAll',
457
+					),
458
+					'callback_args'   => array($version, $model_name),
459
+					'methods'         => WP_REST_Server::READABLE,
460
+					'hidden_endpoint' => $hidden_endpoint,
461
+					'args'            => $this->_get_read_query_params($model, $version),
462
+					'_links'          => array(
463
+						'self' => rest_url(EED_Core_Rest_Api::ee_api_namespace . $version . $singular_model_route),
464
+					),
465
+				),
466
+				'schema' => array(
467
+					'schema_callback' => array(
468
+						'EventEspresso\core\libraries\rest_api\controllers\model\Read',
469
+						'handleSchemaRequest',
470
+					),
471
+					'callback_args'   => array($version, $model_name),
472
+				),
473
+			);
474
+			$model_routes[ $singular_model_route ] = array(
475
+				array(
476
+					'callback'        => array(
477
+						'EventEspresso\core\libraries\rest_api\controllers\model\Read',
478
+						'handleRequestGetOne',
479
+					),
480
+					'callback_args'   => array($version, $model_name),
481
+					'methods'         => WP_REST_Server::READABLE,
482
+					'hidden_endpoint' => $hidden_endpoint,
483
+					'args'            => $this->_get_response_selection_query_params($model, $version),
484
+				),
485
+			);
486
+			if (apply_filters(
487
+				'FHEE__EED_Core_Rest_Api___get_model_route_data_for_version__add_write_endpoints',
488
+				EED_Core_Rest_Api::should_have_write_endpoints($model),
489
+				$model
490
+			)) {
491
+				$model_routes[ $plural_model_route ][] = array(
492
+					'callback'        => array(
493
+						'EventEspresso\core\libraries\rest_api\controllers\model\Write',
494
+						'handleRequestInsert',
495
+					),
496
+					'callback_args'   => array($version, $model_name),
497
+					'methods'         => WP_REST_Server::CREATABLE,
498
+					'hidden_endpoint' => $hidden_endpoint,
499
+					'args'            => $this->_get_write_params($model_name, $model_version_info, true),
500
+				);
501
+				$model_routes[ $singular_model_route ] = array_merge(
502
+					$model_routes[ $singular_model_route ],
503
+					array(
504
+						array(
505
+							'callback'        => array(
506
+								'EventEspresso\core\libraries\rest_api\controllers\model\Write',
507
+								'handleRequestUpdate',
508
+							),
509
+							'callback_args'   => array($version, $model_name),
510
+							'methods'         => WP_REST_Server::EDITABLE,
511
+							'hidden_endpoint' => $hidden_endpoint,
512
+							'args'            => $this->_get_write_params($model_name, $model_version_info),
513
+						),
514
+						array(
515
+							'callback'        => array(
516
+								'EventEspresso\core\libraries\rest_api\controllers\model\Write',
517
+								'handleRequestDelete',
518
+							),
519
+							'callback_args'   => array($version, $model_name),
520
+							'methods'         => WP_REST_Server::DELETABLE,
521
+							'hidden_endpoint' => $hidden_endpoint,
522
+							'args'            => $this->_get_delete_query_params($model, $version),
523
+						),
524
+					)
525
+				);
526
+			}
527
+			foreach ($model->relation_settings() as $relation_name => $relation_obj) {
528
+				$related_route = EED_Core_Rest_Api::get_relation_route_via(
529
+					$model,
530
+					'(?P<id>[^\/]+)',
531
+					$relation_obj
532
+				);
533
+				$endpoints = array(
534
+					array(
535
+						'callback'        => array(
536
+							'EventEspresso\core\libraries\rest_api\controllers\model\Read',
537
+							'handleRequestGetRelated',
538
+						),
539
+						'callback_args'   => array($version, $model_name, $relation_name),
540
+						'methods'         => WP_REST_Server::READABLE,
541
+						'hidden_endpoint' => $hidden_endpoint,
542
+						'args'            => $this->_get_read_query_params($relation_obj->get_other_model(), $version),
543
+					),
544
+				);
545
+				$model_routes[ $related_route ] = $endpoints;
546
+			}
547
+		}
548
+		return $model_routes;
549
+	}
550
+
551
+
552
+	/**
553
+	 * Gets the relative URI to a model's REST API plural route, after the EE4 versioned namespace,
554
+	 * excluding the preceding slash.
555
+	 * Eg you pass get_plural_route_to('Event') = 'events'
556
+	 *
557
+	 * @param EEM_Base $model
558
+	 * @return string
559
+	 */
560
+	public static function get_collection_route(EEM_Base $model)
561
+	{
562
+		return EEH_Inflector::pluralize_and_lower($model->get_this_model_name());
563
+	}
564
+
565
+
566
+	/**
567
+	 * Gets the relative URI to a model's REST API singular route, after the EE4 versioned namespace,
568
+	 * excluding the preceding slash.
569
+	 * Eg you pass get_plural_route_to('Event', 12) = 'events/12'
570
+	 *
571
+	 * @param EEM_Base $model eg Event or Venue
572
+	 * @param string   $id
573
+	 * @return string
574
+	 */
575
+	public static function get_entity_route($model, $id)
576
+	{
577
+		return EED_Core_Rest_Api::get_collection_route($model) . '/' . $id;
578
+	}
579
+
580
+
581
+	/**
582
+	 * Gets the relative URI to a model's REST API singular route, after the EE4 versioned namespace,
583
+	 * excluding the preceding slash.
584
+	 * Eg you pass get_plural_route_to('Event', 12) = 'events/12'
585
+	 *
586
+	 * @param EEM_Base               $model eg Event or Venue
587
+	 * @param string                 $id
588
+	 * @param EE_Model_Relation_Base $relation_obj
589
+	 * @return string
590
+	 */
591
+	public static function get_relation_route_via(EEM_Base $model, $id, EE_Model_Relation_Base $relation_obj)
592
+	{
593
+		$related_model_name_endpoint_part = ModelRead::getRelatedEntityName(
594
+			$relation_obj->get_other_model()->get_this_model_name(),
595
+			$relation_obj
596
+		);
597
+		return EED_Core_Rest_Api::get_entity_route($model, $id) . '/' . $related_model_name_endpoint_part;
598
+	}
599
+
600
+
601
+	/**
602
+	 * Adds onto the $relative_route the EE4 REST API versioned namespace.
603
+	 * Eg if given '4.8.36' and 'events', will return 'ee/v4.8.36/events'
604
+	 *
605
+	 * @param string $relative_route
606
+	 * @param string $version
607
+	 * @return string
608
+	 */
609
+	public static function get_versioned_route_to($relative_route, $version = '4.8.36')
610
+	{
611
+		return '/' . EED_Core_Rest_Api::ee_api_namespace . $version . '/' . $relative_route;
612
+	}
613
+
614
+
615
+	/**
616
+	 * Adds all the RPC-style routes (remote procedure call-like routes, ie
617
+	 * routes that don't conform to the traditional REST CRUD-style).
618
+	 *
619
+	 * @deprecated since 4.9.1
620
+	 */
621
+	protected function _register_rpc_routes()
622
+	{
623
+		$routes = array();
624
+		foreach (self::versions_served() as $version => $hidden_endpoint) {
625
+			$routes[ self::ee_api_namespace . $version ] = $this->_get_rpc_route_data_for_version(
626
+				$version,
627
+				$hidden_endpoint
628
+			);
629
+		}
630
+		return $routes;
631
+	}
632
+
633
+
634
+	/**
635
+	 * @param string  $version
636
+	 * @param boolean $hidden_endpoint
637
+	 * @return array
638
+	 */
639
+	protected function _get_rpc_route_data_for_version($version, $hidden_endpoint = false)
640
+	{
641
+		$this_versions_routes = array();
642
+		// checkin endpoint
643
+		$this_versions_routes['registrations/(?P<REG_ID>\d+)/toggle_checkin_for_datetime/(?P<DTT_ID>\d+)'] = array(
644
+			array(
645
+				'callback'        => array(
646
+					'EventEspresso\core\libraries\rest_api\controllers\rpc\Checkin',
647
+					'handleRequestToggleCheckin',
648
+				),
649
+				'methods'         => WP_REST_Server::CREATABLE,
650
+				'hidden_endpoint' => $hidden_endpoint,
651
+				'args'            => array(
652
+					'force' => array(
653
+						'required'    => false,
654
+						'default'     => false,
655
+						'description' => __(
656
+						// @codingStandardsIgnoreStart
657
+							'Whether to force toggle checkin, or to verify the registration status and allowed ticket uses',
658
+							// @codingStandardsIgnoreEnd
659
+							'event_espresso'
660
+						),
661
+					),
662
+				),
663
+				'callback_args'   => array($version),
664
+			),
665
+		);
666
+		return apply_filters(
667
+			'FHEE__EED_Core_Rest_Api___register_rpc_routes__this_versions_routes',
668
+			$this_versions_routes,
669
+			$version,
670
+			$hidden_endpoint
671
+		);
672
+	}
673
+
674
+
675
+	/**
676
+	 * Gets the query params that can be used when request one or many
677
+	 *
678
+	 * @param EEM_Base $model
679
+	 * @param string   $version
680
+	 * @return array
681
+	 */
682
+	protected function _get_response_selection_query_params(\EEM_Base $model, $version)
683
+	{
684
+		return apply_filters(
685
+			'FHEE__EED_Core_Rest_Api___get_response_selection_query_params',
686
+			array(
687
+				'include'   => array(
688
+					'required' => false,
689
+					'default'  => '*',
690
+					'type'     => 'string',
691
+				),
692
+				'calculate' => array(
693
+					'required'          => false,
694
+					'default'           => '',
695
+					'enum'              => self::$_field_calculator->retrieveCalculatedFieldsForModel($model),
696
+					'type'              => 'string',
697
+					// because we accept a CSV'd list of the enumerated strings, WP core validation and sanitization
698
+					// freaks out. We'll just validate this argument while handling the request
699
+					'validate_callback' => null,
700
+					'sanitize_callback' => null,
701
+				),
702
+			),
703
+			$model,
704
+			$version
705
+		);
706
+	}
707
+
708
+
709
+	/**
710
+	 * Gets the parameters acceptable for delete requests
711
+	 *
712
+	 * @param \EEM_Base $model
713
+	 * @param string    $version
714
+	 * @return array
715
+	 */
716
+	protected function _get_delete_query_params(\EEM_Base $model, $version)
717
+	{
718
+		$params_for_delete = array(
719
+			'allow_blocking' => array(
720
+				'required' => false,
721
+				'default'  => true,
722
+				'type'     => 'boolean',
723
+			),
724
+		);
725
+		$params_for_delete['force'] = array(
726
+			'required' => false,
727
+			'default'  => false,
728
+			'type'     => 'boolean',
729
+		);
730
+		return apply_filters(
731
+			'FHEE__EED_Core_Rest_Api___get_delete_query_params',
732
+			$params_for_delete,
733
+			$model,
734
+			$version
735
+		);
736
+	}
737
+
738
+
739
+	/**
740
+	 * Gets info about reading query params that are acceptable
741
+	 *
742
+	 * @param \EEM_Base $model eg 'Event' or 'Venue'
743
+	 * @param  string   $version
744
+	 * @return array    describing the args acceptable when querying this model
745
+	 * @throws EE_Error
746
+	 */
747
+	protected function _get_read_query_params(\EEM_Base $model, $version)
748
+	{
749
+		$default_orderby = array();
750
+		foreach ($model->get_combined_primary_key_fields() as $key_field) {
751
+			$default_orderby[ $key_field->get_name() ] = 'ASC';
752
+		}
753
+		return array_merge(
754
+			$this->_get_response_selection_query_params($model, $version),
755
+			array(
756
+				'where'    => array(
757
+					'required'          => false,
758
+					'default'           => array(),
759
+					'type'              => 'object',
760
+					// because we accept an almost infinite list of possible where conditions, WP
761
+					// core validation and sanitization freaks out. We'll just validate this argument
762
+					// while handling the request
763
+					'validate_callback' => null,
764
+					'sanitize_callback' => null,
765
+				),
766
+				'limit'    => array(
767
+					'required'          => false,
768
+					'default'           => EED_Core_Rest_Api::get_default_query_limit(),
769
+					'type'              => array(
770
+						'array',
771
+						'string',
772
+						'integer',
773
+					),
774
+					// because we accept a variety of types, WP core validation and sanitization
775
+					// freaks out. We'll just validate this argument while handling the request
776
+					'validate_callback' => null,
777
+					'sanitize_callback' => null,
778
+				),
779
+				'order_by' => array(
780
+					'required'          => false,
781
+					'default'           => $default_orderby,
782
+					'type'              => array(
783
+						'object',
784
+						'string',
785
+					),// because we accept a variety of types, WP core validation and sanitization
786
+					// freaks out. We'll just validate this argument while handling the request
787
+					'validate_callback' => null,
788
+					'sanitize_callback' => null,
789
+				),
790
+				'group_by' => array(
791
+					'required'          => false,
792
+					'default'           => null,
793
+					'type'              => array(
794
+						'object',
795
+						'string',
796
+					),
797
+					// because we accept  an almost infinite list of possible groupings,
798
+					// WP core validation and sanitization
799
+					// freaks out. We'll just validate this argument while handling the request
800
+					'validate_callback' => null,
801
+					'sanitize_callback' => null,
802
+				),
803
+				'having'   => array(
804
+					'required'          => false,
805
+					'default'           => null,
806
+					'type'              => 'object',
807
+					// because we accept an almost infinite list of possible where conditions, WP
808
+					// core validation and sanitization freaks out. We'll just validate this argument
809
+					// while handling the request
810
+					'validate_callback' => null,
811
+					'sanitize_callback' => null,
812
+				),
813
+				'caps'     => array(
814
+					'required' => false,
815
+					'default'  => EEM_Base::caps_read,
816
+					'type'     => 'string',
817
+					'enum'     => array(
818
+						EEM_Base::caps_read,
819
+						EEM_Base::caps_read_admin,
820
+						EEM_Base::caps_edit,
821
+						EEM_Base::caps_delete,
822
+					),
823
+				),
824
+			)
825
+		);
826
+	}
827
+
828
+
829
+	/**
830
+	 * Gets parameter information for a model regarding writing data
831
+	 *
832
+	 * @param string           $model_name
833
+	 * @param ModelVersionInfo $model_version_info
834
+	 * @param boolean          $create                                       whether this is for request to create (in
835
+	 *                                                                       which case we need all required params) or
836
+	 *                                                                       just to update (in which case we don't
837
+	 *                                                                       need those on every request)
838
+	 * @return array
839
+	 */
840
+	protected function _get_write_params(
841
+		$model_name,
842
+		ModelVersionInfo $model_version_info,
843
+		$create = false
844
+	) {
845
+		$model = EE_Registry::instance()->load_model($model_name);
846
+		$fields = $model_version_info->fieldsOnModelInThisVersion($model);
847
+		$args_info = array();
848
+		foreach ($fields as $field_name => $field_obj) {
849
+			if ($field_obj->is_auto_increment()) {
850
+				// totally ignore auto increment IDs
851
+				continue;
852
+			}
853
+			$arg_info = $field_obj->getSchema();
854
+			$required = $create && ! $field_obj->is_nullable() && $field_obj->get_default_value() === null;
855
+			$arg_info['required'] = $required;
856
+			// remove the read-only flag. If it were read-only we wouldn't list it as an argument while writing, right?
857
+			unset($arg_info['readonly']);
858
+			$schema_properties = $field_obj->getSchemaProperties();
859
+			if (isset($schema_properties['raw'])
860
+				&& $field_obj->getSchemaType() === 'object'
861
+			) {
862
+				// if there's a "raw" form of this argument, use those properties instead
863
+				$arg_info = array_replace(
864
+					$arg_info,
865
+					$schema_properties['raw']
866
+				);
867
+			}
868
+			$arg_info['default'] = ModelDataTranslator::prepareFieldValueForJson(
869
+				$field_obj,
870
+				$field_obj->get_default_value(),
871
+				$model_version_info->requestedVersion()
872
+			);
873
+			// we do our own validation and sanitization within the controller
874
+			if (function_exists('rest_validate_value_from_schema')) {
875
+				$sanitize_callback = array(
876
+					'EED_Core_Rest_Api',
877
+					'default_sanitize_callback',
878
+				);
879
+			} else {
880
+				$sanitize_callback = null;
881
+			}
882
+			$arg_info['sanitize_callback'] = $sanitize_callback;
883
+			$args_info[ $field_name ] = $arg_info;
884
+			if ($field_obj instanceof EE_Datetime_Field) {
885
+				$gmt_arg_info = $arg_info;
886
+				$gmt_arg_info['description'] = sprintf(
887
+					esc_html__(
888
+						'%1$s - the value for this field in UTC. Ignored if %2$s is provided.',
889
+						'event_espresso'
890
+					),
891
+					$field_obj->get_nicename(),
892
+					$field_name
893
+				);
894
+				$args_info[ $field_name . '_gmt' ] = $gmt_arg_info;
895
+			}
896
+		}
897
+		return $args_info;
898
+	}
899
+
900
+
901
+	/**
902
+	 * Replacement for WP API's 'rest_parse_request_arg'.
903
+	 * If the value is blank but not required, don't bother validating it.
904
+	 * Also, it uses our email validation instead of WP API's default.
905
+	 *
906
+	 * @param                 $value
907
+	 * @param WP_REST_Request $request
908
+	 * @param                 $param
909
+	 * @return bool|true|WP_Error
910
+	 * @throws InvalidArgumentException
911
+	 * @throws InvalidInterfaceException
912
+	 * @throws InvalidDataTypeException
913
+	 */
914
+	public static function default_sanitize_callback($value, WP_REST_Request $request, $param)
915
+	{
916
+		$attributes = $request->get_attributes();
917
+		if (! isset($attributes['args'][ $param ])
918
+			|| ! is_array($attributes['args'][ $param ])) {
919
+			$validation_result = true;
920
+		} else {
921
+			$args = $attributes['args'][ $param ];
922
+			if ((
923
+					$value === ''
924
+					|| $value === null
925
+				)
926
+				&& (! isset($args['required'])
927
+					|| $args['required'] === false
928
+				)
929
+			) {
930
+				// not required and not provided? that's cool
931
+				$validation_result = true;
932
+			} elseif (isset($args['format'])
933
+					  && $args['format'] === 'email'
934
+			) {
935
+				$validation_result = true;
936
+				if (! self::_validate_email($value)) {
937
+					$validation_result = new WP_Error(
938
+						'rest_invalid_param',
939
+						esc_html__(
940
+							'The email address is not valid or does not exist.',
941
+							'event_espresso'
942
+						)
943
+					);
944
+				}
945
+			} else {
946
+				$validation_result = rest_validate_value_from_schema($value, $args, $param);
947
+			}
948
+		}
949
+		if (is_wp_error($validation_result)) {
950
+			return $validation_result;
951
+		}
952
+		return rest_sanitize_request_arg($value, $request, $param);
953
+	}
954
+
955
+
956
+	/**
957
+	 * Returns whether or not this email address is valid. Copied from EE_Email_Validation_Strategy::_validate_email()
958
+	 *
959
+	 * @param $email
960
+	 * @return bool
961
+	 * @throws InvalidArgumentException
962
+	 * @throws InvalidInterfaceException
963
+	 * @throws InvalidDataTypeException
964
+	 */
965
+	protected static function _validate_email($email)
966
+	{
967
+		try {
968
+			EmailAddressFactory::create($email);
969
+			return true;
970
+		} catch (EmailValidationException $e) {
971
+			return false;
972
+		}
973
+	}
974
+
975
+
976
+	/**
977
+	 * Gets routes for the config
978
+	 *
979
+	 * @return array @see _register_model_routes
980
+	 * @deprecated since version 4.9.1
981
+	 */
982
+	protected function _register_config_routes()
983
+	{
984
+		$config_routes = array();
985
+		foreach (self::versions_served() as $version => $hidden_endpoint) {
986
+			$config_routes[ self::ee_api_namespace . $version ] = $this->_get_config_route_data_for_version(
987
+				$version,
988
+				$hidden_endpoint
989
+			);
990
+		}
991
+		return $config_routes;
992
+	}
993
+
994
+
995
+	/**
996
+	 * Gets routes for the config for the specified version
997
+	 *
998
+	 * @param string  $version
999
+	 * @param boolean $hidden_endpoint
1000
+	 * @return array
1001
+	 */
1002
+	protected function _get_config_route_data_for_version($version, $hidden_endpoint)
1003
+	{
1004
+		return array(
1005
+			'config'    => array(
1006
+				array(
1007
+					'callback'        => array(
1008
+						'EventEspresso\core\libraries\rest_api\controllers\config\Read',
1009
+						'handleRequest',
1010
+					),
1011
+					'methods'         => WP_REST_Server::READABLE,
1012
+					'hidden_endpoint' => $hidden_endpoint,
1013
+					'callback_args'   => array($version),
1014
+				),
1015
+			),
1016
+			'site_info' => array(
1017
+				array(
1018
+					'callback'        => array(
1019
+						'EventEspresso\core\libraries\rest_api\controllers\config\Read',
1020
+						'handleRequestSiteInfo',
1021
+					),
1022
+					'methods'         => WP_REST_Server::READABLE,
1023
+					'hidden_endpoint' => $hidden_endpoint,
1024
+					'callback_args'   => array($version),
1025
+				),
1026
+			),
1027
+		);
1028
+	}
1029
+
1030
+
1031
+	/**
1032
+	 * Gets the meta info routes
1033
+	 *
1034
+	 * @return array @see _register_model_routes
1035
+	 * @deprecated since version 4.9.1
1036
+	 */
1037
+	protected function _register_meta_routes()
1038
+	{
1039
+		$meta_routes = array();
1040
+		foreach (self::versions_served() as $version => $hidden_endpoint) {
1041
+			$meta_routes[ self::ee_api_namespace . $version ] = $this->_get_meta_route_data_for_version(
1042
+				$version,
1043
+				$hidden_endpoint
1044
+			);
1045
+		}
1046
+		return $meta_routes;
1047
+	}
1048
+
1049
+
1050
+	/**
1051
+	 * @param string  $version
1052
+	 * @param boolean $hidden_endpoint
1053
+	 * @return array
1054
+	 */
1055
+	protected function _get_meta_route_data_for_version($version, $hidden_endpoint = false)
1056
+	{
1057
+		return array(
1058
+			'resources' => array(
1059
+				array(
1060
+					'callback'        => array(
1061
+						'EventEspresso\core\libraries\rest_api\controllers\model\Meta',
1062
+						'handleRequestModelsMeta',
1063
+					),
1064
+					'methods'         => WP_REST_Server::READABLE,
1065
+					'hidden_endpoint' => $hidden_endpoint,
1066
+					'callback_args'   => array($version),
1067
+				),
1068
+			),
1069
+		);
1070
+	}
1071
+
1072
+
1073
+	/**
1074
+	 * Tries to hide old 4.6 endpoints from the
1075
+	 *
1076
+	 * @param array $route_data
1077
+	 * @return array
1078
+	 * @throws \EE_Error
1079
+	 */
1080
+	public static function hide_old_endpoints($route_data)
1081
+	{
1082
+		// allow API clients to override which endpoints get hidden, in case
1083
+		// they want to discover particular endpoints
1084
+		// also, we don't have access to the request so we have to just grab it from the superglobal
1085
+		$force_show_ee_namespace = ltrim(
1086
+			EEH_Array::is_set($_REQUEST, 'force_show_ee_namespace', ''),
1087
+			'/'
1088
+		);
1089
+		foreach (EED_Core_Rest_Api::get_ee_route_data() as $namespace => $relative_urls) {
1090
+			foreach ($relative_urls as $resource_name => $endpoints) {
1091
+				foreach ($endpoints as $key => $endpoint) {
1092
+					// skip schema and other route options
1093
+					if (! is_numeric($key)) {
1094
+						continue;
1095
+					}
1096
+					// by default, hide "hidden_endpoint"s, unless the request indicates
1097
+					// to $force_show_ee_namespace, in which case only show that one
1098
+					// namespace's endpoints (and hide all others)
1099
+					if (($force_show_ee_namespace !== '' && $force_show_ee_namespace !== $namespace)
1100
+						|| ($endpoint['hidden_endpoint'] && $force_show_ee_namespace === '')
1101
+					) {
1102
+						$full_route = '/' . ltrim($namespace, '/');
1103
+						$full_route .= '/' . ltrim($resource_name, '/');
1104
+						unset($route_data[ $full_route ]);
1105
+					}
1106
+				}
1107
+			}
1108
+		}
1109
+		return $route_data;
1110
+	}
1111
+
1112
+
1113
+	/**
1114
+	 * Returns an array describing which versions of core support serving requests for.
1115
+	 * Keys are core versions' major and minor version, and values are the
1116
+	 * LOWEST requested version they can serve. Eg, 4.7 can serve requests for 4.6-like
1117
+	 * data by just removing a few models and fields from the responses. However, 4.15 might remove
1118
+	 * the answers table entirely, in which case it would be very difficult for
1119
+	 * it to serve 4.6-style responses.
1120
+	 * Versions of core that are missing from this array are unknowns.
1121
+	 * previous ver
1122
+	 *
1123
+	 * @return array
1124
+	 */
1125
+	public static function version_compatibilities()
1126
+	{
1127
+		return apply_filters(
1128
+			'FHEE__EED_Core_REST_API__version_compatibilities',
1129
+			array(
1130
+				'4.8.29' => '4.8.29',
1131
+				'4.8.33' => '4.8.29',
1132
+				'4.8.34' => '4.8.29',
1133
+				'4.8.36' => '4.8.29',
1134
+			)
1135
+		);
1136
+	}
1137
+
1138
+
1139
+	/**
1140
+	 * Gets the latest API version served. Eg if there
1141
+	 * are two versions served of the API, 4.8.29 and 4.8.32, and
1142
+	 * we are on core version 4.8.34, it will return the string "4.8.32"
1143
+	 *
1144
+	 * @return string
1145
+	 */
1146
+	public static function latest_rest_api_version()
1147
+	{
1148
+		$versions_served = \EED_Core_Rest_Api::versions_served();
1149
+		$versions_served_keys = array_keys($versions_served);
1150
+		return end($versions_served_keys);
1151
+	}
1152
+
1153
+
1154
+	/**
1155
+	 * Using EED_Core_Rest_Api::version_compatibilities(), determines what version of
1156
+	 * EE the API can serve requests for. Eg, if we are on 4.15 of core, and
1157
+	 * we can serve requests from 4.12 or later, this will return array( '4.12', '4.13', '4.14', '4.15' ).
1158
+	 * We also indicate whether or not this version should be put in the index or not
1159
+	 *
1160
+	 * @return array keys are API version numbers (just major and minor numbers), and values
1161
+	 * are whether or not they should be hidden
1162
+	 */
1163
+	public static function versions_served()
1164
+	{
1165
+		$versions_served = array();
1166
+		$possibly_served_versions = EED_Core_Rest_Api::version_compatibilities();
1167
+		$lowest_compatible_version = end($possibly_served_versions);
1168
+		reset($possibly_served_versions);
1169
+		$versions_served_historically = array_keys($possibly_served_versions);
1170
+		$latest_version = end($versions_served_historically);
1171
+		reset($versions_served_historically);
1172
+		// for each version of core we have ever served:
1173
+		foreach ($versions_served_historically as $key_versioned_endpoint) {
1174
+			// if it's not above the current core version, and it's compatible with the current version of core
1175
+			if ($key_versioned_endpoint === $latest_version) {
1176
+				// don't hide the latest version in the index
1177
+				$versions_served[ $key_versioned_endpoint ] = false;
1178
+			} elseif ($key_versioned_endpoint >= $lowest_compatible_version
1179
+				&& $key_versioned_endpoint < EED_Core_Rest_Api::core_version()
1180
+			) {
1181
+				// include, but hide, previous versions which are still supported
1182
+				$versions_served[ $key_versioned_endpoint ] = true;
1183
+			} elseif (apply_filters(
1184
+				'FHEE__EED_Core_Rest_Api__versions_served__include_incompatible_versions',
1185
+				false,
1186
+				$possibly_served_versions
1187
+			)) {
1188
+				// if a version is no longer supported, don't include it in index or list of versions served
1189
+				$versions_served[ $key_versioned_endpoint ] = true;
1190
+			}
1191
+		}
1192
+		return $versions_served;
1193
+	}
1194
+
1195
+
1196
+	/**
1197
+	 * Gets the major and minor version of EE core's version string
1198
+	 *
1199
+	 * @return string
1200
+	 */
1201
+	public static function core_version()
1202
+	{
1203
+		return apply_filters(
1204
+			'FHEE__EED_Core_REST_API__core_version',
1205
+			implode(
1206
+				'.',
1207
+				array_slice(
1208
+					explode(
1209
+						'.',
1210
+						espresso_version()
1211
+					),
1212
+					0,
1213
+					3
1214
+				)
1215
+			)
1216
+		);
1217
+	}
1218
+
1219
+
1220
+	/**
1221
+	 * Gets the default limit that should be used when querying for resources
1222
+	 *
1223
+	 * @return int
1224
+	 */
1225
+	public static function get_default_query_limit()
1226
+	{
1227
+		// we actually don't use a const because we want folks to always use
1228
+		// this method, not the const directly
1229
+		return apply_filters(
1230
+			'FHEE__EED_Core_Rest_Api__get_default_query_limit',
1231
+			50
1232
+		);
1233
+	}
1234
+
1235
+
1236
+	/**
1237
+	 *
1238
+	 * @param string $version api version string (i.e. '4.8.36')
1239
+	 * @return array
1240
+	 */
1241
+	public static function getCollectionRoutesIndexedByModelName($version = '')
1242
+	{
1243
+		$version = empty($version) ? self::latest_rest_api_version() : $version;
1244
+		$model_names = self::model_names_with_plural_routes($version);
1245
+		$collection_routes = array();
1246
+		foreach ($model_names as $model_name => $model_class_name) {
1247
+			$collection_routes[ strtolower($model_name) ] = '/' . self::ee_api_namespace . $version . '/'
1248
+															. EEH_Inflector::pluralize_and_lower($model_name);
1249
+		}
1250
+		return $collection_routes;
1251
+	}
1252
+
1253
+
1254
+
1255
+	/**
1256
+	 *    run - initial module setup
1257
+	 *
1258
+	 * @access    public
1259
+	 * @param  WP $WP
1260
+	 * @return    void
1261
+	 */
1262
+	public function run($WP)
1263
+	{
1264
+	}
1265 1265
 }
Please login to merge, or discard this patch.
Spacing   +44 added lines, -44 removed lines patch added patch discarded remove patch
@@ -122,7 +122,7 @@  discard block
 block discarded – undo
122 122
      */
123 123
     protected static function _set_hooks_for_changes()
124 124
     {
125
-        $folder_contents = EEH_File::get_contents_of_folders(array(EE_LIBRARIES . 'rest_api' . DS . 'changes'), false);
125
+        $folder_contents = EEH_File::get_contents_of_folders(array(EE_LIBRARIES.'rest_api'.DS.'changes'), false);
126 126
         foreach ($folder_contents as $classname_in_namespace => $filepath) {
127 127
             // ignore the base parent class
128 128
             // and legacy named classes
@@ -131,7 +131,7 @@  discard block
 block discarded – undo
131 131
             ) {
132 132
                 continue;
133 133
             }
134
-            $full_classname = 'EventEspresso\core\libraries\rest_api\changes\\' . $classname_in_namespace;
134
+            $full_classname = 'EventEspresso\core\libraries\rest_api\changes\\'.$classname_in_namespace;
135 135
             if (class_exists($full_classname)) {
136 136
                 $instance_of_class = new $full_classname;
137 137
                 if ($instance_of_class instanceof ChangesInBase) {
@@ -176,10 +176,10 @@  discard block
 block discarded – undo
176 176
                      * }
177 177
                      */
178 178
                     // skip route options
179
-                    if (! is_numeric($endpoint_key)) {
179
+                    if ( ! is_numeric($endpoint_key)) {
180 180
                         continue;
181 181
                     }
182
-                    if (! isset($data_for_single_endpoint['callback'], $data_for_single_endpoint['methods'])) {
182
+                    if ( ! isset($data_for_single_endpoint['callback'], $data_for_single_endpoint['methods'])) {
183 183
                         throw new EE_Error(
184 184
                             esc_html__(
185 185
                             // @codingStandardsIgnoreStart
@@ -200,7 +200,7 @@  discard block
 block discarded – undo
200 200
                     }
201 201
                     if (isset($data_for_single_endpoint['callback_args'])) {
202 202
                         $callback_args = $data_for_single_endpoint['callback_args'];
203
-                        $single_endpoint_args['callback'] = function (\WP_REST_Request $request) use (
203
+                        $single_endpoint_args['callback'] = function(\WP_REST_Request $request) use (
204 204
                             $callback,
205 205
                             $callback_args
206 206
                         ) {
@@ -219,7 +219,7 @@  discard block
 block discarded – undo
219 219
                     $schema_route_data = $data_for_multiple_endpoints['schema'];
220 220
                     $schema_callback = $schema_route_data['schema_callback'];
221 221
                     $callback_args = $schema_route_data['callback_args'];
222
-                    $multiple_endpoint_args['schema'] = function () use ($schema_callback, $callback_args) {
222
+                    $multiple_endpoint_args['schema'] = function() use ($schema_callback, $callback_args) {
223 223
                         return call_user_func_array(
224 224
                             $schema_callback,
225 225
                             $callback_args
@@ -261,7 +261,7 @@  discard block
 block discarded – undo
261 261
     {
262 262
         // delete the saved EE REST API routes
263 263
         foreach (EED_Core_Rest_Api::versions_served() as $version => $hidden) {
264
-            delete_option(EED_Core_Rest_Api::saved_routes_option_names . $version);
264
+            delete_option(EED_Core_Rest_Api::saved_routes_option_names.$version);
265 265
         }
266 266
     }
267 267
 
@@ -280,7 +280,7 @@  discard block
 block discarded – undo
280 280
     {
281 281
         $ee_routes = array();
282 282
         foreach (self::versions_served() as $version => $hidden_endpoints) {
283
-            $ee_routes[ self::ee_api_namespace . $version ] = self::_get_ee_route_data_for_version(
283
+            $ee_routes[self::ee_api_namespace.$version] = self::_get_ee_route_data_for_version(
284 284
                 $version,
285 285
                 $hidden_endpoints
286 286
             );
@@ -300,8 +300,8 @@  discard block
 block discarded – undo
300 300
      */
301 301
     protected static function _get_ee_route_data_for_version($version, $hidden_endpoints = false)
302 302
     {
303
-        $ee_routes = get_option(self::saved_routes_option_names . $version, null);
304
-        if (! $ee_routes || (defined('EE_REST_API_DEBUG_MODE') && EE_REST_API_DEBUG_MODE)) {
303
+        $ee_routes = get_option(self::saved_routes_option_names.$version, null);
304
+        if ( ! $ee_routes || (defined('EE_REST_API_DEBUG_MODE') && EE_REST_API_DEBUG_MODE)) {
305 305
             $ee_routes = self::_save_ee_route_data_for_version($version, $hidden_endpoints);
306 306
         }
307 307
         return $ee_routes;
@@ -328,7 +328,7 @@  discard block
 block discarded – undo
328 328
                 $instance->_get_rpc_route_data_for_version($version, $hidden_endpoints)
329 329
             )
330 330
         );
331
-        $option_name = self::saved_routes_option_names . $version;
331
+        $option_name = self::saved_routes_option_names.$version;
332 332
         if (get_option($option_name)) {
333 333
             update_option($option_name, $routes, true);
334 334
         } else {
@@ -373,8 +373,8 @@  discard block
 block discarded – undo
373 373
     {
374 374
         $model_routes = array();
375 375
         foreach (self::versions_served() as $version => $hidden_endpoint) {
376
-            $model_routes[ EED_Core_Rest_Api::ee_api_namespace
377
-                           . $version ] = $this->_get_config_route_data_for_version($version, $hidden_endpoint);
376
+            $model_routes[EED_Core_Rest_Api::ee_api_namespace
377
+                           . $version] = $this->_get_config_route_data_for_version($version, $hidden_endpoint);
378 378
         }
379 379
         return $model_routes;
380 380
     }
@@ -443,13 +443,13 @@  discard block
 block discarded – undo
443 443
         foreach (EED_Core_Rest_Api::model_names_with_plural_routes($version) as $model_name => $model_classname) {
444 444
             $model = \EE_Registry::instance()->load_model($model_name);
445 445
             // if this isn't a valid model then let's skip iterate to the next item in the loop.
446
-            if (! $model instanceof EEM_Base) {
446
+            if ( ! $model instanceof EEM_Base) {
447 447
                 continue;
448 448
             }
449 449
             // yes we could just register one route for ALL models, but then they wouldn't show up in the index
450 450
             $plural_model_route = EED_Core_Rest_Api::get_collection_route($model);
451 451
             $singular_model_route = EED_Core_Rest_Api::get_entity_route($model, '(?P<id>[^\/]+)');
452
-            $model_routes[ $plural_model_route ] = array(
452
+            $model_routes[$plural_model_route] = array(
453 453
                 array(
454 454
                     'callback'        => array(
455 455
                         'EventEspresso\core\libraries\rest_api\controllers\model\Read',
@@ -460,7 +460,7 @@  discard block
 block discarded – undo
460 460
                     'hidden_endpoint' => $hidden_endpoint,
461 461
                     'args'            => $this->_get_read_query_params($model, $version),
462 462
                     '_links'          => array(
463
-                        'self' => rest_url(EED_Core_Rest_Api::ee_api_namespace . $version . $singular_model_route),
463
+                        'self' => rest_url(EED_Core_Rest_Api::ee_api_namespace.$version.$singular_model_route),
464 464
                     ),
465 465
                 ),
466 466
                 'schema' => array(
@@ -471,7 +471,7 @@  discard block
 block discarded – undo
471 471
                     'callback_args'   => array($version, $model_name),
472 472
                 ),
473 473
             );
474
-            $model_routes[ $singular_model_route ] = array(
474
+            $model_routes[$singular_model_route] = array(
475 475
                 array(
476 476
                     'callback'        => array(
477 477
                         'EventEspresso\core\libraries\rest_api\controllers\model\Read',
@@ -488,7 +488,7 @@  discard block
 block discarded – undo
488 488
                 EED_Core_Rest_Api::should_have_write_endpoints($model),
489 489
                 $model
490 490
             )) {
491
-                $model_routes[ $plural_model_route ][] = array(
491
+                $model_routes[$plural_model_route][] = array(
492 492
                     'callback'        => array(
493 493
                         'EventEspresso\core\libraries\rest_api\controllers\model\Write',
494 494
                         'handleRequestInsert',
@@ -498,8 +498,8 @@  discard block
 block discarded – undo
498 498
                     'hidden_endpoint' => $hidden_endpoint,
499 499
                     'args'            => $this->_get_write_params($model_name, $model_version_info, true),
500 500
                 );
501
-                $model_routes[ $singular_model_route ] = array_merge(
502
-                    $model_routes[ $singular_model_route ],
501
+                $model_routes[$singular_model_route] = array_merge(
502
+                    $model_routes[$singular_model_route],
503 503
                     array(
504 504
                         array(
505 505
                             'callback'        => array(
@@ -542,7 +542,7 @@  discard block
 block discarded – undo
542 542
                         'args'            => $this->_get_read_query_params($relation_obj->get_other_model(), $version),
543 543
                     ),
544 544
                 );
545
-                $model_routes[ $related_route ] = $endpoints;
545
+                $model_routes[$related_route] = $endpoints;
546 546
             }
547 547
         }
548 548
         return $model_routes;
@@ -574,7 +574,7 @@  discard block
 block discarded – undo
574 574
      */
575 575
     public static function get_entity_route($model, $id)
576 576
     {
577
-        return EED_Core_Rest_Api::get_collection_route($model) . '/' . $id;
577
+        return EED_Core_Rest_Api::get_collection_route($model).'/'.$id;
578 578
     }
579 579
 
580 580
 
@@ -594,7 +594,7 @@  discard block
 block discarded – undo
594 594
             $relation_obj->get_other_model()->get_this_model_name(),
595 595
             $relation_obj
596 596
         );
597
-        return EED_Core_Rest_Api::get_entity_route($model, $id) . '/' . $related_model_name_endpoint_part;
597
+        return EED_Core_Rest_Api::get_entity_route($model, $id).'/'.$related_model_name_endpoint_part;
598 598
     }
599 599
 
600 600
 
@@ -608,7 +608,7 @@  discard block
 block discarded – undo
608 608
      */
609 609
     public static function get_versioned_route_to($relative_route, $version = '4.8.36')
610 610
     {
611
-        return '/' . EED_Core_Rest_Api::ee_api_namespace . $version . '/' . $relative_route;
611
+        return '/'.EED_Core_Rest_Api::ee_api_namespace.$version.'/'.$relative_route;
612 612
     }
613 613
 
614 614
 
@@ -622,7 +622,7 @@  discard block
 block discarded – undo
622 622
     {
623 623
         $routes = array();
624 624
         foreach (self::versions_served() as $version => $hidden_endpoint) {
625
-            $routes[ self::ee_api_namespace . $version ] = $this->_get_rpc_route_data_for_version(
625
+            $routes[self::ee_api_namespace.$version] = $this->_get_rpc_route_data_for_version(
626 626
                 $version,
627 627
                 $hidden_endpoint
628 628
             );
@@ -748,7 +748,7 @@  discard block
 block discarded – undo
748 748
     {
749 749
         $default_orderby = array();
750 750
         foreach ($model->get_combined_primary_key_fields() as $key_field) {
751
-            $default_orderby[ $key_field->get_name() ] = 'ASC';
751
+            $default_orderby[$key_field->get_name()] = 'ASC';
752 752
         }
753 753
         return array_merge(
754 754
             $this->_get_response_selection_query_params($model, $version),
@@ -782,7 +782,7 @@  discard block
 block discarded – undo
782 782
                     'type'              => array(
783 783
                         'object',
784 784
                         'string',
785
-                    ),// because we accept a variety of types, WP core validation and sanitization
785
+                    ), // because we accept a variety of types, WP core validation and sanitization
786 786
                     // freaks out. We'll just validate this argument while handling the request
787 787
                     'validate_callback' => null,
788 788
                     'sanitize_callback' => null,
@@ -880,7 +880,7 @@  discard block
 block discarded – undo
880 880
                 $sanitize_callback = null;
881 881
             }
882 882
             $arg_info['sanitize_callback'] = $sanitize_callback;
883
-            $args_info[ $field_name ] = $arg_info;
883
+            $args_info[$field_name] = $arg_info;
884 884
             if ($field_obj instanceof EE_Datetime_Field) {
885 885
                 $gmt_arg_info = $arg_info;
886 886
                 $gmt_arg_info['description'] = sprintf(
@@ -891,7 +891,7 @@  discard block
 block discarded – undo
891 891
                     $field_obj->get_nicename(),
892 892
                     $field_name
893 893
                 );
894
-                $args_info[ $field_name . '_gmt' ] = $gmt_arg_info;
894
+                $args_info[$field_name.'_gmt'] = $gmt_arg_info;
895 895
             }
896 896
         }
897 897
         return $args_info;
@@ -914,16 +914,16 @@  discard block
 block discarded – undo
914 914
     public static function default_sanitize_callback($value, WP_REST_Request $request, $param)
915 915
     {
916 916
         $attributes = $request->get_attributes();
917
-        if (! isset($attributes['args'][ $param ])
918
-            || ! is_array($attributes['args'][ $param ])) {
917
+        if ( ! isset($attributes['args'][$param])
918
+            || ! is_array($attributes['args'][$param])) {
919 919
             $validation_result = true;
920 920
         } else {
921
-            $args = $attributes['args'][ $param ];
921
+            $args = $attributes['args'][$param];
922 922
             if ((
923 923
                     $value === ''
924 924
                     || $value === null
925 925
                 )
926
-                && (! isset($args['required'])
926
+                && ( ! isset($args['required'])
927 927
                     || $args['required'] === false
928 928
                 )
929 929
             ) {
@@ -933,7 +933,7 @@  discard block
 block discarded – undo
933 933
                       && $args['format'] === 'email'
934 934
             ) {
935 935
                 $validation_result = true;
936
-                if (! self::_validate_email($value)) {
936
+                if ( ! self::_validate_email($value)) {
937 937
                     $validation_result = new WP_Error(
938 938
                         'rest_invalid_param',
939 939
                         esc_html__(
@@ -983,7 +983,7 @@  discard block
 block discarded – undo
983 983
     {
984 984
         $config_routes = array();
985 985
         foreach (self::versions_served() as $version => $hidden_endpoint) {
986
-            $config_routes[ self::ee_api_namespace . $version ] = $this->_get_config_route_data_for_version(
986
+            $config_routes[self::ee_api_namespace.$version] = $this->_get_config_route_data_for_version(
987 987
                 $version,
988 988
                 $hidden_endpoint
989 989
             );
@@ -1038,7 +1038,7 @@  discard block
 block discarded – undo
1038 1038
     {
1039 1039
         $meta_routes = array();
1040 1040
         foreach (self::versions_served() as $version => $hidden_endpoint) {
1041
-            $meta_routes[ self::ee_api_namespace . $version ] = $this->_get_meta_route_data_for_version(
1041
+            $meta_routes[self::ee_api_namespace.$version] = $this->_get_meta_route_data_for_version(
1042 1042
                 $version,
1043 1043
                 $hidden_endpoint
1044 1044
             );
@@ -1090,7 +1090,7 @@  discard block
 block discarded – undo
1090 1090
             foreach ($relative_urls as $resource_name => $endpoints) {
1091 1091
                 foreach ($endpoints as $key => $endpoint) {
1092 1092
                     // skip schema and other route options
1093
-                    if (! is_numeric($key)) {
1093
+                    if ( ! is_numeric($key)) {
1094 1094
                         continue;
1095 1095
                     }
1096 1096
                     // by default, hide "hidden_endpoint"s, unless the request indicates
@@ -1099,9 +1099,9 @@  discard block
 block discarded – undo
1099 1099
                     if (($force_show_ee_namespace !== '' && $force_show_ee_namespace !== $namespace)
1100 1100
                         || ($endpoint['hidden_endpoint'] && $force_show_ee_namespace === '')
1101 1101
                     ) {
1102
-                        $full_route = '/' . ltrim($namespace, '/');
1103
-                        $full_route .= '/' . ltrim($resource_name, '/');
1104
-                        unset($route_data[ $full_route ]);
1102
+                        $full_route = '/'.ltrim($namespace, '/');
1103
+                        $full_route .= '/'.ltrim($resource_name, '/');
1104
+                        unset($route_data[$full_route]);
1105 1105
                     }
1106 1106
                 }
1107 1107
             }
@@ -1174,19 +1174,19 @@  discard block
 block discarded – undo
1174 1174
             // if it's not above the current core version, and it's compatible with the current version of core
1175 1175
             if ($key_versioned_endpoint === $latest_version) {
1176 1176
                 // don't hide the latest version in the index
1177
-                $versions_served[ $key_versioned_endpoint ] = false;
1177
+                $versions_served[$key_versioned_endpoint] = false;
1178 1178
             } elseif ($key_versioned_endpoint >= $lowest_compatible_version
1179 1179
                 && $key_versioned_endpoint < EED_Core_Rest_Api::core_version()
1180 1180
             ) {
1181 1181
                 // include, but hide, previous versions which are still supported
1182
-                $versions_served[ $key_versioned_endpoint ] = true;
1182
+                $versions_served[$key_versioned_endpoint] = true;
1183 1183
             } elseif (apply_filters(
1184 1184
                 'FHEE__EED_Core_Rest_Api__versions_served__include_incompatible_versions',
1185 1185
                 false,
1186 1186
                 $possibly_served_versions
1187 1187
             )) {
1188 1188
                 // if a version is no longer supported, don't include it in index or list of versions served
1189
-                $versions_served[ $key_versioned_endpoint ] = true;
1189
+                $versions_served[$key_versioned_endpoint] = true;
1190 1190
             }
1191 1191
         }
1192 1192
         return $versions_served;
@@ -1244,7 +1244,7 @@  discard block
 block discarded – undo
1244 1244
         $model_names = self::model_names_with_plural_routes($version);
1245 1245
         $collection_routes = array();
1246 1246
         foreach ($model_names as $model_name => $model_class_name) {
1247
-            $collection_routes[ strtolower($model_name) ] = '/' . self::ee_api_namespace . $version . '/'
1247
+            $collection_routes[strtolower($model_name)] = '/'.self::ee_api_namespace.$version.'/'
1248 1248
                                                             . EEH_Inflector::pluralize_and_lower($model_name);
1249 1249
         }
1250 1250
         return $collection_routes;
Please login to merge, or discard this patch.
espresso.php 1 patch
Indentation   +80 added lines, -80 removed lines patch added patch discarded remove patch
@@ -38,103 +38,103 @@
 block discarded – undo
38 38
  * @since           4.0
39 39
  */
40 40
 if (function_exists('espresso_version')) {
41
-    if (! function_exists('espresso_duplicate_plugin_error')) {
42
-        /**
43
-         *    espresso_duplicate_plugin_error
44
-         *    displays if more than one version of EE is activated at the same time
45
-         */
46
-        function espresso_duplicate_plugin_error()
47
-        {
48
-            ?>
41
+	if (! function_exists('espresso_duplicate_plugin_error')) {
42
+		/**
43
+		 *    espresso_duplicate_plugin_error
44
+		 *    displays if more than one version of EE is activated at the same time
45
+		 */
46
+		function espresso_duplicate_plugin_error()
47
+		{
48
+			?>
49 49
             <div class="error">
50 50
                 <p>
51 51
                     <?php
52
-                    echo esc_html__(
53
-                        'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
-                        'event_espresso'
55
-                    ); ?>
52
+					echo esc_html__(
53
+						'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
+						'event_espresso'
55
+					); ?>
56 56
                 </p>
57 57
             </div>
58 58
             <?php
59
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
60
-        }
61
-    }
62
-    add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
59
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
60
+		}
61
+	}
62
+	add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
63 63
 } else {
64
-    define('EE_MIN_PHP_VER_REQUIRED', '5.4.0');
65
-    if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
-        /**
67
-         * espresso_minimum_php_version_error
68
-         *
69
-         * @return void
70
-         */
71
-        function espresso_minimum_php_version_error()
72
-        {
73
-            ?>
64
+	define('EE_MIN_PHP_VER_REQUIRED', '5.4.0');
65
+	if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
+		/**
67
+		 * espresso_minimum_php_version_error
68
+		 *
69
+		 * @return void
70
+		 */
71
+		function espresso_minimum_php_version_error()
72
+		{
73
+			?>
74 74
             <div class="error">
75 75
                 <p>
76 76
                     <?php
77
-                    printf(
78
-                        esc_html__(
79
-                            'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
-                            'event_espresso'
81
-                        ),
82
-                        EE_MIN_PHP_VER_REQUIRED,
83
-                        PHP_VERSION,
84
-                        '<br/>',
85
-                        '<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
-                    );
87
-                    ?>
77
+					printf(
78
+						esc_html__(
79
+							'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
+							'event_espresso'
81
+						),
82
+						EE_MIN_PHP_VER_REQUIRED,
83
+						PHP_VERSION,
84
+						'<br/>',
85
+						'<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
+					);
87
+					?>
88 88
                 </p>
89 89
             </div>
90 90
             <?php
91
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
92
-        }
91
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
92
+		}
93 93
 
94
-        add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
-    } else {
96
-        define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
97
-        /**
98
-         * espresso_version
99
-         * Returns the plugin version
100
-         *
101
-         * @return string
102
-         */
103
-        function espresso_version()
104
-        {
105
-            return apply_filters('FHEE__espresso__espresso_version', '4.9.62.rc.055');
106
-        }
94
+		add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
+	} else {
96
+		define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
97
+		/**
98
+		 * espresso_version
99
+		 * Returns the plugin version
100
+		 *
101
+		 * @return string
102
+		 */
103
+		function espresso_version()
104
+		{
105
+			return apply_filters('FHEE__espresso__espresso_version', '4.9.62.rc.055');
106
+		}
107 107
 
108
-        /**
109
-         * espresso_plugin_activation
110
-         * adds a wp-option to indicate that EE has been activated via the WP admin plugins page
111
-         */
112
-        function espresso_plugin_activation()
113
-        {
114
-            update_option('ee_espresso_activation', true);
115
-        }
108
+		/**
109
+		 * espresso_plugin_activation
110
+		 * adds a wp-option to indicate that EE has been activated via the WP admin plugins page
111
+		 */
112
+		function espresso_plugin_activation()
113
+		{
114
+			update_option('ee_espresso_activation', true);
115
+		}
116 116
 
117
-        register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
117
+		register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
118 118
 
119
-        require_once __DIR__ . '/core/bootstrap_espresso.php';
120
-        bootstrap_espresso();
121
-    }
119
+		require_once __DIR__ . '/core/bootstrap_espresso.php';
120
+		bootstrap_espresso();
121
+	}
122 122
 }
123 123
 if (! function_exists('espresso_deactivate_plugin')) {
124
-    /**
125
-     *    deactivate_plugin
126
-     * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
127
-     *
128
-     * @access public
129
-     * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
130
-     * @return    void
131
-     */
132
-    function espresso_deactivate_plugin($plugin_basename = '')
133
-    {
134
-        if (! function_exists('deactivate_plugins')) {
135
-            require_once ABSPATH . 'wp-admin/includes/plugin.php';
136
-        }
137
-        unset($_GET['activate'], $_REQUEST['activate']);
138
-        deactivate_plugins($plugin_basename);
139
-    }
124
+	/**
125
+	 *    deactivate_plugin
126
+	 * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
127
+	 *
128
+	 * @access public
129
+	 * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
130
+	 * @return    void
131
+	 */
132
+	function espresso_deactivate_plugin($plugin_basename = '')
133
+	{
134
+		if (! function_exists('deactivate_plugins')) {
135
+			require_once ABSPATH . 'wp-admin/includes/plugin.php';
136
+		}
137
+		unset($_GET['activate'], $_REQUEST['activate']);
138
+		deactivate_plugins($plugin_basename);
139
+	}
140 140
 }
Please login to merge, or discard this patch.