Completed
Branch BUG/session-save-state (ceeb07)
by
unknown
101:11 queued 41:56
created
core/services/loaders/CoreLoader.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -47,7 +47,7 @@
 block discarded – undo
47 47
      */
48 48
     public function __construct($generator)
49 49
     {
50
-        if (! ($generator instanceof EE_Registry || $generator instanceof CoffeeShop)) {
50
+        if ( ! ($generator instanceof EE_Registry || $generator instanceof CoffeeShop)) {
51 51
             throw new InvalidArgumentException(
52 52
                 esc_html__(
53 53
                     'The CoreLoader class must receive an instance of EE_Registry or the CoffeeShop DI container.',
Please login to merge, or discard this patch.
Indentation   +98 added lines, -98 removed lines patch added patch discarded remove patch
@@ -29,108 +29,108 @@
 block discarded – undo
29 29
 class CoreLoader implements LoaderDecoratorInterface
30 30
 {
31 31
 
32
-    /**
33
-     * @var EE_Registry|CoffeeShop $generator
34
-     */
35
-    private $generator;
32
+	/**
33
+	 * @var EE_Registry|CoffeeShop $generator
34
+	 */
35
+	private $generator;
36 36
 
37 37
 
38
-    /**
39
-     * CoreLoader constructor.
40
-     *
41
-     * @param EE_Registry|CoffeeShop $generator
42
-     * @throws InvalidArgumentException
43
-     */
44
-    public function __construct($generator)
45
-    {
46
-        if (! ($generator instanceof EE_Registry || $generator instanceof CoffeeShop)) {
47
-            throw new InvalidArgumentException(
48
-                esc_html__(
49
-                    'The CoreLoader class must receive an instance of EE_Registry or the CoffeeShop DI container.',
50
-                    'event_espresso'
51
-                )
52
-            );
53
-        }
54
-        $this->generator = $generator;
55
-    }
38
+	/**
39
+	 * CoreLoader constructor.
40
+	 *
41
+	 * @param EE_Registry|CoffeeShop $generator
42
+	 * @throws InvalidArgumentException
43
+	 */
44
+	public function __construct($generator)
45
+	{
46
+		if (! ($generator instanceof EE_Registry || $generator instanceof CoffeeShop)) {
47
+			throw new InvalidArgumentException(
48
+				esc_html__(
49
+					'The CoreLoader class must receive an instance of EE_Registry or the CoffeeShop DI container.',
50
+					'event_espresso'
51
+				)
52
+			);
53
+		}
54
+		$this->generator = $generator;
55
+	}
56 56
 
57 57
 
58
-    /**
59
-     * Calls the appropriate loading method from the installed generator;
60
-     * If EE_Registry is being used, then the additional parameters for the EE_Registry::create() method
61
-     * can be added to the $arguments array and they will be extracted and passed to EE_Registry::create(),
62
-     * but NOT to the class being instantiated.
63
-     * This is done by adding the parameters to the $arguments array as follows:
64
-     *  array(
65
-     *      'EE_Registry::create(from_db)'   => true, // boolean value, default = false
66
-     *      'EE_Registry::create(load_only)' => true, // boolean value, default = false
67
-     *      'EE_Registry::create(addon)'     => true, // boolean value, default = false
68
-     *  )
69
-     *
70
-     * @param string $fqcn
71
-     * @param array  $arguments
72
-     * @param bool   $shared
73
-     * @return mixed
74
-     * @throws OutOfBoundsException
75
-     * @throws ServiceExistsException
76
-     * @throws InstantiationException
77
-     * @throws InvalidIdentifierException
78
-     * @throws InvalidDataTypeException
79
-     * @throws InvalidClassException
80
-     * @throws EE_Error
81
-     * @throws ServiceNotFoundException
82
-     * @throws ReflectionException
83
-     * @throws InvalidInterfaceException
84
-     * @throws InvalidArgumentException
85
-     */
86
-    public function load($fqcn, $arguments = array(), $shared = true)
87
-    {
88
-        $shared = filter_var($shared, FILTER_VALIDATE_BOOLEAN);
89
-        if ($this->generator instanceof EE_Registry) {
90
-            // check if additional EE_Registry::create() arguments have been passed
91
-            // from_db
92
-            $from_db = isset($arguments['EE_Registry::create(from_db)'])
93
-                ? filter_var($arguments['EE_Registry::create(from_db)'], FILTER_VALIDATE_BOOLEAN)
94
-                : false;
95
-            // load_only
96
-            $load_only = isset($arguments['EE_Registry::create(load_only)'])
97
-                ? filter_var($arguments['EE_Registry::create(load_only)'], FILTER_VALIDATE_BOOLEAN)
98
-                : false;
99
-            // addon
100
-            $addon = isset($arguments['EE_Registry::create(addon)'])
101
-                ? filter_var($arguments['EE_Registry::create(addon)'], FILTER_VALIDATE_BOOLEAN)
102
-                : false;
103
-            unset(
104
-                $arguments['EE_Registry::create(from_db)'],
105
-                $arguments['EE_Registry::create(load_only)'],
106
-                $arguments['EE_Registry::create(addon)']
107
-            );
108
-            // addons need to be cached on EE_Registry
109
-            $shared = $addon ? true : $shared;
110
-            return $this->generator->create(
111
-                $fqcn,
112
-                $arguments,
113
-                $shared,
114
-                $from_db,
115
-                $load_only,
116
-                $addon
117
-            );
118
-        }
119
-        return $this->generator->brew(
120
-            $fqcn,
121
-            $arguments,
122
-            $shared ? CoffeeMaker::BREW_SHARED : CoffeeMaker::BREW_NEW
123
-        );
124
-    }
58
+	/**
59
+	 * Calls the appropriate loading method from the installed generator;
60
+	 * If EE_Registry is being used, then the additional parameters for the EE_Registry::create() method
61
+	 * can be added to the $arguments array and they will be extracted and passed to EE_Registry::create(),
62
+	 * but NOT to the class being instantiated.
63
+	 * This is done by adding the parameters to the $arguments array as follows:
64
+	 *  array(
65
+	 *      'EE_Registry::create(from_db)'   => true, // boolean value, default = false
66
+	 *      'EE_Registry::create(load_only)' => true, // boolean value, default = false
67
+	 *      'EE_Registry::create(addon)'     => true, // boolean value, default = false
68
+	 *  )
69
+	 *
70
+	 * @param string $fqcn
71
+	 * @param array  $arguments
72
+	 * @param bool   $shared
73
+	 * @return mixed
74
+	 * @throws OutOfBoundsException
75
+	 * @throws ServiceExistsException
76
+	 * @throws InstantiationException
77
+	 * @throws InvalidIdentifierException
78
+	 * @throws InvalidDataTypeException
79
+	 * @throws InvalidClassException
80
+	 * @throws EE_Error
81
+	 * @throws ServiceNotFoundException
82
+	 * @throws ReflectionException
83
+	 * @throws InvalidInterfaceException
84
+	 * @throws InvalidArgumentException
85
+	 */
86
+	public function load($fqcn, $arguments = array(), $shared = true)
87
+	{
88
+		$shared = filter_var($shared, FILTER_VALIDATE_BOOLEAN);
89
+		if ($this->generator instanceof EE_Registry) {
90
+			// check if additional EE_Registry::create() arguments have been passed
91
+			// from_db
92
+			$from_db = isset($arguments['EE_Registry::create(from_db)'])
93
+				? filter_var($arguments['EE_Registry::create(from_db)'], FILTER_VALIDATE_BOOLEAN)
94
+				: false;
95
+			// load_only
96
+			$load_only = isset($arguments['EE_Registry::create(load_only)'])
97
+				? filter_var($arguments['EE_Registry::create(load_only)'], FILTER_VALIDATE_BOOLEAN)
98
+				: false;
99
+			// addon
100
+			$addon = isset($arguments['EE_Registry::create(addon)'])
101
+				? filter_var($arguments['EE_Registry::create(addon)'], FILTER_VALIDATE_BOOLEAN)
102
+				: false;
103
+			unset(
104
+				$arguments['EE_Registry::create(from_db)'],
105
+				$arguments['EE_Registry::create(load_only)'],
106
+				$arguments['EE_Registry::create(addon)']
107
+			);
108
+			// addons need to be cached on EE_Registry
109
+			$shared = $addon ? true : $shared;
110
+			return $this->generator->create(
111
+				$fqcn,
112
+				$arguments,
113
+				$shared,
114
+				$from_db,
115
+				$load_only,
116
+				$addon
117
+			);
118
+		}
119
+		return $this->generator->brew(
120
+			$fqcn,
121
+			$arguments,
122
+			$shared ? CoffeeMaker::BREW_SHARED : CoffeeMaker::BREW_NEW
123
+		);
124
+	}
125 125
 
126 126
 
127
-    /**
128
-     * calls reset() on generator if method exists
129
-     */
130
-    public function reset()
131
-    {
132
-        if ($this->generator instanceof ResettableInterface) {
133
-            $this->generator->reset();
134
-        }
135
-    }
127
+	/**
128
+	 * calls reset() on generator if method exists
129
+	 */
130
+	public function reset()
131
+	{
132
+		if ($this->generator instanceof ResettableInterface) {
133
+			$this->generator->reset();
134
+		}
135
+	}
136 136
 }
Please login to merge, or discard this patch.
core/EE_Registry.core.php 3 patches
Doc Comments   +3 added lines, -2 removed lines patch added patch discarded remove patch
@@ -322,6 +322,7 @@  discard block
 block discarded – undo
322 322
 
323 323
     /**
324 324
      * @param mixed string | EED_Module $module
325
+     * @param string $module
325 326
      * @throws OutOfBoundsException
326 327
      * @throws InvalidArgumentException
327 328
      * @throws InvalidInterfaceException
@@ -794,7 +795,7 @@  discard block
 block discarded – undo
794 795
     /**
795 796
      * Recursively checks that a class exists and potentially attempts to load classes with non-FQCNs
796 797
      *
797
-     * @param string|object $class_name
798
+     * @param string $class_name
798 799
      * @param array         $arguments
799 800
      * @param int           $attempt
800 801
      * @return mixed
@@ -1377,7 +1378,7 @@  discard block
 block discarded – undo
1377 1378
      * @param string $class_name
1378 1379
      * @param string $param_class
1379 1380
      * @param array  $arguments
1380
-     * @param mixed  $index
1381
+     * @param integer  $index
1381 1382
      * @return array
1382 1383
      * @throws InvalidArgumentException
1383 1384
      * @throws InvalidInterfaceException
Please login to merge, or discard this patch.
Spacing   +46 added lines, -46 removed lines patch added patch discarded remove patch
@@ -193,7 +193,7 @@  discard block
 block discarded – undo
193 193
         ObjectIdentifier $object_identifier = null
194 194
     ) {
195 195
         // check if class object is instantiated
196
-        if (! self::$_instance instanceof EE_Registry
196
+        if ( ! self::$_instance instanceof EE_Registry
197 197
             && $dependency_map instanceof EE_Dependency_Map
198 198
             && $mirror instanceof Mirror
199 199
             && $class_cache instanceof ClassInterfaceCache
@@ -308,10 +308,10 @@  discard block
 block discarded – undo
308 308
         $i18n_js_strings = (array) self::$i18n_js_strings;
309 309
         foreach ($i18n_js_strings as $key => $value) {
310 310
             if (is_scalar($value)) {
311
-                $i18n_js_strings[ $key ] = html_entity_decode((string) $value, ENT_QUOTES, 'UTF-8');
311
+                $i18n_js_strings[$key] = html_entity_decode((string) $value, ENT_QUOTES, 'UTF-8');
312 312
             }
313 313
         }
314
-        return '/* <![CDATA[ */ var eei18n = ' . wp_json_encode($i18n_js_strings) . '; /* ]]> */';
314
+        return '/* <![CDATA[ */ var eei18n = '.wp_json_encode($i18n_js_strings).'; /* ]]> */';
315 315
     }
316 316
 
317 317
 
@@ -330,7 +330,7 @@  discard block
 block discarded – undo
330 330
             $module_class = get_class($module);
331 331
             $this->modules->{$module_class} = $module;
332 332
         } else {
333
-            if (! class_exists('EE_Module_Request_Router', false)) {
333
+            if ( ! class_exists('EE_Module_Request_Router', false)) {
334 334
                 $this->load_core('Module_Request_Router');
335 335
             }
336 336
             EE_Module_Request_Router::module_factory($module);
@@ -371,10 +371,10 @@  discard block
 block discarded – undo
371 371
                 EE_CORE,
372 372
                 EE_ADMIN,
373 373
                 EE_CPTS,
374
-                EE_CORE . 'data_migration_scripts' . DS,
375
-                EE_CORE . 'capabilities' . DS,
376
-                EE_CORE . 'request_stack' . DS,
377
-                EE_CORE . 'middleware' . DS,
374
+                EE_CORE.'data_migration_scripts'.DS,
375
+                EE_CORE.'capabilities'.DS,
376
+                EE_CORE.'request_stack'.DS,
377
+                EE_CORE.'middleware'.DS,
378 378
             )
379 379
         );
380 380
         // retrieve instantiated class
@@ -409,7 +409,7 @@  discard block
 block discarded – undo
409 409
         $service_paths = apply_filters(
410 410
             'FHEE__EE_Registry__load_service__service_paths',
411 411
             array(
412
-                EE_CORE . 'services' . DS,
412
+                EE_CORE.'services'.DS,
413 413
             )
414 414
         );
415 415
         // retrieve instantiated class
@@ -544,10 +544,10 @@  discard block
 block discarded – undo
544 544
     {
545 545
         $paths = array(
546 546
             EE_LIBRARIES,
547
-            EE_LIBRARIES . 'messages' . DS,
548
-            EE_LIBRARIES . 'shortcodes' . DS,
549
-            EE_LIBRARIES . 'qtips' . DS,
550
-            EE_LIBRARIES . 'payment_methods' . DS,
547
+            EE_LIBRARIES.'messages'.DS,
548
+            EE_LIBRARIES.'shortcodes'.DS,
549
+            EE_LIBRARIES.'qtips'.DS,
550
+            EE_LIBRARIES.'payment_methods'.DS,
551 551
         );
552 552
         // retrieve instantiated class
553 553
         return $this->_load(
@@ -615,10 +615,10 @@  discard block
 block discarded – undo
615 615
     public function load_model_class($class_name, $arguments = array(), $load_only = true)
616 616
     {
617 617
         $paths = array(
618
-            EE_MODELS . 'fields' . DS,
619
-            EE_MODELS . 'helpers' . DS,
620
-            EE_MODELS . 'relations' . DS,
621
-            EE_MODELS . 'strategies' . DS,
618
+            EE_MODELS.'fields'.DS,
619
+            EE_MODELS.'helpers'.DS,
620
+            EE_MODELS.'relations'.DS,
621
+            EE_MODELS.'strategies'.DS,
622 622
         );
623 623
         // retrieve instantiated class
624 624
         return $this->_load(
@@ -642,7 +642,7 @@  discard block
 block discarded – undo
642 642
      */
643 643
     public function is_model_name($model_name)
644 644
     {
645
-        return isset($this->models[ $model_name ]);
645
+        return isset($this->models[$model_name]);
646 646
     }
647 647
 
648 648
 
@@ -763,7 +763,7 @@  discard block
 block discarded – undo
763 763
                 return $cached_class;
764 764
             }
765 765
         }// obtain the loader method from the dependency map
766
-        $loader = $this->_dependency_map->class_loader($class_name);// instantiate the requested object
766
+        $loader = $this->_dependency_map->class_loader($class_name); // instantiate the requested object
767 767
         if ($loader instanceof Closure) {
768 768
             $class_obj = $loader($arguments);
769 769
         } else {
@@ -805,7 +805,7 @@  discard block
 block discarded – undo
805 805
             case 1:
806 806
                 // if it's a FQCN then maybe the class is registered with a preceding \
807 807
                 $class_name = strpos($class_name, '\\') !== false
808
-                    ? '\\' . ltrim($class_name, '\\')
808
+                    ? '\\'.ltrim($class_name, '\\')
809 809
                     : $class_name;
810 810
                 break;
811 811
             case 2:
@@ -859,11 +859,11 @@  discard block
 block discarded – undo
859 859
         // strip php file extension
860 860
         $class_name = str_replace('.php', '', trim($class_name));
861 861
         // does the class have a prefix ?
862
-        if (! empty($class_prefix) && $class_prefix !== 'addon') {
862
+        if ( ! empty($class_prefix) && $class_prefix !== 'addon') {
863 863
             // make sure $class_prefix is uppercase
864 864
             $class_prefix = strtoupper(trim($class_prefix));
865 865
             // add class prefix ONCE!!!
866
-            $class_name = $class_prefix . str_replace($class_prefix, '', $class_name);
866
+            $class_name = $class_prefix.str_replace($class_prefix, '', $class_name);
867 867
         }
868 868
         $class_name = $this->class_cache->getFqnForAlias($class_name);
869 869
         $class_exists = class_exists($class_name, false);
@@ -883,7 +883,7 @@  discard block
 block discarded – undo
883 883
             }
884 884
         }
885 885
         // if the class doesn't already exist.. then we need to try and find the file and load it
886
-        if (! $class_exists) {
886
+        if ( ! $class_exists) {
887 887
             // get full path to file
888 888
             $path = $this->_resolve_path($class_name, $type, $file_paths);
889 889
             // load the file
@@ -894,7 +894,7 @@  discard block
 block discarded – undo
894 894
                 return $loaded;
895 895
             }
896 896
             // if an object was expected but loading failed, then return nothing
897
-            if (! $loaded) {
897
+            if ( ! $loaded) {
898 898
                 return null;
899 899
             }
900 900
         }
@@ -922,8 +922,8 @@  discard block
 block discarded – undo
922 922
      */
923 923
     protected function get_class_abbreviation($class_name, $default = 'FANCY_BATMAN_PANTS')
924 924
     {
925
-        return isset($this->_class_abbreviations[ $class_name ])
926
-            ? $this->_class_abbreviations[ $class_name ]
925
+        return isset($this->_class_abbreviations[$class_name])
926
+            ? $this->_class_abbreviations[$class_name]
927 927
             : $default;
928 928
     }
929 929
 
@@ -1056,7 +1056,7 @@  discard block
 block discarded – undo
1056 1056
             $this->addons->{$class_name} = $class_obj;
1057 1057
             return;
1058 1058
         }
1059
-        if (! $from_db) {
1059
+        if ( ! $from_db) {
1060 1060
             $class_name = $this->object_identifier->getIdentifier($class_name, $arguments);
1061 1061
             $this->LIB->{$class_name} = $class_obj;
1062 1062
         }
@@ -1087,13 +1087,13 @@  discard block
 block discarded – undo
1087 1087
                 : EE_CLASSES;
1088 1088
             // prep file type
1089 1089
             $type = ! empty($type)
1090
-                ? trim($type, '.') . '.'
1090
+                ? trim($type, '.').'.'
1091 1091
                 : '';
1092 1092
             // build full file path
1093
-            $file_paths[ $key ] = rtrim($file_path, DS) . DS . $class_name . '.' . $type . 'php';
1093
+            $file_paths[$key] = rtrim($file_path, DS).DS.$class_name.'.'.$type.'php';
1094 1094
             // does the file exist and can be read ?
1095
-            if (is_readable($file_paths[ $key ])) {
1096
-                return $file_paths[ $key ];
1095
+            if (is_readable($file_paths[$key])) {
1096
+                return $file_paths[$key];
1097 1097
             }
1098 1098
         }
1099 1099
         return false;
@@ -1118,7 +1118,7 @@  discard block
 block discarded – undo
1118 1118
         // don't give up! you gotta...
1119 1119
         try {
1120 1120
             // does the file exist and can it be read ?
1121
-            if (! $path) {
1121
+            if ( ! $path) {
1122 1122
                 // just in case the file has already been autoloaded,
1123 1123
                 // but discrepancies in the naming schema are preventing it from
1124 1124
                 // being loaded via one of the EE_Registry::load_*() methods,
@@ -1136,7 +1136,7 @@  discard block
 block discarded – undo
1136 1136
                         ),
1137 1137
                         trim($type, '.'),
1138 1138
                         $class_name,
1139
-                        '<br />' . implode(',<br />', $file_paths)
1139
+                        '<br />'.implode(',<br />', $file_paths)
1140 1140
                     )
1141 1141
                 );
1142 1142
             }
@@ -1179,8 +1179,8 @@  discard block
 block discarded – undo
1179 1179
             $legacy_parent_class_map = array(
1180 1180
                 'EE_Payment_Processor' => 'core/business/EE_Processor_Base.class.php',
1181 1181
             );
1182
-            if (isset($legacy_parent_class_map[ $class_name ])) {
1183
-                require_once EE_PLUGIN_DIR_PATH . $legacy_parent_class_map[ $class_name ];
1182
+            if (isset($legacy_parent_class_map[$class_name])) {
1183
+                require_once EE_PLUGIN_DIR_PATH.$legacy_parent_class_map[$class_name];
1184 1184
             }
1185 1185
         } catch (Exception $exception) {
1186 1186
         }
@@ -1312,7 +1312,7 @@  discard block
 block discarded – undo
1312 1312
         // let's examine the constructor
1313 1313
         $constructor = $this->mirror->getConstructorFromReflection($reflector);
1314 1314
         // whu? huh? nothing?
1315
-        if (! $constructor) {
1315
+        if ( ! $constructor) {
1316 1316
             return $arguments;
1317 1317
         }
1318 1318
         // get constructor parameters
@@ -1331,15 +1331,15 @@  discard block
 block discarded – undo
1331 1331
                 $param_class === null
1332 1332
                 // and something already exists in the incoming arguments for this param
1333 1333
                 && array_key_exists($index, $argument_keys)
1334
-                && array_key_exists($argument_keys[ $index ], $arguments)
1334
+                && array_key_exists($argument_keys[$index], $arguments)
1335 1335
             ) {
1336 1336
                 // so let's skip this argument and move on to the next
1337 1337
                 continue;
1338 1338
             }
1339 1339
             if (// parameter is type hinted as a class, exists as an incoming argument, AND it's the correct class
1340 1340
                 $param_class !== null
1341
-                && isset($argument_keys[ $index ], $arguments[ $argument_keys[ $index ] ])
1342
-                && $arguments[ $argument_keys[ $index ] ] instanceof $param_class
1341
+                && isset($argument_keys[$index], $arguments[$argument_keys[$index]])
1342
+                && $arguments[$argument_keys[$index]] instanceof $param_class
1343 1343
             ) {
1344 1344
                 // skip this argument and move on to the next
1345 1345
                 continue;
@@ -1355,7 +1355,7 @@  discard block
 block discarded – undo
1355 1355
                     $index
1356 1356
                 );
1357 1357
             } else {
1358
-                $arguments[ $index ] = $this->mirror->getParameterDefaultValue(
1358
+                $arguments[$index] = $this->mirror->getParameterDefaultValue(
1359 1359
                     $param,
1360 1360
                     $class_name,
1361 1361
                     $index
@@ -1417,7 +1417,7 @@  discard block
 block discarded – undo
1417 1417
         // did we successfully find the correct dependency ?
1418 1418
         if ($dependency instanceof $param_class) {
1419 1419
             // then let's inject it into the incoming array of arguments at the correct location
1420
-            $arguments[ $index ] = $dependency;
1420
+            $arguments[$index] = $dependency;
1421 1421
         }
1422 1422
         return $arguments;
1423 1423
     }
@@ -1508,7 +1508,7 @@  discard block
 block discarded – undo
1508 1508
     {
1509 1509
         $addons = array();
1510 1510
         foreach ($this->addons as $addon) {
1511
-            $addons[ $addon->name() ] = $addon;
1511
+            $addons[$addon->name()] = $addon;
1512 1512
         }
1513 1513
         return $addons;
1514 1514
     }
@@ -1527,7 +1527,7 @@  discard block
 block discarded – undo
1527 1527
         $model_class_name = strpos($model_name, 'EEM_') !== 0
1528 1528
             ? "EEM_{$model_name}"
1529 1529
             : $model_name;
1530
-        if (! isset($this->LIB->{$model_class_name}) || ! $this->LIB->{$model_class_name} instanceof EEM_Base) {
1530
+        if ( ! isset($this->LIB->{$model_class_name}) || ! $this->LIB->{$model_class_name} instanceof EEM_Base) {
1531 1531
             return null;
1532 1532
         }
1533 1533
         // get that model reset it and make sure we nuke the old reference to it
@@ -1619,7 +1619,7 @@  discard block
 block discarded – undo
1619 1619
      */
1620 1620
     private static function _reset_and_unset_object($object, $reset_models)
1621 1621
     {
1622
-        if (! is_object($object)) {
1622
+        if ( ! is_object($object)) {
1623 1623
             // don't unset anything that's not an object
1624 1624
             return false;
1625 1625
         }
@@ -1639,7 +1639,7 @@  discard block
 block discarded – undo
1639 1639
             $object->reset();
1640 1640
             return true;
1641 1641
         }
1642
-        if (! $object instanceof InterminableInterface) {
1642
+        if ( ! $object instanceof InterminableInterface) {
1643 1643
             return true;
1644 1644
         }
1645 1645
         return false;
@@ -1656,7 +1656,7 @@  discard block
 block discarded – undo
1656 1656
         $cpt_models = array();
1657 1657
         foreach ($this->non_abstract_db_models as $short_name => $classname) {
1658 1658
             if (is_subclass_of($classname, 'EEM_CPT_Base')) {
1659
-                $cpt_models[ $short_name ] = $classname;
1659
+                $cpt_models[$short_name] = $classname;
1660 1660
             }
1661 1661
         }
1662 1662
         return $cpt_models;
Please login to merge, or discard this patch.
Indentation   +1664 added lines, -1664 removed lines patch added patch discarded remove patch
@@ -23,1668 +23,1668 @@
 block discarded – undo
23 23
 class EE_Registry implements ResettableInterface
24 24
 {
25 25
 
26
-    /**
27
-     * @var EE_Registry $_instance
28
-     */
29
-    private static $_instance;
30
-
31
-    /**
32
-     * @var EE_Dependency_Map $_dependency_map
33
-     */
34
-    protected $_dependency_map;
35
-
36
-    /**
37
-     * @var Mirror
38
-     */
39
-    private $mirror;
40
-
41
-    /**
42
-     * @var ClassInterfaceCache $class_cache
43
-     */
44
-    private $class_cache;
45
-
46
-    /**
47
-     * @var array $_class_abbreviations
48
-     */
49
-    protected $_class_abbreviations = array();
50
-
51
-    /**
52
-     * @var CommandBusInterface $BUS
53
-     */
54
-    public $BUS;
55
-
56
-    /**
57
-     * @var EE_Cart $CART
58
-     */
59
-    public $CART;
60
-
61
-    /**
62
-     * @var EE_Config $CFG
63
-     */
64
-    public $CFG;
65
-
66
-    /**
67
-     * @var EE_Network_Config $NET_CFG
68
-     */
69
-    public $NET_CFG;
70
-
71
-    /**
72
-     * StdClass object for storing library classes in
73
-     *
74
-     * @var RegistryContainer $LIB
75
-     */
76
-    public $LIB;
77
-
78
-    /**
79
-     * @var EE_Request_Handler $REQ
80
-     */
81
-    public $REQ;
82
-
83
-    /**
84
-     * @var EE_Session $SSN
85
-     */
86
-    public $SSN;
87
-
88
-    /**
89
-     * @since 4.5.0
90
-     * @var EE_Capabilities $CAP
91
-     */
92
-    public $CAP;
93
-
94
-    /**
95
-     * @since 4.9.0
96
-     * @var EE_Message_Resource_Manager $MRM
97
-     */
98
-    public $MRM;
99
-
100
-    /**
101
-     * @var Registry $AssetsRegistry
102
-     */
103
-    public $AssetsRegistry;
104
-
105
-    /**
106
-     * StdClass object for holding addons which have registered themselves to work with EE core
107
-     *
108
-     * @var EE_Addon[] $addons
109
-     */
110
-    public $addons;
111
-
112
-    /**
113
-     * keys are 'short names' (eg Event), values are class names (eg 'EEM_Event')
114
-     *
115
-     * @var EEM_Base[] $models
116
-     */
117
-    public $models = array();
118
-
119
-    /**
120
-     * @var EED_Module[] $modules
121
-     */
122
-    public $modules;
123
-
124
-    /**
125
-     * @var EES_Shortcode[] $shortcodes
126
-     */
127
-    public $shortcodes;
128
-
129
-    /**
130
-     * @var WP_Widget[] $widgets
131
-     */
132
-    public $widgets;
133
-
134
-    /**
135
-     * this is an array of all implemented model names (i.e. not the parent abstract models, or models
136
-     * which don't actually fetch items from the DB in the normal way (ie, are not children of EEM_Base)).
137
-     * Keys are model "short names" (eg "Event") as used in model relations, and values are
138
-     * classnames (eg "EEM_Event")
139
-     *
140
-     * @var array $non_abstract_db_models
141
-     */
142
-    public $non_abstract_db_models = array();
143
-
144
-    /**
145
-     * internationalization for JS strings
146
-     *    usage:   EE_Registry::i18n_js_strings['string_key'] = esc_html__( 'string to translate.', 'event_espresso' );
147
-     *    in js file:  var translatedString = eei18n.string_key;
148
-     *
149
-     * @var array $i18n_js_strings
150
-     */
151
-    public static $i18n_js_strings = array();
152
-
153
-    /**
154
-     * $main_file - path to espresso.php
155
-     *
156
-     * @var array $main_file
157
-     */
158
-    public $main_file;
159
-
160
-    /**
161
-     * array of ReflectionClass objects where the key is the class name
162
-     *
163
-     * @deprecated 4.9.62.p
164
-     * @var ReflectionClass[] $_reflectors
165
-     */
166
-    public $_reflectors;
167
-
168
-    /**
169
-     * boolean flag to indicate whether or not to load/save dependencies from/to the cache
170
-     *
171
-     * @var boolean $_cache_on
172
-     */
173
-    protected $_cache_on = true;
174
-
175
-    /**
176
-     * @var ObjectIdentifier
177
-     */
178
-    private $object_identifier;
179
-
180
-
181
-    /**
182
-     * @singleton method used to instantiate class object
183
-     * @param EE_Dependency_Map|null   $dependency_map
184
-     * @param Mirror|null              $mirror
185
-     * @param ClassInterfaceCache|null $class_cache
186
-     * @param ObjectIdentifier|null    $object_identifier
187
-     * @return EE_Registry instance
188
-     */
189
-    public static function instance(
190
-        EE_Dependency_Map $dependency_map = null,
191
-        Mirror $mirror = null,
192
-        ClassInterfaceCache $class_cache = null,
193
-        ObjectIdentifier $object_identifier = null
194
-    ) {
195
-        // check if class object is instantiated
196
-        if (! self::$_instance instanceof EE_Registry
197
-            && $dependency_map instanceof EE_Dependency_Map
198
-            && $mirror instanceof Mirror
199
-            && $class_cache instanceof ClassInterfaceCache
200
-            && $object_identifier instanceof ObjectIdentifier
201
-        ) {
202
-            self::$_instance = new self(
203
-                $dependency_map,
204
-                $mirror,
205
-                $class_cache,
206
-                $object_identifier
207
-            );
208
-        }
209
-        return self::$_instance;
210
-    }
211
-
212
-
213
-    /**
214
-     * protected constructor to prevent direct creation
215
-     *
216
-     * @Constructor
217
-     * @param  EE_Dependency_Map  $dependency_map
218
-     * @param Mirror              $mirror
219
-     * @param ClassInterfaceCache $class_cache
220
-     * @param ObjectIdentifier    $object_identifier
221
-     */
222
-    protected function __construct(
223
-        EE_Dependency_Map $dependency_map,
224
-        Mirror $mirror,
225
-        ClassInterfaceCache $class_cache,
226
-        ObjectIdentifier $object_identifier
227
-    ) {
228
-        $this->_dependency_map = $dependency_map;
229
-        $this->mirror = $mirror;
230
-        $this->class_cache = $class_cache;
231
-        $this->object_identifier = $object_identifier;
232
-        // $registry_container = new RegistryContainer();
233
-        $this->LIB = new RegistryContainer();
234
-        $this->addons = new RegistryContainer();
235
-        $this->modules = new RegistryContainer();
236
-        $this->shortcodes = new RegistryContainer();
237
-        $this->widgets = new RegistryContainer();
238
-        add_action('EE_Load_Espresso_Core__handle_request__initialize_core_loading', array($this, 'initialize'));
239
-    }
240
-
241
-
242
-    /**
243
-     * initialize
244
-     *
245
-     * @throws OutOfBoundsException
246
-     * @throws InvalidArgumentException
247
-     * @throws InvalidInterfaceException
248
-     * @throws InvalidDataTypeException
249
-     * @throws EE_Error
250
-     * @throws ReflectionException
251
-     */
252
-    public function initialize()
253
-    {
254
-        $this->_class_abbreviations = apply_filters(
255
-            'FHEE__EE_Registry____construct___class_abbreviations',
256
-            array(
257
-                'EE_Config'                                       => 'CFG',
258
-                'EE_Session'                                      => 'SSN',
259
-                'EE_Capabilities'                                 => 'CAP',
260
-                'EE_Cart'                                         => 'CART',
261
-                'EE_Network_Config'                               => 'NET_CFG',
262
-                'EE_Request_Handler'                              => 'REQ',
263
-                'EE_Message_Resource_Manager'                     => 'MRM',
264
-                'EventEspresso\core\services\commands\CommandBus' => 'BUS',
265
-                'EventEspresso\core\services\assets\Registry'     => 'AssetsRegistry',
266
-            )
267
-        );
268
-        $this->load_core('Base', array(), true);
269
-        // add our request and response objects to the cache
270
-        $request_loader = $this->_dependency_map->class_loader(
271
-            'EventEspresso\core\services\request\Request'
272
-        );
273
-        $this->_set_cached_class(
274
-            $request_loader(),
275
-            'EventEspresso\core\services\request\Request'
276
-        );
277
-        $response_loader = $this->_dependency_map->class_loader(
278
-            'EventEspresso\core\services\request\Response'
279
-        );
280
-        $this->_set_cached_class(
281
-            $response_loader(),
282
-            'EventEspresso\core\services\request\Response'
283
-        );
284
-        add_action('AHEE__EE_System__set_hooks_for_core', array($this, 'init'));
285
-    }
286
-
287
-
288
-    /**
289
-     * @return void
290
-     */
291
-    public function init()
292
-    {
293
-        // Get current page protocol
294
-        $protocol = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
295
-        // Output admin-ajax.php URL with same protocol as current page
296
-        self::$i18n_js_strings['ajax_url'] = admin_url('admin-ajax.php', $protocol);
297
-        self::$i18n_js_strings['wp_debug'] = defined('WP_DEBUG') ? WP_DEBUG : false;
298
-    }
299
-
300
-
301
-    /**
302
-     * localize_i18n_js_strings
303
-     *
304
-     * @return string
305
-     */
306
-    public static function localize_i18n_js_strings()
307
-    {
308
-        $i18n_js_strings = (array) self::$i18n_js_strings;
309
-        foreach ($i18n_js_strings as $key => $value) {
310
-            if (is_scalar($value)) {
311
-                $i18n_js_strings[ $key ] = html_entity_decode((string) $value, ENT_QUOTES, 'UTF-8');
312
-            }
313
-        }
314
-        return '/* <![CDATA[ */ var eei18n = ' . wp_json_encode($i18n_js_strings) . '; /* ]]> */';
315
-    }
316
-
317
-
318
-    /**
319
-     * @param mixed string | EED_Module $module
320
-     * @throws OutOfBoundsException
321
-     * @throws InvalidArgumentException
322
-     * @throws InvalidInterfaceException
323
-     * @throws InvalidDataTypeException
324
-     * @throws EE_Error
325
-     * @throws ReflectionException
326
-     */
327
-    public function add_module($module)
328
-    {
329
-        if ($module instanceof EED_Module) {
330
-            $module_class = get_class($module);
331
-            $this->modules->{$module_class} = $module;
332
-        } else {
333
-            if (! class_exists('EE_Module_Request_Router', false)) {
334
-                $this->load_core('Module_Request_Router');
335
-            }
336
-            EE_Module_Request_Router::module_factory($module);
337
-        }
338
-    }
339
-
340
-
341
-    /**
342
-     * @param string $module_name
343
-     * @return mixed EED_Module | NULL
344
-     */
345
-    public function get_module($module_name = '')
346
-    {
347
-        return isset($this->modules->{$module_name})
348
-            ? $this->modules->{$module_name}
349
-            : null;
350
-    }
351
-
352
-
353
-    /**
354
-     * loads core classes - must be singletons
355
-     *
356
-     * @param string $class_name - simple class name ie: session
357
-     * @param mixed  $arguments
358
-     * @param bool   $load_only
359
-     * @return mixed
360
-     * @throws InvalidInterfaceException
361
-     * @throws InvalidDataTypeException
362
-     * @throws EE_Error
363
-     * @throws ReflectionException
364
-     * @throws InvalidArgumentException
365
-     */
366
-    public function load_core($class_name, $arguments = array(), $load_only = false)
367
-    {
368
-        $core_paths = apply_filters(
369
-            'FHEE__EE_Registry__load_core__core_paths',
370
-            array(
371
-                EE_CORE,
372
-                EE_ADMIN,
373
-                EE_CPTS,
374
-                EE_CORE . 'data_migration_scripts' . DS,
375
-                EE_CORE . 'capabilities' . DS,
376
-                EE_CORE . 'request_stack' . DS,
377
-                EE_CORE . 'middleware' . DS,
378
-            )
379
-        );
380
-        // retrieve instantiated class
381
-        return $this->_load(
382
-            $core_paths,
383
-            'EE_',
384
-            $class_name,
385
-            'core',
386
-            $arguments,
387
-            false,
388
-            true,
389
-            $load_only
390
-        );
391
-    }
392
-
393
-
394
-    /**
395
-     * loads service classes
396
-     *
397
-     * @param string $class_name - simple class name ie: session
398
-     * @param mixed  $arguments
399
-     * @param bool   $load_only
400
-     * @return mixed
401
-     * @throws InvalidInterfaceException
402
-     * @throws InvalidDataTypeException
403
-     * @throws EE_Error
404
-     * @throws ReflectionException
405
-     * @throws InvalidArgumentException
406
-     */
407
-    public function load_service($class_name, $arguments = array(), $load_only = false)
408
-    {
409
-        $service_paths = apply_filters(
410
-            'FHEE__EE_Registry__load_service__service_paths',
411
-            array(
412
-                EE_CORE . 'services' . DS,
413
-            )
414
-        );
415
-        // retrieve instantiated class
416
-        return $this->_load(
417
-            $service_paths,
418
-            'EE_',
419
-            $class_name,
420
-            'class',
421
-            $arguments,
422
-            false,
423
-            true,
424
-            $load_only
425
-        );
426
-    }
427
-
428
-
429
-    /**
430
-     * loads data_migration_scripts
431
-     *
432
-     * @param string $class_name - class name for the DMS ie: EE_DMS_Core_4_2_0
433
-     * @param mixed  $arguments
434
-     * @return EE_Data_Migration_Script_Base|mixed
435
-     * @throws InvalidInterfaceException
436
-     * @throws InvalidDataTypeException
437
-     * @throws EE_Error
438
-     * @throws ReflectionException
439
-     * @throws InvalidArgumentException
440
-     */
441
-    public function load_dms($class_name, $arguments = array())
442
-    {
443
-        // retrieve instantiated class
444
-        return $this->_load(
445
-            EE_Data_Migration_Manager::instance()->get_data_migration_script_folders(),
446
-            'EE_DMS_',
447
-            $class_name,
448
-            'dms',
449
-            $arguments,
450
-            false,
451
-            false
452
-        );
453
-    }
454
-
455
-
456
-    /**
457
-     * loads object creating classes - must be singletons
458
-     *
459
-     * @param string $class_name - simple class name ie: attendee
460
-     * @param mixed  $arguments  - an array of arguments to pass to the class
461
-     * @param bool   $from_db    - some classes are instantiated from the db and thus call a different method to
462
-     *                           instantiate
463
-     * @param bool   $cache      if you don't want the class to be stored in the internal cache (non-persistent) then
464
-     *                           set this to FALSE (ie. when instantiating model objects from client in a loop)
465
-     * @param bool   $load_only  whether or not to just load the file and NOT instantiate, or load AND instantiate
466
-     *                           (default)
467
-     * @return EE_Base_Class | bool
468
-     * @throws InvalidInterfaceException
469
-     * @throws InvalidDataTypeException
470
-     * @throws EE_Error
471
-     * @throws ReflectionException
472
-     * @throws InvalidArgumentException
473
-     */
474
-    public function load_class($class_name, $arguments = array(), $from_db = false, $cache = true, $load_only = false)
475
-    {
476
-        $paths = apply_filters(
477
-            'FHEE__EE_Registry__load_class__paths',
478
-            array(
479
-                EE_CORE,
480
-                EE_CLASSES,
481
-                EE_BUSINESS,
482
-            )
483
-        );
484
-        // retrieve instantiated class
485
-        return $this->_load(
486
-            $paths,
487
-            'EE_',
488
-            $class_name,
489
-            'class',
490
-            $arguments,
491
-            $from_db,
492
-            $cache,
493
-            $load_only
494
-        );
495
-    }
496
-
497
-
498
-    /**
499
-     * loads helper classes - must be singletons
500
-     *
501
-     * @param string $class_name - simple class name ie: price
502
-     * @param mixed  $arguments
503
-     * @param bool   $load_only
504
-     * @return EEH_Base | bool
505
-     * @throws InvalidInterfaceException
506
-     * @throws InvalidDataTypeException
507
-     * @throws EE_Error
508
-     * @throws ReflectionException
509
-     * @throws InvalidArgumentException
510
-     */
511
-    public function load_helper($class_name, $arguments = array(), $load_only = true)
512
-    {
513
-        // todo: add doing_it_wrong() in a few versions after all addons have had calls to this method removed
514
-        $helper_paths = apply_filters('FHEE__EE_Registry__load_helper__helper_paths', array(EE_HELPERS));
515
-        // retrieve instantiated class
516
-        return $this->_load(
517
-            $helper_paths,
518
-            'EEH_',
519
-            $class_name,
520
-            'helper',
521
-            $arguments,
522
-            false,
523
-            true,
524
-            $load_only
525
-        );
526
-    }
527
-
528
-
529
-    /**
530
-     * loads core classes - must be singletons
531
-     *
532
-     * @param string $class_name - simple class name ie: session
533
-     * @param mixed  $arguments
534
-     * @param bool   $load_only
535
-     * @param bool   $cache      whether to cache the object or not.
536
-     * @return mixed
537
-     * @throws InvalidInterfaceException
538
-     * @throws InvalidDataTypeException
539
-     * @throws EE_Error
540
-     * @throws ReflectionException
541
-     * @throws InvalidArgumentException
542
-     */
543
-    public function load_lib($class_name, $arguments = array(), $load_only = false, $cache = true)
544
-    {
545
-        $paths = array(
546
-            EE_LIBRARIES,
547
-            EE_LIBRARIES . 'messages' . DS,
548
-            EE_LIBRARIES . 'shortcodes' . DS,
549
-            EE_LIBRARIES . 'qtips' . DS,
550
-            EE_LIBRARIES . 'payment_methods' . DS,
551
-        );
552
-        // retrieve instantiated class
553
-        return $this->_load(
554
-            $paths,
555
-            'EE_',
556
-            $class_name,
557
-            'lib',
558
-            $arguments,
559
-            false,
560
-            $cache,
561
-            $load_only
562
-        );
563
-    }
564
-
565
-
566
-    /**
567
-     * loads model classes - must be singletons
568
-     *
569
-     * @param string $class_name - simple class name ie: price
570
-     * @param mixed  $arguments
571
-     * @param bool   $load_only
572
-     * @return EEM_Base | bool
573
-     * @throws InvalidInterfaceException
574
-     * @throws InvalidDataTypeException
575
-     * @throws EE_Error
576
-     * @throws ReflectionException
577
-     * @throws InvalidArgumentException
578
-     */
579
-    public function load_model($class_name, $arguments = array(), $load_only = false)
580
-    {
581
-        $paths = apply_filters(
582
-            'FHEE__EE_Registry__load_model__paths',
583
-            array(
584
-                EE_MODELS,
585
-                EE_CORE,
586
-            )
587
-        );
588
-        // retrieve instantiated class
589
-        return $this->_load(
590
-            $paths,
591
-            'EEM_',
592
-            $class_name,
593
-            'model',
594
-            $arguments,
595
-            false,
596
-            true,
597
-            $load_only
598
-        );
599
-    }
600
-
601
-
602
-    /**
603
-     * loads model classes - must be singletons
604
-     *
605
-     * @param string $class_name - simple class name ie: price
606
-     * @param mixed  $arguments
607
-     * @param bool   $load_only
608
-     * @return mixed | bool
609
-     * @throws InvalidInterfaceException
610
-     * @throws InvalidDataTypeException
611
-     * @throws EE_Error
612
-     * @throws ReflectionException
613
-     * @throws InvalidArgumentException
614
-     */
615
-    public function load_model_class($class_name, $arguments = array(), $load_only = true)
616
-    {
617
-        $paths = array(
618
-            EE_MODELS . 'fields' . DS,
619
-            EE_MODELS . 'helpers' . DS,
620
-            EE_MODELS . 'relations' . DS,
621
-            EE_MODELS . 'strategies' . DS,
622
-        );
623
-        // retrieve instantiated class
624
-        return $this->_load(
625
-            $paths,
626
-            'EE_',
627
-            $class_name,
628
-            '',
629
-            $arguments,
630
-            false,
631
-            true,
632
-            $load_only
633
-        );
634
-    }
635
-
636
-
637
-    /**
638
-     * Determines if $model_name is the name of an actual EE model.
639
-     *
640
-     * @param string $model_name like Event, Attendee, Question_Group_Question, etc.
641
-     * @return boolean
642
-     */
643
-    public function is_model_name($model_name)
644
-    {
645
-        return isset($this->models[ $model_name ]);
646
-    }
647
-
648
-
649
-    /**
650
-     * generic class loader
651
-     *
652
-     * @param string $path_to_file - directory path to file location, not including filename
653
-     * @param string $file_name    - file name  ie:  my_file.php, including extension
654
-     * @param string $type         - file type - core? class? helper? model?
655
-     * @param mixed  $arguments
656
-     * @param bool   $load_only
657
-     * @return mixed
658
-     * @throws InvalidInterfaceException
659
-     * @throws InvalidDataTypeException
660
-     * @throws EE_Error
661
-     * @throws ReflectionException
662
-     * @throws InvalidArgumentException
663
-     */
664
-    public function load_file($path_to_file, $file_name, $type = '', $arguments = array(), $load_only = true)
665
-    {
666
-        // retrieve instantiated class
667
-        return $this->_load(
668
-            $path_to_file,
669
-            '',
670
-            $file_name,
671
-            $type,
672
-            $arguments,
673
-            false,
674
-            true,
675
-            $load_only
676
-        );
677
-    }
678
-
679
-
680
-    /**
681
-     * @param string $path_to_file - directory path to file location, not including filename
682
-     * @param string $class_name   - full class name  ie:  My_Class
683
-     * @param string $type         - file type - core? class? helper? model?
684
-     * @param mixed  $arguments
685
-     * @param bool   $load_only
686
-     * @return bool|EE_Addon|object
687
-     * @throws InvalidInterfaceException
688
-     * @throws InvalidDataTypeException
689
-     * @throws EE_Error
690
-     * @throws ReflectionException
691
-     * @throws InvalidArgumentException
692
-     */
693
-    public function load_addon($path_to_file, $class_name, $type = 'class', $arguments = array(), $load_only = false)
694
-    {
695
-        // retrieve instantiated class
696
-        return $this->_load(
697
-            $path_to_file,
698
-            'addon',
699
-            $class_name,
700
-            $type,
701
-            $arguments,
702
-            false,
703
-            true,
704
-            $load_only
705
-        );
706
-    }
707
-
708
-
709
-    /**
710
-     * instantiates, caches, and automatically resolves dependencies
711
-     * for classes that use a Fully Qualified Class Name.
712
-     * if the class is not capable of being loaded using PSR-4 autoloading,
713
-     * then you need to use one of the existing load_*() methods
714
-     * which can resolve the classname and filepath from the passed arguments
715
-     *
716
-     * @param bool|string $class_name   Fully Qualified Class Name
717
-     * @param array       $arguments    an argument, or array of arguments to pass to the class upon instantiation
718
-     * @param bool        $cache        whether to cache the instantiated object for reuse
719
-     * @param bool        $from_db      some classes are instantiated from the db
720
-     *                                  and thus call a different method to instantiate
721
-     * @param bool        $load_only    if true, will only load the file, but will NOT instantiate an object
722
-     * @param bool|string $addon        if true, will cache the object in the EE_Registry->$addons array
723
-     * @return bool|null|mixed          null = failure to load or instantiate class object.
724
-     *                                  object = class loaded and instantiated successfully.
725
-     *                                  bool = fail or success when $load_only is true
726
-     * @throws InvalidInterfaceException
727
-     * @throws InvalidDataTypeException
728
-     * @throws EE_Error
729
-     * @throws ReflectionException
730
-     * @throws InvalidArgumentException
731
-     */
732
-    public function create(
733
-        $class_name = false,
734
-        $arguments = array(),
735
-        $cache = false,
736
-        $from_db = false,
737
-        $load_only = false,
738
-        $addon = false
739
-    ) {
740
-        $class_name = ltrim($class_name, '\\');
741
-        $class_name = $this->class_cache->getFqnForAlias($class_name);
742
-        $class_exists = $this->loadOrVerifyClassExists($class_name, $arguments);
743
-        // if a non-FQCN was passed, then
744
-        // verifyClassExists() might return an object
745
-        // or it could return null if the class just could not be found anywhere
746
-        if ($class_exists instanceof $class_name || $class_exists === null) {
747
-            // either way, return the results
748
-            return $class_exists;
749
-        }
750
-        $class_name = $class_exists;
751
-        // if we're only loading the class and it already exists, then let's just return true immediately
752
-        if ($load_only) {
753
-            return true;
754
-        }
755
-        $addon = $addon ? 'addon' : '';
756
-        // $this->_cache_on is toggled during the recursive loading that can occur with dependency injection
757
-        // $cache is controlled by individual calls to separate Registry loader methods like load_class()
758
-        // $load_only is also controlled by individual calls to separate Registry loader methods like load_file()
759
-        if ($this->_cache_on && $cache && ! $load_only) {
760
-            // return object if it's already cached
761
-            $cached_class = $this->_get_cached_class($class_name, $addon, $arguments);
762
-            if ($cached_class !== null) {
763
-                return $cached_class;
764
-            }
765
-        }// obtain the loader method from the dependency map
766
-        $loader = $this->_dependency_map->class_loader($class_name);// instantiate the requested object
767
-        if ($loader instanceof Closure) {
768
-            $class_obj = $loader($arguments);
769
-        } else {
770
-            if ($loader && method_exists($this, $loader)) {
771
-                $class_obj = $this->{$loader}($class_name, $arguments);
772
-            } else {
773
-                $class_obj = $this->_create_object($class_name, $arguments, $addon, $from_db);
774
-            }
775
-        }
776
-        if (($this->_cache_on && $cache) || $this->get_class_abbreviation($class_name, '')) {
777
-            // save it for later... kinda like gum  { : $
778
-            $this->_set_cached_class(
779
-                $class_obj,
780
-                $class_name,
781
-                $addon,
782
-                $from_db,
783
-                $arguments
784
-            );
785
-        }
786
-        $this->_cache_on = true;
787
-        return $class_obj;
788
-    }
789
-
790
-
791
-    /**
792
-     * Recursively checks that a class exists and potentially attempts to load classes with non-FQCNs
793
-     *
794
-     * @param string|object $class_name
795
-     * @param array         $arguments
796
-     * @param int           $attempt
797
-     * @return mixed
798
-     */
799
-    private function loadOrVerifyClassExists($class_name, array $arguments, $attempt = 1)
800
-    {
801
-        if (is_object($class_name) || class_exists($class_name)) {
802
-            return $class_name;
803
-        }
804
-        switch ($attempt) {
805
-            case 1:
806
-                // if it's a FQCN then maybe the class is registered with a preceding \
807
-                $class_name = strpos($class_name, '\\') !== false
808
-                    ? '\\' . ltrim($class_name, '\\')
809
-                    : $class_name;
810
-                break;
811
-            case 2:
812
-                //
813
-                $loader = $this->_dependency_map->class_loader($class_name);
814
-                if ($loader && method_exists($this, $loader)) {
815
-                    return $this->{$loader}($class_name, $arguments);
816
-                }
817
-                break;
818
-            case 3:
819
-            default:
820
-                return null;
821
-        }
822
-        $attempt++;
823
-        return $this->loadOrVerifyClassExists($class_name, $arguments, $attempt);
824
-    }
825
-
826
-
827
-    /**
828
-     * instantiates, caches, and injects dependencies for classes
829
-     *
830
-     * @param array       $file_paths   an array of paths to folders to look in
831
-     * @param string      $class_prefix EE  or EEM or... ???
832
-     * @param bool|string $class_name   $class name
833
-     * @param string      $type         file type - core? class? helper? model?
834
-     * @param mixed       $arguments    an argument or array of arguments to pass to the class upon instantiation
835
-     * @param bool        $from_db      some classes are instantiated from the db
836
-     *                                  and thus call a different method to instantiate
837
-     * @param bool        $cache        whether to cache the instantiated object for reuse
838
-     * @param bool        $load_only    if true, will only load the file, but will NOT instantiate an object
839
-     * @return bool|null|object null = failure to load or instantiate class object.
840
-     *                                  object = class loaded and instantiated successfully.
841
-     *                                  bool = fail or success when $load_only is true
842
-     * @throws EE_Error
843
-     * @throws ReflectionException
844
-     * @throws InvalidInterfaceException
845
-     * @throws InvalidDataTypeException
846
-     * @throws InvalidArgumentException
847
-     */
848
-    protected function _load(
849
-        $file_paths = array(),
850
-        $class_prefix = 'EE_',
851
-        $class_name = false,
852
-        $type = 'class',
853
-        $arguments = array(),
854
-        $from_db = false,
855
-        $cache = true,
856
-        $load_only = false
857
-    ) {
858
-        $class_name = ltrim($class_name, '\\');
859
-        // strip php file extension
860
-        $class_name = str_replace('.php', '', trim($class_name));
861
-        // does the class have a prefix ?
862
-        if (! empty($class_prefix) && $class_prefix !== 'addon') {
863
-            // make sure $class_prefix is uppercase
864
-            $class_prefix = strtoupper(trim($class_prefix));
865
-            // add class prefix ONCE!!!
866
-            $class_name = $class_prefix . str_replace($class_prefix, '', $class_name);
867
-        }
868
-        $class_name = $this->class_cache->getFqnForAlias($class_name);
869
-        $class_exists = class_exists($class_name, false);
870
-        // if we're only loading the class and it already exists, then let's just return true immediately
871
-        if ($load_only && $class_exists) {
872
-            return true;
873
-        }
874
-        $arguments = is_array($arguments) ? $arguments : array($arguments);
875
-        // $this->_cache_on is toggled during the recursive loading that can occur with dependency injection
876
-        // $cache is controlled by individual calls to separate Registry loader methods like load_class()
877
-        // $load_only is also controlled by individual calls to separate Registry loader methods like load_file()
878
-        if ($this->_cache_on && $cache && ! $load_only) {
879
-            // return object if it's already cached
880
-            $cached_class = $this->_get_cached_class($class_name, $class_prefix, $arguments);
881
-            if ($cached_class !== null) {
882
-                return $cached_class;
883
-            }
884
-        }
885
-        // if the class doesn't already exist.. then we need to try and find the file and load it
886
-        if (! $class_exists) {
887
-            // get full path to file
888
-            $path = $this->_resolve_path($class_name, $type, $file_paths);
889
-            // load the file
890
-            $loaded = $this->_require_file($path, $class_name, $type, $file_paths);
891
-            // if we are only loading a file but NOT instantiating an object
892
-            // then return boolean for whether class was loaded or not
893
-            if ($load_only) {
894
-                return $loaded;
895
-            }
896
-            // if an object was expected but loading failed, then return nothing
897
-            if (! $loaded) {
898
-                return null;
899
-            }
900
-        }
901
-        // instantiate the requested object
902
-        $class_obj = $this->_create_object($class_name, $arguments, $type, $from_db);
903
-        if ($this->_cache_on && $cache) {
904
-            // save it for later... kinda like gum  { : $
905
-            $this->_set_cached_class(
906
-                $class_obj,
907
-                $class_name,
908
-                $class_prefix,
909
-                $from_db,
910
-                $arguments
911
-            );
912
-        }
913
-        $this->_cache_on = true;
914
-        return $class_obj;
915
-    }
916
-
917
-
918
-    /**
919
-     * @param string $class_name
920
-     * @param string $default have to specify something, but not anything that will conflict
921
-     * @return mixed|string
922
-     */
923
-    protected function get_class_abbreviation($class_name, $default = 'FANCY_BATMAN_PANTS')
924
-    {
925
-        return isset($this->_class_abbreviations[ $class_name ])
926
-            ? $this->_class_abbreviations[ $class_name ]
927
-            : $default;
928
-    }
929
-
930
-
931
-    /**
932
-     * attempts to find a cached version of the requested class
933
-     * by looking in the following places:
934
-     *        $this->{$class_abbreviation}            ie:    $this->CART
935
-     *        $this->{$class_name}                        ie:    $this->Some_Class
936
-     *        $this->LIB->{$class_name}                ie:    $this->LIB->Some_Class
937
-     *        $this->addon->{$class_name}    ie:    $this->addon->Some_Addon_Class
938
-     *
939
-     * @param string $class_name
940
-     * @param string $class_prefix
941
-     * @param array  $arguments
942
-     * @return mixed
943
-     */
944
-    protected function _get_cached_class(
945
-        $class_name,
946
-        $class_prefix = '',
947
-        $arguments = array()
948
-    ) {
949
-        if ($class_name === 'EE_Registry') {
950
-            return $this;
951
-        }
952
-        $class_abbreviation = $this->get_class_abbreviation($class_name);
953
-        // check if class has already been loaded, and return it if it has been
954
-        if (isset($this->{$class_abbreviation})) {
955
-            return $this->{$class_abbreviation};
956
-        }
957
-        $class_name = str_replace('\\', '_', $class_name);
958
-        if (isset($this->{$class_name})) {
959
-            return $this->{$class_name};
960
-        }
961
-        if ($class_prefix === 'addon' && isset($this->addons->{$class_name})) {
962
-            return $this->addons->{$class_name};
963
-        }
964
-        $object_identifier = $this->object_identifier->getIdentifier($class_name, $arguments);
965
-        if (isset($this->LIB->{$object_identifier})) {
966
-            return $this->LIB->{$object_identifier};
967
-        }
968
-        foreach ($this->LIB as $key => $object) {
969
-            if (// request does not contain new arguments and therefore no args identifier
970
-                ! $this->object_identifier->hasArguments($object_identifier)
971
-                // but previously cached class with args was found
972
-                && $this->object_identifier->fqcnMatchesObjectIdentifier($class_name, $key)
973
-            ) {
974
-                return $object;
975
-            }
976
-        }
977
-        return null;
978
-    }
979
-
980
-
981
-    /**
982
-     * removes a cached version of the requested class
983
-     *
984
-     * @param string  $class_name
985
-     * @param boolean $addon
986
-     * @param array   $arguments
987
-     * @return boolean
988
-     */
989
-    public function clear_cached_class(
990
-        $class_name,
991
-        $addon = false,
992
-        $arguments = array()
993
-    ) {
994
-        $class_abbreviation = $this->get_class_abbreviation($class_name);
995
-        // check if class has already been loaded, and return it if it has been
996
-        if (isset($this->{$class_abbreviation})) {
997
-            $this->{$class_abbreviation} = null;
998
-            return true;
999
-        }
1000
-        $class_name = str_replace('\\', '_', $class_name);
1001
-        if (isset($this->{$class_name})) {
1002
-            $this->{$class_name} = null;
1003
-            return true;
1004
-        }
1005
-        if ($addon && isset($this->addons->{$class_name})) {
1006
-            unset($this->addons->{$class_name});
1007
-            return true;
1008
-        }
1009
-        $class_name = $this->object_identifier->getIdentifier($class_name, $arguments);
1010
-        if (isset($this->LIB->{$class_name})) {
1011
-            unset($this->LIB->{$class_name});
1012
-            return true;
1013
-        }
1014
-        return false;
1015
-    }
1016
-
1017
-
1018
-    /**
1019
-     * _set_cached_class
1020
-     * attempts to cache the instantiated class locally
1021
-     * in one of the following places, in the following order:
1022
-     *        $this->{class_abbreviation}   ie:    $this->CART
1023
-     *        $this->{$class_name}          ie:    $this->Some_Class
1024
-     *        $this->addon->{$$class_name}    ie:    $this->addon->Some_Addon_Class
1025
-     *        $this->LIB->{$class_name}     ie:    $this->LIB->Some_Class
1026
-     *
1027
-     * @param object $class_obj
1028
-     * @param string $class_name
1029
-     * @param string $class_prefix
1030
-     * @param bool   $from_db
1031
-     * @param array  $arguments
1032
-     * @return void
1033
-     */
1034
-    protected function _set_cached_class(
1035
-        $class_obj,
1036
-        $class_name,
1037
-        $class_prefix = '',
1038
-        $from_db = false,
1039
-        $arguments = array()
1040
-    ) {
1041
-        if ($class_name === 'EE_Registry' || empty($class_obj)) {
1042
-            return;
1043
-        }
1044
-        // return newly instantiated class
1045
-        $class_abbreviation = $this->get_class_abbreviation($class_name, '');
1046
-        if ($class_abbreviation) {
1047
-            $this->{$class_abbreviation} = $class_obj;
1048
-            return;
1049
-        }
1050
-        $class_name = str_replace('\\', '_', $class_name);
1051
-        if (property_exists($this, $class_name)) {
1052
-            $this->{$class_name} = $class_obj;
1053
-            return;
1054
-        }
1055
-        if ($class_prefix === 'addon') {
1056
-            $this->addons->{$class_name} = $class_obj;
1057
-            return;
1058
-        }
1059
-        if (! $from_db) {
1060
-            $class_name = $this->object_identifier->getIdentifier($class_name, $arguments);
1061
-            $this->LIB->{$class_name} = $class_obj;
1062
-        }
1063
-    }
1064
-
1065
-
1066
-    /**
1067
-     * attempts to find a full valid filepath for the requested class.
1068
-     * loops thru each of the base paths in the $file_paths array and appends : "{classname} . {file type} . php"
1069
-     * then returns that path if the target file has been found and is readable
1070
-     *
1071
-     * @param string $class_name
1072
-     * @param string $type
1073
-     * @param array  $file_paths
1074
-     * @return string | bool
1075
-     */
1076
-    protected function _resolve_path($class_name, $type = '', $file_paths = array())
1077
-    {
1078
-        // make sure $file_paths is an array
1079
-        $file_paths = is_array($file_paths)
1080
-            ? $file_paths
1081
-            : array($file_paths);
1082
-        // cycle thru paths
1083
-        foreach ($file_paths as $key => $file_path) {
1084
-            // convert all separators to proper DS, if no filepath, then use EE_CLASSES
1085
-            $file_path = $file_path
1086
-                ? str_replace(array('/', '\\'), DS, $file_path)
1087
-                : EE_CLASSES;
1088
-            // prep file type
1089
-            $type = ! empty($type)
1090
-                ? trim($type, '.') . '.'
1091
-                : '';
1092
-            // build full file path
1093
-            $file_paths[ $key ] = rtrim($file_path, DS) . DS . $class_name . '.' . $type . 'php';
1094
-            // does the file exist and can be read ?
1095
-            if (is_readable($file_paths[ $key ])) {
1096
-                return $file_paths[ $key ];
1097
-            }
1098
-        }
1099
-        return false;
1100
-    }
1101
-
1102
-
1103
-    /**
1104
-     * basically just performs a require_once()
1105
-     * but with some error handling
1106
-     *
1107
-     * @param  string $path
1108
-     * @param  string $class_name
1109
-     * @param  string $type
1110
-     * @param  array  $file_paths
1111
-     * @return bool
1112
-     * @throws EE_Error
1113
-     * @throws ReflectionException
1114
-     */
1115
-    protected function _require_file($path, $class_name, $type = '', $file_paths = array())
1116
-    {
1117
-        $this->resolve_legacy_class_parent($class_name);
1118
-        // don't give up! you gotta...
1119
-        try {
1120
-            // does the file exist and can it be read ?
1121
-            if (! $path) {
1122
-                // just in case the file has already been autoloaded,
1123
-                // but discrepancies in the naming schema are preventing it from
1124
-                // being loaded via one of the EE_Registry::load_*() methods,
1125
-                // then let's try one last hail mary before throwing an exception
1126
-                // and call class_exists() again, but with autoloading turned ON
1127
-                if (class_exists($class_name)) {
1128
-                    return true;
1129
-                }
1130
-                // so sorry, can't find the file
1131
-                throw new EE_Error(
1132
-                    sprintf(
1133
-                        esc_html__(
1134
-                            'The %1$s file %2$s could not be located or is not readable due to file permissions. Please ensure that the following filepath(s) are correct: %3$s',
1135
-                            'event_espresso'
1136
-                        ),
1137
-                        trim($type, '.'),
1138
-                        $class_name,
1139
-                        '<br />' . implode(',<br />', $file_paths)
1140
-                    )
1141
-                );
1142
-            }
1143
-            // get the file
1144
-            require_once($path);
1145
-            // if the class isn't already declared somewhere
1146
-            if (class_exists($class_name, false) === false) {
1147
-                // so sorry, not a class
1148
-                throw new EE_Error(
1149
-                    sprintf(
1150
-                        esc_html__(
1151
-                            'The %s file %s does not appear to contain the %s Class.',
1152
-                            'event_espresso'
1153
-                        ),
1154
-                        $type,
1155
-                        $path,
1156
-                        $class_name
1157
-                    )
1158
-                );
1159
-            }
1160
-        } catch (EE_Error $e) {
1161
-            $e->get_error();
1162
-            return false;
1163
-        }
1164
-        return true;
1165
-    }
1166
-
1167
-
1168
-    /**
1169
-     * Some of our legacy classes that extended a parent class would simply use a require() statement
1170
-     * before their class declaration in order to ensure that the parent class was loaded.
1171
-     * This is not ideal, but it's nearly impossible to determine the parent class of a non-namespaced class,
1172
-     * without triggering a fatal error because the parent class has yet to be loaded and therefore doesn't exist.
1173
-     *
1174
-     * @param string $class_name
1175
-     */
1176
-    protected function resolve_legacy_class_parent($class_name = '')
1177
-    {
1178
-        try {
1179
-            $legacy_parent_class_map = array(
1180
-                'EE_Payment_Processor' => 'core/business/EE_Processor_Base.class.php',
1181
-            );
1182
-            if (isset($legacy_parent_class_map[ $class_name ])) {
1183
-                require_once EE_PLUGIN_DIR_PATH . $legacy_parent_class_map[ $class_name ];
1184
-            }
1185
-        } catch (Exception $exception) {
1186
-        }
1187
-    }
1188
-
1189
-
1190
-    /**
1191
-     * _create_object
1192
-     * Attempts to instantiate the requested class via any of the
1193
-     * commonly used instantiation methods employed throughout EE.
1194
-     * The priority for instantiation is as follows:
1195
-     *        - abstract classes or any class flagged as "load only" (no instantiation occurs)
1196
-     *        - model objects via their 'new_instance_from_db' method
1197
-     *        - model objects via their 'new_instance' method
1198
-     *        - "singleton" classes" via their 'instance' method
1199
-     *    - standard instantiable classes via their __constructor
1200
-     * Prior to instantiation, if the classname exists in the dependency_map,
1201
-     * then the constructor for the requested class will be examined to determine
1202
-     * if any dependencies exist, and if they can be injected.
1203
-     * If so, then those classes will be added to the array of arguments passed to the constructor
1204
-     *
1205
-     * @param string $class_name
1206
-     * @param array  $arguments
1207
-     * @param string $type
1208
-     * @param bool   $from_db
1209
-     * @return null|object|bool
1210
-     * @throws InvalidArgumentException
1211
-     * @throws InvalidInterfaceException
1212
-     * @throws EE_Error
1213
-     * @throws ReflectionException
1214
-     * @throws InvalidDataTypeException
1215
-     */
1216
-    protected function _create_object($class_name, $arguments = array(), $type = '', $from_db = false)
1217
-    {
1218
-        // create reflection
1219
-        $reflector = $this->mirror->getReflectionClass($class_name);
1220
-        // make sure arguments are an array
1221
-        $arguments = is_array($arguments)
1222
-            ? $arguments
1223
-            : array($arguments);
1224
-        // and if arguments array is numerically and sequentially indexed, then we want it to remain as is,
1225
-        // else wrap it in an additional array so that it doesn't get split into multiple parameters
1226
-        $arguments = $this->_array_is_numerically_and_sequentially_indexed($arguments)
1227
-            ? $arguments
1228
-            : array($arguments);
1229
-        // attempt to inject dependencies ?
1230
-        if ($this->_dependency_map->has($class_name)) {
1231
-            $arguments = $this->_resolve_dependencies($reflector, $class_name, $arguments);
1232
-        }
1233
-        // instantiate the class if possible
1234
-        if ($reflector->isAbstract()) {
1235
-            // nothing to instantiate, loading file was enough
1236
-            // does not throw an exception so $instantiation_mode is unused
1237
-            // $instantiation_mode = "1) no constructor abstract class";
1238
-            return true;
1239
-        }
1240
-        if (empty($arguments)
1241
-            && $this->mirror->getConstructorFromReflection($reflector) === null
1242
-            && $reflector->isInstantiable()
1243
-        ) {
1244
-            // no constructor = static methods only... nothing to instantiate, loading file was enough
1245
-            // $instantiation_mode = "2) no constructor but instantiable";
1246
-            return $reflector->newInstance();
1247
-        }
1248
-        if ($from_db && method_exists($class_name, 'new_instance_from_db')) {
1249
-            // $instantiation_mode = "3) new_instance_from_db()";
1250
-            return call_user_func_array(array($class_name, 'new_instance_from_db'), $arguments);
1251
-        }
1252
-        if (method_exists($class_name, 'new_instance')) {
1253
-            // $instantiation_mode = "4) new_instance()";
1254
-            return call_user_func_array(array($class_name, 'new_instance'), $arguments);
1255
-        }
1256
-        if (method_exists($class_name, 'instance')) {
1257
-            // $instantiation_mode = "5) instance()";
1258
-            return call_user_func_array(array($class_name, 'instance'), $arguments);
1259
-        }
1260
-        if ($reflector->isInstantiable()) {
1261
-            // $instantiation_mode = "6) constructor";
1262
-            return $reflector->newInstanceArgs($arguments);
1263
-        }
1264
-        // heh ? something's not right !
1265
-        throw new EE_Error(
1266
-            sprintf(
1267
-                __('The %s file %s could not be instantiated.', 'event_espresso'),
1268
-                $type,
1269
-                $class_name
1270
-            )
1271
-        );
1272
-    }
1273
-
1274
-
1275
-    /**
1276
-     * @see http://stackoverflow.com/questions/173400/how-to-check-if-php-array-is-associative-or-sequential
1277
-     * @param array $array
1278
-     * @return bool
1279
-     */
1280
-    protected function _array_is_numerically_and_sequentially_indexed(array $array)
1281
-    {
1282
-        return ! empty($array)
1283
-            ? array_keys($array) === range(0, count($array) - 1)
1284
-            : true;
1285
-    }
1286
-
1287
-
1288
-    /**
1289
-     * _resolve_dependencies
1290
-     * examines the constructor for the requested class to determine
1291
-     * if any dependencies exist, and if they can be injected.
1292
-     * If so, then those classes will be added to the array of arguments passed to the constructor
1293
-     * PLZ NOTE: this is achieved by type hinting the constructor params
1294
-     * For example:
1295
-     *        if attempting to load a class "Foo" with the following constructor:
1296
-     *        __construct( Bar $bar_class, Fighter $grohl_class )
1297
-     *        then $bar_class and $grohl_class will be added to the $arguments array,
1298
-     *        but only IF they are NOT already present in the incoming arguments array,
1299
-     *        and the correct classes can be loaded
1300
-     *
1301
-     * @param ReflectionClass $reflector
1302
-     * @param string          $class_name
1303
-     * @param array           $arguments
1304
-     * @return array
1305
-     * @throws InvalidArgumentException
1306
-     * @throws InvalidDataTypeException
1307
-     * @throws InvalidInterfaceException
1308
-     * @throws ReflectionException
1309
-     */
1310
-    protected function _resolve_dependencies(ReflectionClass $reflector, $class_name, array $arguments = array())
1311
-    {
1312
-        // let's examine the constructor
1313
-        $constructor = $this->mirror->getConstructorFromReflection($reflector);
1314
-        // whu? huh? nothing?
1315
-        if (! $constructor) {
1316
-            return $arguments;
1317
-        }
1318
-        // get constructor parameters
1319
-        $params = $this->mirror->getParametersFromReflection($reflector);
1320
-        // and the keys for the incoming arguments array so that we can compare existing arguments with what is expected
1321
-        $argument_keys = array_keys($arguments);
1322
-        // now loop thru all of the constructors expected parameters
1323
-        foreach ($params as $index => $param) {
1324
-            // is this a dependency for a specific class ?
1325
-            $param_class = $this->mirror->getParameterClassName($param, $class_name, $index);
1326
-            // BUT WAIT !!! This class may be an alias for something else (or getting replaced at runtime)
1327
-            $param_class = $this->class_cache->isAlias($param_class, $class_name)
1328
-                ? $this->class_cache->getFqnForAlias($param_class, $class_name)
1329
-                : $param_class;
1330
-            if (// param is not even a class
1331
-                $param_class === null
1332
-                // and something already exists in the incoming arguments for this param
1333
-                && array_key_exists($index, $argument_keys)
1334
-                && array_key_exists($argument_keys[ $index ], $arguments)
1335
-            ) {
1336
-                // so let's skip this argument and move on to the next
1337
-                continue;
1338
-            }
1339
-            if (// parameter is type hinted as a class, exists as an incoming argument, AND it's the correct class
1340
-                $param_class !== null
1341
-                && isset($argument_keys[ $index ], $arguments[ $argument_keys[ $index ] ])
1342
-                && $arguments[ $argument_keys[ $index ] ] instanceof $param_class
1343
-            ) {
1344
-                // skip this argument and move on to the next
1345
-                continue;
1346
-            }
1347
-            if (// parameter is type hinted as a class, and should be injected
1348
-                $param_class !== null
1349
-                && $this->_dependency_map->has_dependency_for_class($class_name, $param_class)
1350
-            ) {
1351
-                $arguments = $this->_resolve_dependency(
1352
-                    $class_name,
1353
-                    $param_class,
1354
-                    $arguments,
1355
-                    $index
1356
-                );
1357
-            } else {
1358
-                $arguments[ $index ] = $this->mirror->getParameterDefaultValue(
1359
-                    $param,
1360
-                    $class_name,
1361
-                    $index
1362
-                );
1363
-            }
1364
-        }
1365
-        return $arguments;
1366
-    }
1367
-
1368
-
1369
-    /**
1370
-     * @param string $class_name
1371
-     * @param string $param_class
1372
-     * @param array  $arguments
1373
-     * @param mixed  $index
1374
-     * @return array
1375
-     * @throws InvalidArgumentException
1376
-     * @throws InvalidInterfaceException
1377
-     * @throws InvalidDataTypeException
1378
-     */
1379
-    protected function _resolve_dependency($class_name, $param_class, $arguments, $index)
1380
-    {
1381
-        $dependency = null;
1382
-        // should dependency be loaded from cache ?
1383
-        $cache_on = $this->_dependency_map->loading_strategy_for_class_dependency(
1384
-            $class_name,
1385
-            $param_class
1386
-        );
1387
-        $cache_on = $cache_on !== EE_Dependency_Map::load_new_object;
1388
-        // we might have a dependency...
1389
-        // let's MAYBE try and find it in our cache if that's what's been requested
1390
-        $cached_class = $cache_on
1391
-            ? $this->_get_cached_class($param_class)
1392
-            : null;
1393
-        // and grab it if it exists
1394
-        if ($cached_class instanceof $param_class) {
1395
-            $dependency = $cached_class;
1396
-        } elseif ($param_class !== $class_name) {
1397
-            // obtain the loader method from the dependency map
1398
-            $loader = $this->_dependency_map->class_loader($param_class);
1399
-            // is loader a custom closure ?
1400
-            if ($loader instanceof Closure) {
1401
-                $dependency = $loader($arguments);
1402
-            } else {
1403
-                // set the cache on property for the recursive loading call
1404
-                $this->_cache_on = $cache_on;
1405
-                // if not, then let's try and load it via the registry
1406
-                if ($loader && method_exists($this, $loader)) {
1407
-                    $dependency = $this->{$loader}($param_class);
1408
-                } else {
1409
-                    $dependency = LoaderFactory::getLoader()->load(
1410
-                        $param_class,
1411
-                        array(),
1412
-                        $cache_on
1413
-                    );
1414
-                }
1415
-            }
1416
-        }
1417
-        // did we successfully find the correct dependency ?
1418
-        if ($dependency instanceof $param_class) {
1419
-            // then let's inject it into the incoming array of arguments at the correct location
1420
-            $arguments[ $index ] = $dependency;
1421
-        }
1422
-        return $arguments;
1423
-    }
1424
-
1425
-
1426
-    /**
1427
-     * call any loader that's been registered in the EE_Dependency_Map::$_class_loaders array
1428
-     *
1429
-     * @param string $classname PLEASE NOTE: the class name needs to match what's registered
1430
-     *                          in the EE_Dependency_Map::$_class_loaders array,
1431
-     *                          including the class prefix, ie: "EE_", "EEM_", "EEH_", etc
1432
-     * @param array  $arguments
1433
-     * @return object
1434
-     */
1435
-    public static function factory($classname, $arguments = array())
1436
-    {
1437
-        $loader = self::instance()->_dependency_map->class_loader($classname);
1438
-        if ($loader instanceof Closure) {
1439
-            return $loader($arguments);
1440
-        }
1441
-        if (method_exists(self::instance(), $loader)) {
1442
-            return self::instance()->{$loader}($classname, $arguments);
1443
-        }
1444
-        return null;
1445
-    }
1446
-
1447
-
1448
-    /**
1449
-     * Gets the addon by its class name
1450
-     *
1451
-     * @param string $class_name
1452
-     * @return EE_Addon
1453
-     */
1454
-    public function getAddon($class_name)
1455
-    {
1456
-        $class_name = str_replace('\\', '_', $class_name);
1457
-        if (isset($this->addons->{$class_name})) {
1458
-            return $this->addons->{$class_name};
1459
-        } else {
1460
-            return null;
1461
-        }
1462
-    }
1463
-
1464
-
1465
-    /**
1466
-     * removes the addon from the internal cache
1467
-     *
1468
-     * @param string $class_name
1469
-     * @return void
1470
-     */
1471
-    public function removeAddon($class_name)
1472
-    {
1473
-        $class_name = str_replace('\\', '_', $class_name);
1474
-        unset($this->addons->{$class_name});
1475
-    }
1476
-
1477
-
1478
-    /**
1479
-     * Gets the addon by its name/slug (not classname. For that, just
1480
-     * use the get_addon() method above
1481
-     *
1482
-     * @param string $name
1483
-     * @return EE_Addon
1484
-     */
1485
-    public function get_addon_by_name($name)
1486
-    {
1487
-        foreach ($this->addons as $addon) {
1488
-            if ($addon->name() === $name) {
1489
-                return $addon;
1490
-            }
1491
-        }
1492
-        return null;
1493
-    }
1494
-
1495
-
1496
-    /**
1497
-     * Gets an array of all the registered addons, where the keys are their names.
1498
-     * (ie, what each returns for their name() function)
1499
-     * They're already available on EE_Registry::instance()->addons as properties,
1500
-     * where each property's name is the addon's classname,
1501
-     * So if you just want to get the addon by classname,
1502
-     * OR use the get_addon() method above.
1503
-     * PLEASE  NOTE:
1504
-     * addons with Fully Qualified Class Names
1505
-     * have had the namespace separators converted to underscores,
1506
-     * so a classname like Fully\Qualified\ClassName
1507
-     * would have been converted to Fully_Qualified_ClassName
1508
-     *
1509
-     * @return EE_Addon[] where the KEYS are the addon's name()
1510
-     */
1511
-    public function get_addons_by_name()
1512
-    {
1513
-        $addons = array();
1514
-        foreach ($this->addons as $addon) {
1515
-            $addons[ $addon->name() ] = $addon;
1516
-        }
1517
-        return $addons;
1518
-    }
1519
-
1520
-
1521
-    /**
1522
-     * Resets the specified model's instance AND makes sure EE_Registry doesn't keep
1523
-     * a stale copy of it around
1524
-     *
1525
-     * @param string $model_name
1526
-     * @return \EEM_Base
1527
-     * @throws \EE_Error
1528
-     */
1529
-    public function reset_model($model_name)
1530
-    {
1531
-        $model_class_name = strpos($model_name, 'EEM_') !== 0
1532
-            ? "EEM_{$model_name}"
1533
-            : $model_name;
1534
-        if (! isset($this->LIB->{$model_class_name}) || ! $this->LIB->{$model_class_name} instanceof EEM_Base) {
1535
-            return null;
1536
-        }
1537
-        // get that model reset it and make sure we nuke the old reference to it
1538
-        if ($this->LIB->{$model_class_name} instanceof $model_class_name
1539
-            && is_callable(
1540
-                array($model_class_name, 'reset')
1541
-            )) {
1542
-            $this->LIB->{$model_class_name} = $this->LIB->{$model_class_name}->reset();
1543
-        } else {
1544
-            throw new EE_Error(
1545
-                sprintf(
1546
-                    esc_html__('Model %s does not have a method "reset"', 'event_espresso'),
1547
-                    $model_name
1548
-                )
1549
-            );
1550
-        }
1551
-        return $this->LIB->{$model_class_name};
1552
-    }
1553
-
1554
-
1555
-    /**
1556
-     * Resets the registry.
1557
-     * The criteria for what gets reset is based on what can be shared between sites on the same request when
1558
-     * switch_to_blog is used in a multisite install.  Here is a list of things that are NOT reset.
1559
-     * - $_dependency_map
1560
-     * - $_class_abbreviations
1561
-     * - $NET_CFG (EE_Network_Config): The config is shared network wide so no need to reset.
1562
-     * - $REQ:  Still on the same request so no need to change.
1563
-     * - $CAP: There is no site specific state in the EE_Capability class.
1564
-     * - $SSN: Although ideally, the session should not be shared between site switches, we can't reset it because only
1565
-     * one Session can be active in a single request.  Resetting could resolve in "headers already sent" errors.
1566
-     * - $addons:  In multisite, the state of the addons is something controlled via hooks etc in a normal request.  So
1567
-     *             for now, we won't reset the addons because it could break calls to an add-ons class/methods in the
1568
-     *             switch or on the restore.
1569
-     * - $modules
1570
-     * - $shortcodes
1571
-     * - $widgets
1572
-     *
1573
-     * @param boolean $hard             [deprecated]
1574
-     * @param boolean $reinstantiate    whether to create new instances of EE_Registry's singletons too,
1575
-     *                                  or just reset without re-instantiating (handy to set to FALSE if you're not
1576
-     *                                  sure if you CAN currently reinstantiate the singletons at the moment)
1577
-     * @param   bool  $reset_models     Defaults to true.  When false, then the models are not reset.  This is so
1578
-     *                                  client
1579
-     *                                  code instead can just change the model context to a different blog id if
1580
-     *                                  necessary
1581
-     * @return EE_Registry
1582
-     * @throws InvalidInterfaceException
1583
-     * @throws InvalidDataTypeException
1584
-     * @throws EE_Error
1585
-     * @throws ReflectionException
1586
-     * @throws InvalidArgumentException
1587
-     */
1588
-    public static function reset($hard = false, $reinstantiate = true, $reset_models = true)
1589
-    {
1590
-        $instance = self::instance();
1591
-        $instance->_cache_on = true;
1592
-        // reset some "special" classes
1593
-        EEH_Activation::reset();
1594
-        $hard = apply_filters('FHEE__EE_Registry__reset__hard', $hard);
1595
-        $instance->CFG = EE_Config::reset($hard, $reinstantiate);
1596
-        $instance->CART = null;
1597
-        $instance->MRM = null;
1598
-        $instance->AssetsRegistry = LoaderFactory::getLoader()->getShared(
1599
-            'EventEspresso\core\services\assets\Registry'
1600
-        );
1601
-        // messages reset
1602
-        EED_Messages::reset();
1603
-        // handle of objects cached on LIB
1604
-        foreach (array('LIB', 'modules') as $cache) {
1605
-            foreach ($instance->{$cache} as $class_name => $class) {
1606
-                if (self::_reset_and_unset_object($class, $reset_models)) {
1607
-                    unset($instance->{$cache}->{$class_name});
1608
-                }
1609
-            }
1610
-        }
1611
-        return $instance;
1612
-    }
1613
-
1614
-
1615
-    /**
1616
-     * if passed object implements ResettableInterface, then call it's reset() method
1617
-     * if passed object implements InterminableInterface, then return false,
1618
-     * to indicate that it should NOT be cleared from the Registry cache
1619
-     *
1620
-     * @param      $object
1621
-     * @param bool $reset_models
1622
-     * @return bool returns true if cached object should be unset
1623
-     */
1624
-    private static function _reset_and_unset_object($object, $reset_models)
1625
-    {
1626
-        if (! is_object($object)) {
1627
-            // don't unset anything that's not an object
1628
-            return false;
1629
-        }
1630
-        if ($object instanceof EED_Module) {
1631
-            $object::reset();
1632
-            // don't unset modules
1633
-            return false;
1634
-        }
1635
-        if ($object instanceof ResettableInterface) {
1636
-            if ($object instanceof EEM_Base) {
1637
-                if ($reset_models) {
1638
-                    $object->reset();
1639
-                    return true;
1640
-                }
1641
-                return false;
1642
-            }
1643
-            $object->reset();
1644
-            return true;
1645
-        }
1646
-        if (! $object instanceof InterminableInterface) {
1647
-            return true;
1648
-        }
1649
-        return false;
1650
-    }
1651
-
1652
-
1653
-    /**
1654
-     * Gets all the custom post type models defined
1655
-     *
1656
-     * @return array keys are model "short names" (Eg "Event") and keys are classnames (eg "EEM_Event")
1657
-     */
1658
-    public function cpt_models()
1659
-    {
1660
-        $cpt_models = array();
1661
-        foreach ($this->non_abstract_db_models as $short_name => $classname) {
1662
-            if (is_subclass_of($classname, 'EEM_CPT_Base')) {
1663
-                $cpt_models[ $short_name ] = $classname;
1664
-            }
1665
-        }
1666
-        return $cpt_models;
1667
-    }
1668
-
1669
-
1670
-    /**
1671
-     * @return \EE_Config
1672
-     */
1673
-    public static function CFG()
1674
-    {
1675
-        return self::instance()->CFG;
1676
-    }
1677
-
1678
-
1679
-    /**
1680
-     * @deprecated 4.9.62.p
1681
-     * @param string $class_name
1682
-     * @return ReflectionClass
1683
-     * @throws ReflectionException
1684
-     * @throws InvalidDataTypeException
1685
-     */
1686
-    public function get_ReflectionClass($class_name)
1687
-    {
1688
-        return $this->mirror->getReflectionClass($class_name);
1689
-    }
26
+	/**
27
+	 * @var EE_Registry $_instance
28
+	 */
29
+	private static $_instance;
30
+
31
+	/**
32
+	 * @var EE_Dependency_Map $_dependency_map
33
+	 */
34
+	protected $_dependency_map;
35
+
36
+	/**
37
+	 * @var Mirror
38
+	 */
39
+	private $mirror;
40
+
41
+	/**
42
+	 * @var ClassInterfaceCache $class_cache
43
+	 */
44
+	private $class_cache;
45
+
46
+	/**
47
+	 * @var array $_class_abbreviations
48
+	 */
49
+	protected $_class_abbreviations = array();
50
+
51
+	/**
52
+	 * @var CommandBusInterface $BUS
53
+	 */
54
+	public $BUS;
55
+
56
+	/**
57
+	 * @var EE_Cart $CART
58
+	 */
59
+	public $CART;
60
+
61
+	/**
62
+	 * @var EE_Config $CFG
63
+	 */
64
+	public $CFG;
65
+
66
+	/**
67
+	 * @var EE_Network_Config $NET_CFG
68
+	 */
69
+	public $NET_CFG;
70
+
71
+	/**
72
+	 * StdClass object for storing library classes in
73
+	 *
74
+	 * @var RegistryContainer $LIB
75
+	 */
76
+	public $LIB;
77
+
78
+	/**
79
+	 * @var EE_Request_Handler $REQ
80
+	 */
81
+	public $REQ;
82
+
83
+	/**
84
+	 * @var EE_Session $SSN
85
+	 */
86
+	public $SSN;
87
+
88
+	/**
89
+	 * @since 4.5.0
90
+	 * @var EE_Capabilities $CAP
91
+	 */
92
+	public $CAP;
93
+
94
+	/**
95
+	 * @since 4.9.0
96
+	 * @var EE_Message_Resource_Manager $MRM
97
+	 */
98
+	public $MRM;
99
+
100
+	/**
101
+	 * @var Registry $AssetsRegistry
102
+	 */
103
+	public $AssetsRegistry;
104
+
105
+	/**
106
+	 * StdClass object for holding addons which have registered themselves to work with EE core
107
+	 *
108
+	 * @var EE_Addon[] $addons
109
+	 */
110
+	public $addons;
111
+
112
+	/**
113
+	 * keys are 'short names' (eg Event), values are class names (eg 'EEM_Event')
114
+	 *
115
+	 * @var EEM_Base[] $models
116
+	 */
117
+	public $models = array();
118
+
119
+	/**
120
+	 * @var EED_Module[] $modules
121
+	 */
122
+	public $modules;
123
+
124
+	/**
125
+	 * @var EES_Shortcode[] $shortcodes
126
+	 */
127
+	public $shortcodes;
128
+
129
+	/**
130
+	 * @var WP_Widget[] $widgets
131
+	 */
132
+	public $widgets;
133
+
134
+	/**
135
+	 * this is an array of all implemented model names (i.e. not the parent abstract models, or models
136
+	 * which don't actually fetch items from the DB in the normal way (ie, are not children of EEM_Base)).
137
+	 * Keys are model "short names" (eg "Event") as used in model relations, and values are
138
+	 * classnames (eg "EEM_Event")
139
+	 *
140
+	 * @var array $non_abstract_db_models
141
+	 */
142
+	public $non_abstract_db_models = array();
143
+
144
+	/**
145
+	 * internationalization for JS strings
146
+	 *    usage:   EE_Registry::i18n_js_strings['string_key'] = esc_html__( 'string to translate.', 'event_espresso' );
147
+	 *    in js file:  var translatedString = eei18n.string_key;
148
+	 *
149
+	 * @var array $i18n_js_strings
150
+	 */
151
+	public static $i18n_js_strings = array();
152
+
153
+	/**
154
+	 * $main_file - path to espresso.php
155
+	 *
156
+	 * @var array $main_file
157
+	 */
158
+	public $main_file;
159
+
160
+	/**
161
+	 * array of ReflectionClass objects where the key is the class name
162
+	 *
163
+	 * @deprecated 4.9.62.p
164
+	 * @var ReflectionClass[] $_reflectors
165
+	 */
166
+	public $_reflectors;
167
+
168
+	/**
169
+	 * boolean flag to indicate whether or not to load/save dependencies from/to the cache
170
+	 *
171
+	 * @var boolean $_cache_on
172
+	 */
173
+	protected $_cache_on = true;
174
+
175
+	/**
176
+	 * @var ObjectIdentifier
177
+	 */
178
+	private $object_identifier;
179
+
180
+
181
+	/**
182
+	 * @singleton method used to instantiate class object
183
+	 * @param EE_Dependency_Map|null   $dependency_map
184
+	 * @param Mirror|null              $mirror
185
+	 * @param ClassInterfaceCache|null $class_cache
186
+	 * @param ObjectIdentifier|null    $object_identifier
187
+	 * @return EE_Registry instance
188
+	 */
189
+	public static function instance(
190
+		EE_Dependency_Map $dependency_map = null,
191
+		Mirror $mirror = null,
192
+		ClassInterfaceCache $class_cache = null,
193
+		ObjectIdentifier $object_identifier = null
194
+	) {
195
+		// check if class object is instantiated
196
+		if (! self::$_instance instanceof EE_Registry
197
+			&& $dependency_map instanceof EE_Dependency_Map
198
+			&& $mirror instanceof Mirror
199
+			&& $class_cache instanceof ClassInterfaceCache
200
+			&& $object_identifier instanceof ObjectIdentifier
201
+		) {
202
+			self::$_instance = new self(
203
+				$dependency_map,
204
+				$mirror,
205
+				$class_cache,
206
+				$object_identifier
207
+			);
208
+		}
209
+		return self::$_instance;
210
+	}
211
+
212
+
213
+	/**
214
+	 * protected constructor to prevent direct creation
215
+	 *
216
+	 * @Constructor
217
+	 * @param  EE_Dependency_Map  $dependency_map
218
+	 * @param Mirror              $mirror
219
+	 * @param ClassInterfaceCache $class_cache
220
+	 * @param ObjectIdentifier    $object_identifier
221
+	 */
222
+	protected function __construct(
223
+		EE_Dependency_Map $dependency_map,
224
+		Mirror $mirror,
225
+		ClassInterfaceCache $class_cache,
226
+		ObjectIdentifier $object_identifier
227
+	) {
228
+		$this->_dependency_map = $dependency_map;
229
+		$this->mirror = $mirror;
230
+		$this->class_cache = $class_cache;
231
+		$this->object_identifier = $object_identifier;
232
+		// $registry_container = new RegistryContainer();
233
+		$this->LIB = new RegistryContainer();
234
+		$this->addons = new RegistryContainer();
235
+		$this->modules = new RegistryContainer();
236
+		$this->shortcodes = new RegistryContainer();
237
+		$this->widgets = new RegistryContainer();
238
+		add_action('EE_Load_Espresso_Core__handle_request__initialize_core_loading', array($this, 'initialize'));
239
+	}
240
+
241
+
242
+	/**
243
+	 * initialize
244
+	 *
245
+	 * @throws OutOfBoundsException
246
+	 * @throws InvalidArgumentException
247
+	 * @throws InvalidInterfaceException
248
+	 * @throws InvalidDataTypeException
249
+	 * @throws EE_Error
250
+	 * @throws ReflectionException
251
+	 */
252
+	public function initialize()
253
+	{
254
+		$this->_class_abbreviations = apply_filters(
255
+			'FHEE__EE_Registry____construct___class_abbreviations',
256
+			array(
257
+				'EE_Config'                                       => 'CFG',
258
+				'EE_Session'                                      => 'SSN',
259
+				'EE_Capabilities'                                 => 'CAP',
260
+				'EE_Cart'                                         => 'CART',
261
+				'EE_Network_Config'                               => 'NET_CFG',
262
+				'EE_Request_Handler'                              => 'REQ',
263
+				'EE_Message_Resource_Manager'                     => 'MRM',
264
+				'EventEspresso\core\services\commands\CommandBus' => 'BUS',
265
+				'EventEspresso\core\services\assets\Registry'     => 'AssetsRegistry',
266
+			)
267
+		);
268
+		$this->load_core('Base', array(), true);
269
+		// add our request and response objects to the cache
270
+		$request_loader = $this->_dependency_map->class_loader(
271
+			'EventEspresso\core\services\request\Request'
272
+		);
273
+		$this->_set_cached_class(
274
+			$request_loader(),
275
+			'EventEspresso\core\services\request\Request'
276
+		);
277
+		$response_loader = $this->_dependency_map->class_loader(
278
+			'EventEspresso\core\services\request\Response'
279
+		);
280
+		$this->_set_cached_class(
281
+			$response_loader(),
282
+			'EventEspresso\core\services\request\Response'
283
+		);
284
+		add_action('AHEE__EE_System__set_hooks_for_core', array($this, 'init'));
285
+	}
286
+
287
+
288
+	/**
289
+	 * @return void
290
+	 */
291
+	public function init()
292
+	{
293
+		// Get current page protocol
294
+		$protocol = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
295
+		// Output admin-ajax.php URL with same protocol as current page
296
+		self::$i18n_js_strings['ajax_url'] = admin_url('admin-ajax.php', $protocol);
297
+		self::$i18n_js_strings['wp_debug'] = defined('WP_DEBUG') ? WP_DEBUG : false;
298
+	}
299
+
300
+
301
+	/**
302
+	 * localize_i18n_js_strings
303
+	 *
304
+	 * @return string
305
+	 */
306
+	public static function localize_i18n_js_strings()
307
+	{
308
+		$i18n_js_strings = (array) self::$i18n_js_strings;
309
+		foreach ($i18n_js_strings as $key => $value) {
310
+			if (is_scalar($value)) {
311
+				$i18n_js_strings[ $key ] = html_entity_decode((string) $value, ENT_QUOTES, 'UTF-8');
312
+			}
313
+		}
314
+		return '/* <![CDATA[ */ var eei18n = ' . wp_json_encode($i18n_js_strings) . '; /* ]]> */';
315
+	}
316
+
317
+
318
+	/**
319
+	 * @param mixed string | EED_Module $module
320
+	 * @throws OutOfBoundsException
321
+	 * @throws InvalidArgumentException
322
+	 * @throws InvalidInterfaceException
323
+	 * @throws InvalidDataTypeException
324
+	 * @throws EE_Error
325
+	 * @throws ReflectionException
326
+	 */
327
+	public function add_module($module)
328
+	{
329
+		if ($module instanceof EED_Module) {
330
+			$module_class = get_class($module);
331
+			$this->modules->{$module_class} = $module;
332
+		} else {
333
+			if (! class_exists('EE_Module_Request_Router', false)) {
334
+				$this->load_core('Module_Request_Router');
335
+			}
336
+			EE_Module_Request_Router::module_factory($module);
337
+		}
338
+	}
339
+
340
+
341
+	/**
342
+	 * @param string $module_name
343
+	 * @return mixed EED_Module | NULL
344
+	 */
345
+	public function get_module($module_name = '')
346
+	{
347
+		return isset($this->modules->{$module_name})
348
+			? $this->modules->{$module_name}
349
+			: null;
350
+	}
351
+
352
+
353
+	/**
354
+	 * loads core classes - must be singletons
355
+	 *
356
+	 * @param string $class_name - simple class name ie: session
357
+	 * @param mixed  $arguments
358
+	 * @param bool   $load_only
359
+	 * @return mixed
360
+	 * @throws InvalidInterfaceException
361
+	 * @throws InvalidDataTypeException
362
+	 * @throws EE_Error
363
+	 * @throws ReflectionException
364
+	 * @throws InvalidArgumentException
365
+	 */
366
+	public function load_core($class_name, $arguments = array(), $load_only = false)
367
+	{
368
+		$core_paths = apply_filters(
369
+			'FHEE__EE_Registry__load_core__core_paths',
370
+			array(
371
+				EE_CORE,
372
+				EE_ADMIN,
373
+				EE_CPTS,
374
+				EE_CORE . 'data_migration_scripts' . DS,
375
+				EE_CORE . 'capabilities' . DS,
376
+				EE_CORE . 'request_stack' . DS,
377
+				EE_CORE . 'middleware' . DS,
378
+			)
379
+		);
380
+		// retrieve instantiated class
381
+		return $this->_load(
382
+			$core_paths,
383
+			'EE_',
384
+			$class_name,
385
+			'core',
386
+			$arguments,
387
+			false,
388
+			true,
389
+			$load_only
390
+		);
391
+	}
392
+
393
+
394
+	/**
395
+	 * loads service classes
396
+	 *
397
+	 * @param string $class_name - simple class name ie: session
398
+	 * @param mixed  $arguments
399
+	 * @param bool   $load_only
400
+	 * @return mixed
401
+	 * @throws InvalidInterfaceException
402
+	 * @throws InvalidDataTypeException
403
+	 * @throws EE_Error
404
+	 * @throws ReflectionException
405
+	 * @throws InvalidArgumentException
406
+	 */
407
+	public function load_service($class_name, $arguments = array(), $load_only = false)
408
+	{
409
+		$service_paths = apply_filters(
410
+			'FHEE__EE_Registry__load_service__service_paths',
411
+			array(
412
+				EE_CORE . 'services' . DS,
413
+			)
414
+		);
415
+		// retrieve instantiated class
416
+		return $this->_load(
417
+			$service_paths,
418
+			'EE_',
419
+			$class_name,
420
+			'class',
421
+			$arguments,
422
+			false,
423
+			true,
424
+			$load_only
425
+		);
426
+	}
427
+
428
+
429
+	/**
430
+	 * loads data_migration_scripts
431
+	 *
432
+	 * @param string $class_name - class name for the DMS ie: EE_DMS_Core_4_2_0
433
+	 * @param mixed  $arguments
434
+	 * @return EE_Data_Migration_Script_Base|mixed
435
+	 * @throws InvalidInterfaceException
436
+	 * @throws InvalidDataTypeException
437
+	 * @throws EE_Error
438
+	 * @throws ReflectionException
439
+	 * @throws InvalidArgumentException
440
+	 */
441
+	public function load_dms($class_name, $arguments = array())
442
+	{
443
+		// retrieve instantiated class
444
+		return $this->_load(
445
+			EE_Data_Migration_Manager::instance()->get_data_migration_script_folders(),
446
+			'EE_DMS_',
447
+			$class_name,
448
+			'dms',
449
+			$arguments,
450
+			false,
451
+			false
452
+		);
453
+	}
454
+
455
+
456
+	/**
457
+	 * loads object creating classes - must be singletons
458
+	 *
459
+	 * @param string $class_name - simple class name ie: attendee
460
+	 * @param mixed  $arguments  - an array of arguments to pass to the class
461
+	 * @param bool   $from_db    - some classes are instantiated from the db and thus call a different method to
462
+	 *                           instantiate
463
+	 * @param bool   $cache      if you don't want the class to be stored in the internal cache (non-persistent) then
464
+	 *                           set this to FALSE (ie. when instantiating model objects from client in a loop)
465
+	 * @param bool   $load_only  whether or not to just load the file and NOT instantiate, or load AND instantiate
466
+	 *                           (default)
467
+	 * @return EE_Base_Class | bool
468
+	 * @throws InvalidInterfaceException
469
+	 * @throws InvalidDataTypeException
470
+	 * @throws EE_Error
471
+	 * @throws ReflectionException
472
+	 * @throws InvalidArgumentException
473
+	 */
474
+	public function load_class($class_name, $arguments = array(), $from_db = false, $cache = true, $load_only = false)
475
+	{
476
+		$paths = apply_filters(
477
+			'FHEE__EE_Registry__load_class__paths',
478
+			array(
479
+				EE_CORE,
480
+				EE_CLASSES,
481
+				EE_BUSINESS,
482
+			)
483
+		);
484
+		// retrieve instantiated class
485
+		return $this->_load(
486
+			$paths,
487
+			'EE_',
488
+			$class_name,
489
+			'class',
490
+			$arguments,
491
+			$from_db,
492
+			$cache,
493
+			$load_only
494
+		);
495
+	}
496
+
497
+
498
+	/**
499
+	 * loads helper classes - must be singletons
500
+	 *
501
+	 * @param string $class_name - simple class name ie: price
502
+	 * @param mixed  $arguments
503
+	 * @param bool   $load_only
504
+	 * @return EEH_Base | bool
505
+	 * @throws InvalidInterfaceException
506
+	 * @throws InvalidDataTypeException
507
+	 * @throws EE_Error
508
+	 * @throws ReflectionException
509
+	 * @throws InvalidArgumentException
510
+	 */
511
+	public function load_helper($class_name, $arguments = array(), $load_only = true)
512
+	{
513
+		// todo: add doing_it_wrong() in a few versions after all addons have had calls to this method removed
514
+		$helper_paths = apply_filters('FHEE__EE_Registry__load_helper__helper_paths', array(EE_HELPERS));
515
+		// retrieve instantiated class
516
+		return $this->_load(
517
+			$helper_paths,
518
+			'EEH_',
519
+			$class_name,
520
+			'helper',
521
+			$arguments,
522
+			false,
523
+			true,
524
+			$load_only
525
+		);
526
+	}
527
+
528
+
529
+	/**
530
+	 * loads core classes - must be singletons
531
+	 *
532
+	 * @param string $class_name - simple class name ie: session
533
+	 * @param mixed  $arguments
534
+	 * @param bool   $load_only
535
+	 * @param bool   $cache      whether to cache the object or not.
536
+	 * @return mixed
537
+	 * @throws InvalidInterfaceException
538
+	 * @throws InvalidDataTypeException
539
+	 * @throws EE_Error
540
+	 * @throws ReflectionException
541
+	 * @throws InvalidArgumentException
542
+	 */
543
+	public function load_lib($class_name, $arguments = array(), $load_only = false, $cache = true)
544
+	{
545
+		$paths = array(
546
+			EE_LIBRARIES,
547
+			EE_LIBRARIES . 'messages' . DS,
548
+			EE_LIBRARIES . 'shortcodes' . DS,
549
+			EE_LIBRARIES . 'qtips' . DS,
550
+			EE_LIBRARIES . 'payment_methods' . DS,
551
+		);
552
+		// retrieve instantiated class
553
+		return $this->_load(
554
+			$paths,
555
+			'EE_',
556
+			$class_name,
557
+			'lib',
558
+			$arguments,
559
+			false,
560
+			$cache,
561
+			$load_only
562
+		);
563
+	}
564
+
565
+
566
+	/**
567
+	 * loads model classes - must be singletons
568
+	 *
569
+	 * @param string $class_name - simple class name ie: price
570
+	 * @param mixed  $arguments
571
+	 * @param bool   $load_only
572
+	 * @return EEM_Base | bool
573
+	 * @throws InvalidInterfaceException
574
+	 * @throws InvalidDataTypeException
575
+	 * @throws EE_Error
576
+	 * @throws ReflectionException
577
+	 * @throws InvalidArgumentException
578
+	 */
579
+	public function load_model($class_name, $arguments = array(), $load_only = false)
580
+	{
581
+		$paths = apply_filters(
582
+			'FHEE__EE_Registry__load_model__paths',
583
+			array(
584
+				EE_MODELS,
585
+				EE_CORE,
586
+			)
587
+		);
588
+		// retrieve instantiated class
589
+		return $this->_load(
590
+			$paths,
591
+			'EEM_',
592
+			$class_name,
593
+			'model',
594
+			$arguments,
595
+			false,
596
+			true,
597
+			$load_only
598
+		);
599
+	}
600
+
601
+
602
+	/**
603
+	 * loads model classes - must be singletons
604
+	 *
605
+	 * @param string $class_name - simple class name ie: price
606
+	 * @param mixed  $arguments
607
+	 * @param bool   $load_only
608
+	 * @return mixed | bool
609
+	 * @throws InvalidInterfaceException
610
+	 * @throws InvalidDataTypeException
611
+	 * @throws EE_Error
612
+	 * @throws ReflectionException
613
+	 * @throws InvalidArgumentException
614
+	 */
615
+	public function load_model_class($class_name, $arguments = array(), $load_only = true)
616
+	{
617
+		$paths = array(
618
+			EE_MODELS . 'fields' . DS,
619
+			EE_MODELS . 'helpers' . DS,
620
+			EE_MODELS . 'relations' . DS,
621
+			EE_MODELS . 'strategies' . DS,
622
+		);
623
+		// retrieve instantiated class
624
+		return $this->_load(
625
+			$paths,
626
+			'EE_',
627
+			$class_name,
628
+			'',
629
+			$arguments,
630
+			false,
631
+			true,
632
+			$load_only
633
+		);
634
+	}
635
+
636
+
637
+	/**
638
+	 * Determines if $model_name is the name of an actual EE model.
639
+	 *
640
+	 * @param string $model_name like Event, Attendee, Question_Group_Question, etc.
641
+	 * @return boolean
642
+	 */
643
+	public function is_model_name($model_name)
644
+	{
645
+		return isset($this->models[ $model_name ]);
646
+	}
647
+
648
+
649
+	/**
650
+	 * generic class loader
651
+	 *
652
+	 * @param string $path_to_file - directory path to file location, not including filename
653
+	 * @param string $file_name    - file name  ie:  my_file.php, including extension
654
+	 * @param string $type         - file type - core? class? helper? model?
655
+	 * @param mixed  $arguments
656
+	 * @param bool   $load_only
657
+	 * @return mixed
658
+	 * @throws InvalidInterfaceException
659
+	 * @throws InvalidDataTypeException
660
+	 * @throws EE_Error
661
+	 * @throws ReflectionException
662
+	 * @throws InvalidArgumentException
663
+	 */
664
+	public function load_file($path_to_file, $file_name, $type = '', $arguments = array(), $load_only = true)
665
+	{
666
+		// retrieve instantiated class
667
+		return $this->_load(
668
+			$path_to_file,
669
+			'',
670
+			$file_name,
671
+			$type,
672
+			$arguments,
673
+			false,
674
+			true,
675
+			$load_only
676
+		);
677
+	}
678
+
679
+
680
+	/**
681
+	 * @param string $path_to_file - directory path to file location, not including filename
682
+	 * @param string $class_name   - full class name  ie:  My_Class
683
+	 * @param string $type         - file type - core? class? helper? model?
684
+	 * @param mixed  $arguments
685
+	 * @param bool   $load_only
686
+	 * @return bool|EE_Addon|object
687
+	 * @throws InvalidInterfaceException
688
+	 * @throws InvalidDataTypeException
689
+	 * @throws EE_Error
690
+	 * @throws ReflectionException
691
+	 * @throws InvalidArgumentException
692
+	 */
693
+	public function load_addon($path_to_file, $class_name, $type = 'class', $arguments = array(), $load_only = false)
694
+	{
695
+		// retrieve instantiated class
696
+		return $this->_load(
697
+			$path_to_file,
698
+			'addon',
699
+			$class_name,
700
+			$type,
701
+			$arguments,
702
+			false,
703
+			true,
704
+			$load_only
705
+		);
706
+	}
707
+
708
+
709
+	/**
710
+	 * instantiates, caches, and automatically resolves dependencies
711
+	 * for classes that use a Fully Qualified Class Name.
712
+	 * if the class is not capable of being loaded using PSR-4 autoloading,
713
+	 * then you need to use one of the existing load_*() methods
714
+	 * which can resolve the classname and filepath from the passed arguments
715
+	 *
716
+	 * @param bool|string $class_name   Fully Qualified Class Name
717
+	 * @param array       $arguments    an argument, or array of arguments to pass to the class upon instantiation
718
+	 * @param bool        $cache        whether to cache the instantiated object for reuse
719
+	 * @param bool        $from_db      some classes are instantiated from the db
720
+	 *                                  and thus call a different method to instantiate
721
+	 * @param bool        $load_only    if true, will only load the file, but will NOT instantiate an object
722
+	 * @param bool|string $addon        if true, will cache the object in the EE_Registry->$addons array
723
+	 * @return bool|null|mixed          null = failure to load or instantiate class object.
724
+	 *                                  object = class loaded and instantiated successfully.
725
+	 *                                  bool = fail or success when $load_only is true
726
+	 * @throws InvalidInterfaceException
727
+	 * @throws InvalidDataTypeException
728
+	 * @throws EE_Error
729
+	 * @throws ReflectionException
730
+	 * @throws InvalidArgumentException
731
+	 */
732
+	public function create(
733
+		$class_name = false,
734
+		$arguments = array(),
735
+		$cache = false,
736
+		$from_db = false,
737
+		$load_only = false,
738
+		$addon = false
739
+	) {
740
+		$class_name = ltrim($class_name, '\\');
741
+		$class_name = $this->class_cache->getFqnForAlias($class_name);
742
+		$class_exists = $this->loadOrVerifyClassExists($class_name, $arguments);
743
+		// if a non-FQCN was passed, then
744
+		// verifyClassExists() might return an object
745
+		// or it could return null if the class just could not be found anywhere
746
+		if ($class_exists instanceof $class_name || $class_exists === null) {
747
+			// either way, return the results
748
+			return $class_exists;
749
+		}
750
+		$class_name = $class_exists;
751
+		// if we're only loading the class and it already exists, then let's just return true immediately
752
+		if ($load_only) {
753
+			return true;
754
+		}
755
+		$addon = $addon ? 'addon' : '';
756
+		// $this->_cache_on is toggled during the recursive loading that can occur with dependency injection
757
+		// $cache is controlled by individual calls to separate Registry loader methods like load_class()
758
+		// $load_only is also controlled by individual calls to separate Registry loader methods like load_file()
759
+		if ($this->_cache_on && $cache && ! $load_only) {
760
+			// return object if it's already cached
761
+			$cached_class = $this->_get_cached_class($class_name, $addon, $arguments);
762
+			if ($cached_class !== null) {
763
+				return $cached_class;
764
+			}
765
+		}// obtain the loader method from the dependency map
766
+		$loader = $this->_dependency_map->class_loader($class_name);// instantiate the requested object
767
+		if ($loader instanceof Closure) {
768
+			$class_obj = $loader($arguments);
769
+		} else {
770
+			if ($loader && method_exists($this, $loader)) {
771
+				$class_obj = $this->{$loader}($class_name, $arguments);
772
+			} else {
773
+				$class_obj = $this->_create_object($class_name, $arguments, $addon, $from_db);
774
+			}
775
+		}
776
+		if (($this->_cache_on && $cache) || $this->get_class_abbreviation($class_name, '')) {
777
+			// save it for later... kinda like gum  { : $
778
+			$this->_set_cached_class(
779
+				$class_obj,
780
+				$class_name,
781
+				$addon,
782
+				$from_db,
783
+				$arguments
784
+			);
785
+		}
786
+		$this->_cache_on = true;
787
+		return $class_obj;
788
+	}
789
+
790
+
791
+	/**
792
+	 * Recursively checks that a class exists and potentially attempts to load classes with non-FQCNs
793
+	 *
794
+	 * @param string|object $class_name
795
+	 * @param array         $arguments
796
+	 * @param int           $attempt
797
+	 * @return mixed
798
+	 */
799
+	private function loadOrVerifyClassExists($class_name, array $arguments, $attempt = 1)
800
+	{
801
+		if (is_object($class_name) || class_exists($class_name)) {
802
+			return $class_name;
803
+		}
804
+		switch ($attempt) {
805
+			case 1:
806
+				// if it's a FQCN then maybe the class is registered with a preceding \
807
+				$class_name = strpos($class_name, '\\') !== false
808
+					? '\\' . ltrim($class_name, '\\')
809
+					: $class_name;
810
+				break;
811
+			case 2:
812
+				//
813
+				$loader = $this->_dependency_map->class_loader($class_name);
814
+				if ($loader && method_exists($this, $loader)) {
815
+					return $this->{$loader}($class_name, $arguments);
816
+				}
817
+				break;
818
+			case 3:
819
+			default:
820
+				return null;
821
+		}
822
+		$attempt++;
823
+		return $this->loadOrVerifyClassExists($class_name, $arguments, $attempt);
824
+	}
825
+
826
+
827
+	/**
828
+	 * instantiates, caches, and injects dependencies for classes
829
+	 *
830
+	 * @param array       $file_paths   an array of paths to folders to look in
831
+	 * @param string      $class_prefix EE  or EEM or... ???
832
+	 * @param bool|string $class_name   $class name
833
+	 * @param string      $type         file type - core? class? helper? model?
834
+	 * @param mixed       $arguments    an argument or array of arguments to pass to the class upon instantiation
835
+	 * @param bool        $from_db      some classes are instantiated from the db
836
+	 *                                  and thus call a different method to instantiate
837
+	 * @param bool        $cache        whether to cache the instantiated object for reuse
838
+	 * @param bool        $load_only    if true, will only load the file, but will NOT instantiate an object
839
+	 * @return bool|null|object null = failure to load or instantiate class object.
840
+	 *                                  object = class loaded and instantiated successfully.
841
+	 *                                  bool = fail or success when $load_only is true
842
+	 * @throws EE_Error
843
+	 * @throws ReflectionException
844
+	 * @throws InvalidInterfaceException
845
+	 * @throws InvalidDataTypeException
846
+	 * @throws InvalidArgumentException
847
+	 */
848
+	protected function _load(
849
+		$file_paths = array(),
850
+		$class_prefix = 'EE_',
851
+		$class_name = false,
852
+		$type = 'class',
853
+		$arguments = array(),
854
+		$from_db = false,
855
+		$cache = true,
856
+		$load_only = false
857
+	) {
858
+		$class_name = ltrim($class_name, '\\');
859
+		// strip php file extension
860
+		$class_name = str_replace('.php', '', trim($class_name));
861
+		// does the class have a prefix ?
862
+		if (! empty($class_prefix) && $class_prefix !== 'addon') {
863
+			// make sure $class_prefix is uppercase
864
+			$class_prefix = strtoupper(trim($class_prefix));
865
+			// add class prefix ONCE!!!
866
+			$class_name = $class_prefix . str_replace($class_prefix, '', $class_name);
867
+		}
868
+		$class_name = $this->class_cache->getFqnForAlias($class_name);
869
+		$class_exists = class_exists($class_name, false);
870
+		// if we're only loading the class and it already exists, then let's just return true immediately
871
+		if ($load_only && $class_exists) {
872
+			return true;
873
+		}
874
+		$arguments = is_array($arguments) ? $arguments : array($arguments);
875
+		// $this->_cache_on is toggled during the recursive loading that can occur with dependency injection
876
+		// $cache is controlled by individual calls to separate Registry loader methods like load_class()
877
+		// $load_only is also controlled by individual calls to separate Registry loader methods like load_file()
878
+		if ($this->_cache_on && $cache && ! $load_only) {
879
+			// return object if it's already cached
880
+			$cached_class = $this->_get_cached_class($class_name, $class_prefix, $arguments);
881
+			if ($cached_class !== null) {
882
+				return $cached_class;
883
+			}
884
+		}
885
+		// if the class doesn't already exist.. then we need to try and find the file and load it
886
+		if (! $class_exists) {
887
+			// get full path to file
888
+			$path = $this->_resolve_path($class_name, $type, $file_paths);
889
+			// load the file
890
+			$loaded = $this->_require_file($path, $class_name, $type, $file_paths);
891
+			// if we are only loading a file but NOT instantiating an object
892
+			// then return boolean for whether class was loaded or not
893
+			if ($load_only) {
894
+				return $loaded;
895
+			}
896
+			// if an object was expected but loading failed, then return nothing
897
+			if (! $loaded) {
898
+				return null;
899
+			}
900
+		}
901
+		// instantiate the requested object
902
+		$class_obj = $this->_create_object($class_name, $arguments, $type, $from_db);
903
+		if ($this->_cache_on && $cache) {
904
+			// save it for later... kinda like gum  { : $
905
+			$this->_set_cached_class(
906
+				$class_obj,
907
+				$class_name,
908
+				$class_prefix,
909
+				$from_db,
910
+				$arguments
911
+			);
912
+		}
913
+		$this->_cache_on = true;
914
+		return $class_obj;
915
+	}
916
+
917
+
918
+	/**
919
+	 * @param string $class_name
920
+	 * @param string $default have to specify something, but not anything that will conflict
921
+	 * @return mixed|string
922
+	 */
923
+	protected function get_class_abbreviation($class_name, $default = 'FANCY_BATMAN_PANTS')
924
+	{
925
+		return isset($this->_class_abbreviations[ $class_name ])
926
+			? $this->_class_abbreviations[ $class_name ]
927
+			: $default;
928
+	}
929
+
930
+
931
+	/**
932
+	 * attempts to find a cached version of the requested class
933
+	 * by looking in the following places:
934
+	 *        $this->{$class_abbreviation}            ie:    $this->CART
935
+	 *        $this->{$class_name}                        ie:    $this->Some_Class
936
+	 *        $this->LIB->{$class_name}                ie:    $this->LIB->Some_Class
937
+	 *        $this->addon->{$class_name}    ie:    $this->addon->Some_Addon_Class
938
+	 *
939
+	 * @param string $class_name
940
+	 * @param string $class_prefix
941
+	 * @param array  $arguments
942
+	 * @return mixed
943
+	 */
944
+	protected function _get_cached_class(
945
+		$class_name,
946
+		$class_prefix = '',
947
+		$arguments = array()
948
+	) {
949
+		if ($class_name === 'EE_Registry') {
950
+			return $this;
951
+		}
952
+		$class_abbreviation = $this->get_class_abbreviation($class_name);
953
+		// check if class has already been loaded, and return it if it has been
954
+		if (isset($this->{$class_abbreviation})) {
955
+			return $this->{$class_abbreviation};
956
+		}
957
+		$class_name = str_replace('\\', '_', $class_name);
958
+		if (isset($this->{$class_name})) {
959
+			return $this->{$class_name};
960
+		}
961
+		if ($class_prefix === 'addon' && isset($this->addons->{$class_name})) {
962
+			return $this->addons->{$class_name};
963
+		}
964
+		$object_identifier = $this->object_identifier->getIdentifier($class_name, $arguments);
965
+		if (isset($this->LIB->{$object_identifier})) {
966
+			return $this->LIB->{$object_identifier};
967
+		}
968
+		foreach ($this->LIB as $key => $object) {
969
+			if (// request does not contain new arguments and therefore no args identifier
970
+				! $this->object_identifier->hasArguments($object_identifier)
971
+				// but previously cached class with args was found
972
+				&& $this->object_identifier->fqcnMatchesObjectIdentifier($class_name, $key)
973
+			) {
974
+				return $object;
975
+			}
976
+		}
977
+		return null;
978
+	}
979
+
980
+
981
+	/**
982
+	 * removes a cached version of the requested class
983
+	 *
984
+	 * @param string  $class_name
985
+	 * @param boolean $addon
986
+	 * @param array   $arguments
987
+	 * @return boolean
988
+	 */
989
+	public function clear_cached_class(
990
+		$class_name,
991
+		$addon = false,
992
+		$arguments = array()
993
+	) {
994
+		$class_abbreviation = $this->get_class_abbreviation($class_name);
995
+		// check if class has already been loaded, and return it if it has been
996
+		if (isset($this->{$class_abbreviation})) {
997
+			$this->{$class_abbreviation} = null;
998
+			return true;
999
+		}
1000
+		$class_name = str_replace('\\', '_', $class_name);
1001
+		if (isset($this->{$class_name})) {
1002
+			$this->{$class_name} = null;
1003
+			return true;
1004
+		}
1005
+		if ($addon && isset($this->addons->{$class_name})) {
1006
+			unset($this->addons->{$class_name});
1007
+			return true;
1008
+		}
1009
+		$class_name = $this->object_identifier->getIdentifier($class_name, $arguments);
1010
+		if (isset($this->LIB->{$class_name})) {
1011
+			unset($this->LIB->{$class_name});
1012
+			return true;
1013
+		}
1014
+		return false;
1015
+	}
1016
+
1017
+
1018
+	/**
1019
+	 * _set_cached_class
1020
+	 * attempts to cache the instantiated class locally
1021
+	 * in one of the following places, in the following order:
1022
+	 *        $this->{class_abbreviation}   ie:    $this->CART
1023
+	 *        $this->{$class_name}          ie:    $this->Some_Class
1024
+	 *        $this->addon->{$$class_name}    ie:    $this->addon->Some_Addon_Class
1025
+	 *        $this->LIB->{$class_name}     ie:    $this->LIB->Some_Class
1026
+	 *
1027
+	 * @param object $class_obj
1028
+	 * @param string $class_name
1029
+	 * @param string $class_prefix
1030
+	 * @param bool   $from_db
1031
+	 * @param array  $arguments
1032
+	 * @return void
1033
+	 */
1034
+	protected function _set_cached_class(
1035
+		$class_obj,
1036
+		$class_name,
1037
+		$class_prefix = '',
1038
+		$from_db = false,
1039
+		$arguments = array()
1040
+	) {
1041
+		if ($class_name === 'EE_Registry' || empty($class_obj)) {
1042
+			return;
1043
+		}
1044
+		// return newly instantiated class
1045
+		$class_abbreviation = $this->get_class_abbreviation($class_name, '');
1046
+		if ($class_abbreviation) {
1047
+			$this->{$class_abbreviation} = $class_obj;
1048
+			return;
1049
+		}
1050
+		$class_name = str_replace('\\', '_', $class_name);
1051
+		if (property_exists($this, $class_name)) {
1052
+			$this->{$class_name} = $class_obj;
1053
+			return;
1054
+		}
1055
+		if ($class_prefix === 'addon') {
1056
+			$this->addons->{$class_name} = $class_obj;
1057
+			return;
1058
+		}
1059
+		if (! $from_db) {
1060
+			$class_name = $this->object_identifier->getIdentifier($class_name, $arguments);
1061
+			$this->LIB->{$class_name} = $class_obj;
1062
+		}
1063
+	}
1064
+
1065
+
1066
+	/**
1067
+	 * attempts to find a full valid filepath for the requested class.
1068
+	 * loops thru each of the base paths in the $file_paths array and appends : "{classname} . {file type} . php"
1069
+	 * then returns that path if the target file has been found and is readable
1070
+	 *
1071
+	 * @param string $class_name
1072
+	 * @param string $type
1073
+	 * @param array  $file_paths
1074
+	 * @return string | bool
1075
+	 */
1076
+	protected function _resolve_path($class_name, $type = '', $file_paths = array())
1077
+	{
1078
+		// make sure $file_paths is an array
1079
+		$file_paths = is_array($file_paths)
1080
+			? $file_paths
1081
+			: array($file_paths);
1082
+		// cycle thru paths
1083
+		foreach ($file_paths as $key => $file_path) {
1084
+			// convert all separators to proper DS, if no filepath, then use EE_CLASSES
1085
+			$file_path = $file_path
1086
+				? str_replace(array('/', '\\'), DS, $file_path)
1087
+				: EE_CLASSES;
1088
+			// prep file type
1089
+			$type = ! empty($type)
1090
+				? trim($type, '.') . '.'
1091
+				: '';
1092
+			// build full file path
1093
+			$file_paths[ $key ] = rtrim($file_path, DS) . DS . $class_name . '.' . $type . 'php';
1094
+			// does the file exist and can be read ?
1095
+			if (is_readable($file_paths[ $key ])) {
1096
+				return $file_paths[ $key ];
1097
+			}
1098
+		}
1099
+		return false;
1100
+	}
1101
+
1102
+
1103
+	/**
1104
+	 * basically just performs a require_once()
1105
+	 * but with some error handling
1106
+	 *
1107
+	 * @param  string $path
1108
+	 * @param  string $class_name
1109
+	 * @param  string $type
1110
+	 * @param  array  $file_paths
1111
+	 * @return bool
1112
+	 * @throws EE_Error
1113
+	 * @throws ReflectionException
1114
+	 */
1115
+	protected function _require_file($path, $class_name, $type = '', $file_paths = array())
1116
+	{
1117
+		$this->resolve_legacy_class_parent($class_name);
1118
+		// don't give up! you gotta...
1119
+		try {
1120
+			// does the file exist and can it be read ?
1121
+			if (! $path) {
1122
+				// just in case the file has already been autoloaded,
1123
+				// but discrepancies in the naming schema are preventing it from
1124
+				// being loaded via one of the EE_Registry::load_*() methods,
1125
+				// then let's try one last hail mary before throwing an exception
1126
+				// and call class_exists() again, but with autoloading turned ON
1127
+				if (class_exists($class_name)) {
1128
+					return true;
1129
+				}
1130
+				// so sorry, can't find the file
1131
+				throw new EE_Error(
1132
+					sprintf(
1133
+						esc_html__(
1134
+							'The %1$s file %2$s could not be located or is not readable due to file permissions. Please ensure that the following filepath(s) are correct: %3$s',
1135
+							'event_espresso'
1136
+						),
1137
+						trim($type, '.'),
1138
+						$class_name,
1139
+						'<br />' . implode(',<br />', $file_paths)
1140
+					)
1141
+				);
1142
+			}
1143
+			// get the file
1144
+			require_once($path);
1145
+			// if the class isn't already declared somewhere
1146
+			if (class_exists($class_name, false) === false) {
1147
+				// so sorry, not a class
1148
+				throw new EE_Error(
1149
+					sprintf(
1150
+						esc_html__(
1151
+							'The %s file %s does not appear to contain the %s Class.',
1152
+							'event_espresso'
1153
+						),
1154
+						$type,
1155
+						$path,
1156
+						$class_name
1157
+					)
1158
+				);
1159
+			}
1160
+		} catch (EE_Error $e) {
1161
+			$e->get_error();
1162
+			return false;
1163
+		}
1164
+		return true;
1165
+	}
1166
+
1167
+
1168
+	/**
1169
+	 * Some of our legacy classes that extended a parent class would simply use a require() statement
1170
+	 * before their class declaration in order to ensure that the parent class was loaded.
1171
+	 * This is not ideal, but it's nearly impossible to determine the parent class of a non-namespaced class,
1172
+	 * without triggering a fatal error because the parent class has yet to be loaded and therefore doesn't exist.
1173
+	 *
1174
+	 * @param string $class_name
1175
+	 */
1176
+	protected function resolve_legacy_class_parent($class_name = '')
1177
+	{
1178
+		try {
1179
+			$legacy_parent_class_map = array(
1180
+				'EE_Payment_Processor' => 'core/business/EE_Processor_Base.class.php',
1181
+			);
1182
+			if (isset($legacy_parent_class_map[ $class_name ])) {
1183
+				require_once EE_PLUGIN_DIR_PATH . $legacy_parent_class_map[ $class_name ];
1184
+			}
1185
+		} catch (Exception $exception) {
1186
+		}
1187
+	}
1188
+
1189
+
1190
+	/**
1191
+	 * _create_object
1192
+	 * Attempts to instantiate the requested class via any of the
1193
+	 * commonly used instantiation methods employed throughout EE.
1194
+	 * The priority for instantiation is as follows:
1195
+	 *        - abstract classes or any class flagged as "load only" (no instantiation occurs)
1196
+	 *        - model objects via their 'new_instance_from_db' method
1197
+	 *        - model objects via their 'new_instance' method
1198
+	 *        - "singleton" classes" via their 'instance' method
1199
+	 *    - standard instantiable classes via their __constructor
1200
+	 * Prior to instantiation, if the classname exists in the dependency_map,
1201
+	 * then the constructor for the requested class will be examined to determine
1202
+	 * if any dependencies exist, and if they can be injected.
1203
+	 * If so, then those classes will be added to the array of arguments passed to the constructor
1204
+	 *
1205
+	 * @param string $class_name
1206
+	 * @param array  $arguments
1207
+	 * @param string $type
1208
+	 * @param bool   $from_db
1209
+	 * @return null|object|bool
1210
+	 * @throws InvalidArgumentException
1211
+	 * @throws InvalidInterfaceException
1212
+	 * @throws EE_Error
1213
+	 * @throws ReflectionException
1214
+	 * @throws InvalidDataTypeException
1215
+	 */
1216
+	protected function _create_object($class_name, $arguments = array(), $type = '', $from_db = false)
1217
+	{
1218
+		// create reflection
1219
+		$reflector = $this->mirror->getReflectionClass($class_name);
1220
+		// make sure arguments are an array
1221
+		$arguments = is_array($arguments)
1222
+			? $arguments
1223
+			: array($arguments);
1224
+		// and if arguments array is numerically and sequentially indexed, then we want it to remain as is,
1225
+		// else wrap it in an additional array so that it doesn't get split into multiple parameters
1226
+		$arguments = $this->_array_is_numerically_and_sequentially_indexed($arguments)
1227
+			? $arguments
1228
+			: array($arguments);
1229
+		// attempt to inject dependencies ?
1230
+		if ($this->_dependency_map->has($class_name)) {
1231
+			$arguments = $this->_resolve_dependencies($reflector, $class_name, $arguments);
1232
+		}
1233
+		// instantiate the class if possible
1234
+		if ($reflector->isAbstract()) {
1235
+			// nothing to instantiate, loading file was enough
1236
+			// does not throw an exception so $instantiation_mode is unused
1237
+			// $instantiation_mode = "1) no constructor abstract class";
1238
+			return true;
1239
+		}
1240
+		if (empty($arguments)
1241
+			&& $this->mirror->getConstructorFromReflection($reflector) === null
1242
+			&& $reflector->isInstantiable()
1243
+		) {
1244
+			// no constructor = static methods only... nothing to instantiate, loading file was enough
1245
+			// $instantiation_mode = "2) no constructor but instantiable";
1246
+			return $reflector->newInstance();
1247
+		}
1248
+		if ($from_db && method_exists($class_name, 'new_instance_from_db')) {
1249
+			// $instantiation_mode = "3) new_instance_from_db()";
1250
+			return call_user_func_array(array($class_name, 'new_instance_from_db'), $arguments);
1251
+		}
1252
+		if (method_exists($class_name, 'new_instance')) {
1253
+			// $instantiation_mode = "4) new_instance()";
1254
+			return call_user_func_array(array($class_name, 'new_instance'), $arguments);
1255
+		}
1256
+		if (method_exists($class_name, 'instance')) {
1257
+			// $instantiation_mode = "5) instance()";
1258
+			return call_user_func_array(array($class_name, 'instance'), $arguments);
1259
+		}
1260
+		if ($reflector->isInstantiable()) {
1261
+			// $instantiation_mode = "6) constructor";
1262
+			return $reflector->newInstanceArgs($arguments);
1263
+		}
1264
+		// heh ? something's not right !
1265
+		throw new EE_Error(
1266
+			sprintf(
1267
+				__('The %s file %s could not be instantiated.', 'event_espresso'),
1268
+				$type,
1269
+				$class_name
1270
+			)
1271
+		);
1272
+	}
1273
+
1274
+
1275
+	/**
1276
+	 * @see http://stackoverflow.com/questions/173400/how-to-check-if-php-array-is-associative-or-sequential
1277
+	 * @param array $array
1278
+	 * @return bool
1279
+	 */
1280
+	protected function _array_is_numerically_and_sequentially_indexed(array $array)
1281
+	{
1282
+		return ! empty($array)
1283
+			? array_keys($array) === range(0, count($array) - 1)
1284
+			: true;
1285
+	}
1286
+
1287
+
1288
+	/**
1289
+	 * _resolve_dependencies
1290
+	 * examines the constructor for the requested class to determine
1291
+	 * if any dependencies exist, and if they can be injected.
1292
+	 * If so, then those classes will be added to the array of arguments passed to the constructor
1293
+	 * PLZ NOTE: this is achieved by type hinting the constructor params
1294
+	 * For example:
1295
+	 *        if attempting to load a class "Foo" with the following constructor:
1296
+	 *        __construct( Bar $bar_class, Fighter $grohl_class )
1297
+	 *        then $bar_class and $grohl_class will be added to the $arguments array,
1298
+	 *        but only IF they are NOT already present in the incoming arguments array,
1299
+	 *        and the correct classes can be loaded
1300
+	 *
1301
+	 * @param ReflectionClass $reflector
1302
+	 * @param string          $class_name
1303
+	 * @param array           $arguments
1304
+	 * @return array
1305
+	 * @throws InvalidArgumentException
1306
+	 * @throws InvalidDataTypeException
1307
+	 * @throws InvalidInterfaceException
1308
+	 * @throws ReflectionException
1309
+	 */
1310
+	protected function _resolve_dependencies(ReflectionClass $reflector, $class_name, array $arguments = array())
1311
+	{
1312
+		// let's examine the constructor
1313
+		$constructor = $this->mirror->getConstructorFromReflection($reflector);
1314
+		// whu? huh? nothing?
1315
+		if (! $constructor) {
1316
+			return $arguments;
1317
+		}
1318
+		// get constructor parameters
1319
+		$params = $this->mirror->getParametersFromReflection($reflector);
1320
+		// and the keys for the incoming arguments array so that we can compare existing arguments with what is expected
1321
+		$argument_keys = array_keys($arguments);
1322
+		// now loop thru all of the constructors expected parameters
1323
+		foreach ($params as $index => $param) {
1324
+			// is this a dependency for a specific class ?
1325
+			$param_class = $this->mirror->getParameterClassName($param, $class_name, $index);
1326
+			// BUT WAIT !!! This class may be an alias for something else (or getting replaced at runtime)
1327
+			$param_class = $this->class_cache->isAlias($param_class, $class_name)
1328
+				? $this->class_cache->getFqnForAlias($param_class, $class_name)
1329
+				: $param_class;
1330
+			if (// param is not even a class
1331
+				$param_class === null
1332
+				// and something already exists in the incoming arguments for this param
1333
+				&& array_key_exists($index, $argument_keys)
1334
+				&& array_key_exists($argument_keys[ $index ], $arguments)
1335
+			) {
1336
+				// so let's skip this argument and move on to the next
1337
+				continue;
1338
+			}
1339
+			if (// parameter is type hinted as a class, exists as an incoming argument, AND it's the correct class
1340
+				$param_class !== null
1341
+				&& isset($argument_keys[ $index ], $arguments[ $argument_keys[ $index ] ])
1342
+				&& $arguments[ $argument_keys[ $index ] ] instanceof $param_class
1343
+			) {
1344
+				// skip this argument and move on to the next
1345
+				continue;
1346
+			}
1347
+			if (// parameter is type hinted as a class, and should be injected
1348
+				$param_class !== null
1349
+				&& $this->_dependency_map->has_dependency_for_class($class_name, $param_class)
1350
+			) {
1351
+				$arguments = $this->_resolve_dependency(
1352
+					$class_name,
1353
+					$param_class,
1354
+					$arguments,
1355
+					$index
1356
+				);
1357
+			} else {
1358
+				$arguments[ $index ] = $this->mirror->getParameterDefaultValue(
1359
+					$param,
1360
+					$class_name,
1361
+					$index
1362
+				);
1363
+			}
1364
+		}
1365
+		return $arguments;
1366
+	}
1367
+
1368
+
1369
+	/**
1370
+	 * @param string $class_name
1371
+	 * @param string $param_class
1372
+	 * @param array  $arguments
1373
+	 * @param mixed  $index
1374
+	 * @return array
1375
+	 * @throws InvalidArgumentException
1376
+	 * @throws InvalidInterfaceException
1377
+	 * @throws InvalidDataTypeException
1378
+	 */
1379
+	protected function _resolve_dependency($class_name, $param_class, $arguments, $index)
1380
+	{
1381
+		$dependency = null;
1382
+		// should dependency be loaded from cache ?
1383
+		$cache_on = $this->_dependency_map->loading_strategy_for_class_dependency(
1384
+			$class_name,
1385
+			$param_class
1386
+		);
1387
+		$cache_on = $cache_on !== EE_Dependency_Map::load_new_object;
1388
+		// we might have a dependency...
1389
+		// let's MAYBE try and find it in our cache if that's what's been requested
1390
+		$cached_class = $cache_on
1391
+			? $this->_get_cached_class($param_class)
1392
+			: null;
1393
+		// and grab it if it exists
1394
+		if ($cached_class instanceof $param_class) {
1395
+			$dependency = $cached_class;
1396
+		} elseif ($param_class !== $class_name) {
1397
+			// obtain the loader method from the dependency map
1398
+			$loader = $this->_dependency_map->class_loader($param_class);
1399
+			// is loader a custom closure ?
1400
+			if ($loader instanceof Closure) {
1401
+				$dependency = $loader($arguments);
1402
+			} else {
1403
+				// set the cache on property for the recursive loading call
1404
+				$this->_cache_on = $cache_on;
1405
+				// if not, then let's try and load it via the registry
1406
+				if ($loader && method_exists($this, $loader)) {
1407
+					$dependency = $this->{$loader}($param_class);
1408
+				} else {
1409
+					$dependency = LoaderFactory::getLoader()->load(
1410
+						$param_class,
1411
+						array(),
1412
+						$cache_on
1413
+					);
1414
+				}
1415
+			}
1416
+		}
1417
+		// did we successfully find the correct dependency ?
1418
+		if ($dependency instanceof $param_class) {
1419
+			// then let's inject it into the incoming array of arguments at the correct location
1420
+			$arguments[ $index ] = $dependency;
1421
+		}
1422
+		return $arguments;
1423
+	}
1424
+
1425
+
1426
+	/**
1427
+	 * call any loader that's been registered in the EE_Dependency_Map::$_class_loaders array
1428
+	 *
1429
+	 * @param string $classname PLEASE NOTE: the class name needs to match what's registered
1430
+	 *                          in the EE_Dependency_Map::$_class_loaders array,
1431
+	 *                          including the class prefix, ie: "EE_", "EEM_", "EEH_", etc
1432
+	 * @param array  $arguments
1433
+	 * @return object
1434
+	 */
1435
+	public static function factory($classname, $arguments = array())
1436
+	{
1437
+		$loader = self::instance()->_dependency_map->class_loader($classname);
1438
+		if ($loader instanceof Closure) {
1439
+			return $loader($arguments);
1440
+		}
1441
+		if (method_exists(self::instance(), $loader)) {
1442
+			return self::instance()->{$loader}($classname, $arguments);
1443
+		}
1444
+		return null;
1445
+	}
1446
+
1447
+
1448
+	/**
1449
+	 * Gets the addon by its class name
1450
+	 *
1451
+	 * @param string $class_name
1452
+	 * @return EE_Addon
1453
+	 */
1454
+	public function getAddon($class_name)
1455
+	{
1456
+		$class_name = str_replace('\\', '_', $class_name);
1457
+		if (isset($this->addons->{$class_name})) {
1458
+			return $this->addons->{$class_name};
1459
+		} else {
1460
+			return null;
1461
+		}
1462
+	}
1463
+
1464
+
1465
+	/**
1466
+	 * removes the addon from the internal cache
1467
+	 *
1468
+	 * @param string $class_name
1469
+	 * @return void
1470
+	 */
1471
+	public function removeAddon($class_name)
1472
+	{
1473
+		$class_name = str_replace('\\', '_', $class_name);
1474
+		unset($this->addons->{$class_name});
1475
+	}
1476
+
1477
+
1478
+	/**
1479
+	 * Gets the addon by its name/slug (not classname. For that, just
1480
+	 * use the get_addon() method above
1481
+	 *
1482
+	 * @param string $name
1483
+	 * @return EE_Addon
1484
+	 */
1485
+	public function get_addon_by_name($name)
1486
+	{
1487
+		foreach ($this->addons as $addon) {
1488
+			if ($addon->name() === $name) {
1489
+				return $addon;
1490
+			}
1491
+		}
1492
+		return null;
1493
+	}
1494
+
1495
+
1496
+	/**
1497
+	 * Gets an array of all the registered addons, where the keys are their names.
1498
+	 * (ie, what each returns for their name() function)
1499
+	 * They're already available on EE_Registry::instance()->addons as properties,
1500
+	 * where each property's name is the addon's classname,
1501
+	 * So if you just want to get the addon by classname,
1502
+	 * OR use the get_addon() method above.
1503
+	 * PLEASE  NOTE:
1504
+	 * addons with Fully Qualified Class Names
1505
+	 * have had the namespace separators converted to underscores,
1506
+	 * so a classname like Fully\Qualified\ClassName
1507
+	 * would have been converted to Fully_Qualified_ClassName
1508
+	 *
1509
+	 * @return EE_Addon[] where the KEYS are the addon's name()
1510
+	 */
1511
+	public function get_addons_by_name()
1512
+	{
1513
+		$addons = array();
1514
+		foreach ($this->addons as $addon) {
1515
+			$addons[ $addon->name() ] = $addon;
1516
+		}
1517
+		return $addons;
1518
+	}
1519
+
1520
+
1521
+	/**
1522
+	 * Resets the specified model's instance AND makes sure EE_Registry doesn't keep
1523
+	 * a stale copy of it around
1524
+	 *
1525
+	 * @param string $model_name
1526
+	 * @return \EEM_Base
1527
+	 * @throws \EE_Error
1528
+	 */
1529
+	public function reset_model($model_name)
1530
+	{
1531
+		$model_class_name = strpos($model_name, 'EEM_') !== 0
1532
+			? "EEM_{$model_name}"
1533
+			: $model_name;
1534
+		if (! isset($this->LIB->{$model_class_name}) || ! $this->LIB->{$model_class_name} instanceof EEM_Base) {
1535
+			return null;
1536
+		}
1537
+		// get that model reset it and make sure we nuke the old reference to it
1538
+		if ($this->LIB->{$model_class_name} instanceof $model_class_name
1539
+			&& is_callable(
1540
+				array($model_class_name, 'reset')
1541
+			)) {
1542
+			$this->LIB->{$model_class_name} = $this->LIB->{$model_class_name}->reset();
1543
+		} else {
1544
+			throw new EE_Error(
1545
+				sprintf(
1546
+					esc_html__('Model %s does not have a method "reset"', 'event_espresso'),
1547
+					$model_name
1548
+				)
1549
+			);
1550
+		}
1551
+		return $this->LIB->{$model_class_name};
1552
+	}
1553
+
1554
+
1555
+	/**
1556
+	 * Resets the registry.
1557
+	 * The criteria for what gets reset is based on what can be shared between sites on the same request when
1558
+	 * switch_to_blog is used in a multisite install.  Here is a list of things that are NOT reset.
1559
+	 * - $_dependency_map
1560
+	 * - $_class_abbreviations
1561
+	 * - $NET_CFG (EE_Network_Config): The config is shared network wide so no need to reset.
1562
+	 * - $REQ:  Still on the same request so no need to change.
1563
+	 * - $CAP: There is no site specific state in the EE_Capability class.
1564
+	 * - $SSN: Although ideally, the session should not be shared between site switches, we can't reset it because only
1565
+	 * one Session can be active in a single request.  Resetting could resolve in "headers already sent" errors.
1566
+	 * - $addons:  In multisite, the state of the addons is something controlled via hooks etc in a normal request.  So
1567
+	 *             for now, we won't reset the addons because it could break calls to an add-ons class/methods in the
1568
+	 *             switch or on the restore.
1569
+	 * - $modules
1570
+	 * - $shortcodes
1571
+	 * - $widgets
1572
+	 *
1573
+	 * @param boolean $hard             [deprecated]
1574
+	 * @param boolean $reinstantiate    whether to create new instances of EE_Registry's singletons too,
1575
+	 *                                  or just reset without re-instantiating (handy to set to FALSE if you're not
1576
+	 *                                  sure if you CAN currently reinstantiate the singletons at the moment)
1577
+	 * @param   bool  $reset_models     Defaults to true.  When false, then the models are not reset.  This is so
1578
+	 *                                  client
1579
+	 *                                  code instead can just change the model context to a different blog id if
1580
+	 *                                  necessary
1581
+	 * @return EE_Registry
1582
+	 * @throws InvalidInterfaceException
1583
+	 * @throws InvalidDataTypeException
1584
+	 * @throws EE_Error
1585
+	 * @throws ReflectionException
1586
+	 * @throws InvalidArgumentException
1587
+	 */
1588
+	public static function reset($hard = false, $reinstantiate = true, $reset_models = true)
1589
+	{
1590
+		$instance = self::instance();
1591
+		$instance->_cache_on = true;
1592
+		// reset some "special" classes
1593
+		EEH_Activation::reset();
1594
+		$hard = apply_filters('FHEE__EE_Registry__reset__hard', $hard);
1595
+		$instance->CFG = EE_Config::reset($hard, $reinstantiate);
1596
+		$instance->CART = null;
1597
+		$instance->MRM = null;
1598
+		$instance->AssetsRegistry = LoaderFactory::getLoader()->getShared(
1599
+			'EventEspresso\core\services\assets\Registry'
1600
+		);
1601
+		// messages reset
1602
+		EED_Messages::reset();
1603
+		// handle of objects cached on LIB
1604
+		foreach (array('LIB', 'modules') as $cache) {
1605
+			foreach ($instance->{$cache} as $class_name => $class) {
1606
+				if (self::_reset_and_unset_object($class, $reset_models)) {
1607
+					unset($instance->{$cache}->{$class_name});
1608
+				}
1609
+			}
1610
+		}
1611
+		return $instance;
1612
+	}
1613
+
1614
+
1615
+	/**
1616
+	 * if passed object implements ResettableInterface, then call it's reset() method
1617
+	 * if passed object implements InterminableInterface, then return false,
1618
+	 * to indicate that it should NOT be cleared from the Registry cache
1619
+	 *
1620
+	 * @param      $object
1621
+	 * @param bool $reset_models
1622
+	 * @return bool returns true if cached object should be unset
1623
+	 */
1624
+	private static function _reset_and_unset_object($object, $reset_models)
1625
+	{
1626
+		if (! is_object($object)) {
1627
+			// don't unset anything that's not an object
1628
+			return false;
1629
+		}
1630
+		if ($object instanceof EED_Module) {
1631
+			$object::reset();
1632
+			// don't unset modules
1633
+			return false;
1634
+		}
1635
+		if ($object instanceof ResettableInterface) {
1636
+			if ($object instanceof EEM_Base) {
1637
+				if ($reset_models) {
1638
+					$object->reset();
1639
+					return true;
1640
+				}
1641
+				return false;
1642
+			}
1643
+			$object->reset();
1644
+			return true;
1645
+		}
1646
+		if (! $object instanceof InterminableInterface) {
1647
+			return true;
1648
+		}
1649
+		return false;
1650
+	}
1651
+
1652
+
1653
+	/**
1654
+	 * Gets all the custom post type models defined
1655
+	 *
1656
+	 * @return array keys are model "short names" (Eg "Event") and keys are classnames (eg "EEM_Event")
1657
+	 */
1658
+	public function cpt_models()
1659
+	{
1660
+		$cpt_models = array();
1661
+		foreach ($this->non_abstract_db_models as $short_name => $classname) {
1662
+			if (is_subclass_of($classname, 'EEM_CPT_Base')) {
1663
+				$cpt_models[ $short_name ] = $classname;
1664
+			}
1665
+		}
1666
+		return $cpt_models;
1667
+	}
1668
+
1669
+
1670
+	/**
1671
+	 * @return \EE_Config
1672
+	 */
1673
+	public static function CFG()
1674
+	{
1675
+		return self::instance()->CFG;
1676
+	}
1677
+
1678
+
1679
+	/**
1680
+	 * @deprecated 4.9.62.p
1681
+	 * @param string $class_name
1682
+	 * @return ReflectionClass
1683
+	 * @throws ReflectionException
1684
+	 * @throws InvalidDataTypeException
1685
+	 */
1686
+	public function get_ReflectionClass($class_name)
1687
+	{
1688
+		return $this->mirror->getReflectionClass($class_name);
1689
+	}
1690 1690
 }
Please login to merge, or discard this patch.
core/services/loaders/CachingLoader.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -53,7 +53,7 @@  discard block
 block discarded – undo
53 53
         $identifier = ''
54 54
     ) {
55 55
         parent::__construct($loader);
56
-        $this->cache       = $cache;
56
+        $this->cache = $cache;
57 57
         $this->object_identifier = $object_identifier;
58 58
         $this->setIdentifier($identifier);
59 59
         if ($this->identifier !== '') {
@@ -89,7 +89,7 @@  discard block
 block discarded – undo
89 89
      */
90 90
     private function setIdentifier($identifier)
91 91
     {
92
-        if (! is_string($identifier)) {
92
+        if ( ! is_string($identifier)) {
93 93
             throw new InvalidDataTypeException('$identifier', $identifier, 'string');
94 94
         }
95 95
         $this->identifier = $identifier;
Please login to merge, or discard this patch.
Indentation   +154 added lines, -154 removed lines patch added patch discarded remove patch
@@ -17,158 +17,158 @@
 block discarded – undo
17 17
 class CachingLoader extends CachingLoaderDecorator
18 18
 {
19 19
 
20
-    /**
21
-     * @var string $identifier
22
-     */
23
-    protected $identifier;
24
-
25
-    /**
26
-     * @var CollectionInterface $cache
27
-     */
28
-    protected $cache;
29
-
30
-    /**
31
-     * @var ObjectIdentifier
32
-     */
33
-    private $object_identifier;
34
-
35
-
36
-    /**
37
-     * CachingLoader constructor.
38
-     *
39
-     * @param LoaderDecoratorInterface $loader
40
-     * @param CollectionInterface      $cache
41
-     * @param ObjectIdentifier         $object_identifier
42
-     * @param string                   $identifier
43
-     * @throws InvalidDataTypeException
44
-     */
45
-    public function __construct(
46
-        LoaderDecoratorInterface $loader,
47
-        CollectionInterface $cache,
48
-        ObjectIdentifier $object_identifier,
49
-        $identifier = ''
50
-    ) {
51
-        parent::__construct($loader);
52
-        $this->cache       = $cache;
53
-        $this->object_identifier = $object_identifier;
54
-        $this->setIdentifier($identifier);
55
-        if ($this->identifier !== '') {
56
-            // to only clear this cache, and assuming an identifier has been set, simply do the following:
57
-            // do_action('AHEE__EventEspresso_core_services_loaders_CachingLoader__resetCache__IDENTIFIER');
58
-            // where "IDENTIFIER" = the string that was set during construction
59
-            add_action(
60
-                "AHEE__EventEspresso_core_services_loaders_CachingLoader__resetCache__{$identifier}",
61
-                array($this, 'reset')
62
-            );
63
-        }
64
-        // to clear ALL caches, simply do the following:
65
-        // do_action('AHEE__EventEspresso_core_services_loaders_CachingLoader__resetCache');
66
-        add_action(
67
-            'AHEE__EventEspresso_core_services_loaders_CachingLoader__resetCache',
68
-            array($this, 'reset')
69
-        );
70
-    }
71
-
72
-
73
-    /**
74
-     * @return string
75
-     */
76
-    public function identifier()
77
-    {
78
-        return $this->identifier;
79
-    }
80
-
81
-
82
-    /**
83
-     * @param string $identifier
84
-     * @throws InvalidDataTypeException
85
-     */
86
-    private function setIdentifier($identifier)
87
-    {
88
-        if (! is_string($identifier)) {
89
-            throw new InvalidDataTypeException('$identifier', $identifier, 'string');
90
-        }
91
-        $this->identifier = $identifier;
92
-    }
93
-
94
-
95
-    /**
96
-     * @param FullyQualifiedName|string $fqcn
97
-     * @param mixed                     $object
98
-     * @param array                     $arguments
99
-     * @return bool
100
-     * @throws InvalidArgumentException
101
-     */
102
-    public function share($fqcn, $object, array $arguments = array())
103
-    {
104
-        if ($object instanceof $fqcn) {
105
-            return $this->cache->add(
106
-                $object,
107
-                $this->object_identifier->getIdentifier($fqcn, $arguments)
108
-            );
109
-        }
110
-        throw new InvalidArgumentException(
111
-            sprintf(
112
-                esc_html__(
113
-                    'The supplied class name "%1$s" must match the class of the supplied object.',
114
-                    'event_espresso'
115
-                ),
116
-                $fqcn
117
-            )
118
-        );
119
-    }
120
-
121
-
122
-    /**
123
-     * @param FullyQualifiedName|string $fqcn
124
-     * @param array                     $arguments
125
-     * @param bool                      $shared
126
-     * @param array                     $interfaces
127
-     * @return mixed
128
-     */
129
-    public function load($fqcn, $arguments = array(), $shared = true, array $interfaces = array())
130
-    {
131
-        $fqcn = ltrim($fqcn, '\\');
132
-        // caching can be turned off via the following code:
133
-        // add_filter('FHEE__EventEspresso_core_services_loaders_CachingLoader__load__bypass_cache', '__return_true');
134
-        if (apply_filters(
135
-            'FHEE__EventEspresso_core_services_loaders_CachingLoader__load__bypass_cache',
136
-            false,
137
-            $this
138
-        )) {
139
-            // even though $shared might be true, caching could be bypassed for whatever reason,
140
-            // so we don't want the core loader to cache anything, therefore caching is turned off
141
-            return $this->loader->load($fqcn, $arguments, false);
142
-        }
143
-        $object_identifier = $this->object_identifier->getIdentifier($fqcn, $arguments);
144
-        if ($this->cache->has($object_identifier)) {
145
-            return $this->cache->get($object_identifier);
146
-        }
147
-        $object = $this->loader->load($fqcn, $arguments, $shared);
148
-        if ($object instanceof $fqcn) {
149
-            $this->cache->add($object, $object_identifier);
150
-        }
151
-        return $object;
152
-    }
153
-
154
-
155
-    /**
156
-     * empties cache and calls reset() on loader if method exists
157
-     */
158
-    public function reset()
159
-    {
160
-        $this->clearCache();
161
-        $this->loader->reset();
162
-    }
163
-
164
-
165
-    /**
166
-     * unsets and detaches ALL objects from the cache
167
-     *
168
-     * @since 4.9.62.p
169
-     */
170
-    public function clearCache()
171
-    {
172
-        $this->cache->trashAndDetachAll();
173
-    }
20
+	/**
21
+	 * @var string $identifier
22
+	 */
23
+	protected $identifier;
24
+
25
+	/**
26
+	 * @var CollectionInterface $cache
27
+	 */
28
+	protected $cache;
29
+
30
+	/**
31
+	 * @var ObjectIdentifier
32
+	 */
33
+	private $object_identifier;
34
+
35
+
36
+	/**
37
+	 * CachingLoader constructor.
38
+	 *
39
+	 * @param LoaderDecoratorInterface $loader
40
+	 * @param CollectionInterface      $cache
41
+	 * @param ObjectIdentifier         $object_identifier
42
+	 * @param string                   $identifier
43
+	 * @throws InvalidDataTypeException
44
+	 */
45
+	public function __construct(
46
+		LoaderDecoratorInterface $loader,
47
+		CollectionInterface $cache,
48
+		ObjectIdentifier $object_identifier,
49
+		$identifier = ''
50
+	) {
51
+		parent::__construct($loader);
52
+		$this->cache       = $cache;
53
+		$this->object_identifier = $object_identifier;
54
+		$this->setIdentifier($identifier);
55
+		if ($this->identifier !== '') {
56
+			// to only clear this cache, and assuming an identifier has been set, simply do the following:
57
+			// do_action('AHEE__EventEspresso_core_services_loaders_CachingLoader__resetCache__IDENTIFIER');
58
+			// where "IDENTIFIER" = the string that was set during construction
59
+			add_action(
60
+				"AHEE__EventEspresso_core_services_loaders_CachingLoader__resetCache__{$identifier}",
61
+				array($this, 'reset')
62
+			);
63
+		}
64
+		// to clear ALL caches, simply do the following:
65
+		// do_action('AHEE__EventEspresso_core_services_loaders_CachingLoader__resetCache');
66
+		add_action(
67
+			'AHEE__EventEspresso_core_services_loaders_CachingLoader__resetCache',
68
+			array($this, 'reset')
69
+		);
70
+	}
71
+
72
+
73
+	/**
74
+	 * @return string
75
+	 */
76
+	public function identifier()
77
+	{
78
+		return $this->identifier;
79
+	}
80
+
81
+
82
+	/**
83
+	 * @param string $identifier
84
+	 * @throws InvalidDataTypeException
85
+	 */
86
+	private function setIdentifier($identifier)
87
+	{
88
+		if (! is_string($identifier)) {
89
+			throw new InvalidDataTypeException('$identifier', $identifier, 'string');
90
+		}
91
+		$this->identifier = $identifier;
92
+	}
93
+
94
+
95
+	/**
96
+	 * @param FullyQualifiedName|string $fqcn
97
+	 * @param mixed                     $object
98
+	 * @param array                     $arguments
99
+	 * @return bool
100
+	 * @throws InvalidArgumentException
101
+	 */
102
+	public function share($fqcn, $object, array $arguments = array())
103
+	{
104
+		if ($object instanceof $fqcn) {
105
+			return $this->cache->add(
106
+				$object,
107
+				$this->object_identifier->getIdentifier($fqcn, $arguments)
108
+			);
109
+		}
110
+		throw new InvalidArgumentException(
111
+			sprintf(
112
+				esc_html__(
113
+					'The supplied class name "%1$s" must match the class of the supplied object.',
114
+					'event_espresso'
115
+				),
116
+				$fqcn
117
+			)
118
+		);
119
+	}
120
+
121
+
122
+	/**
123
+	 * @param FullyQualifiedName|string $fqcn
124
+	 * @param array                     $arguments
125
+	 * @param bool                      $shared
126
+	 * @param array                     $interfaces
127
+	 * @return mixed
128
+	 */
129
+	public function load($fqcn, $arguments = array(), $shared = true, array $interfaces = array())
130
+	{
131
+		$fqcn = ltrim($fqcn, '\\');
132
+		// caching can be turned off via the following code:
133
+		// add_filter('FHEE__EventEspresso_core_services_loaders_CachingLoader__load__bypass_cache', '__return_true');
134
+		if (apply_filters(
135
+			'FHEE__EventEspresso_core_services_loaders_CachingLoader__load__bypass_cache',
136
+			false,
137
+			$this
138
+		)) {
139
+			// even though $shared might be true, caching could be bypassed for whatever reason,
140
+			// so we don't want the core loader to cache anything, therefore caching is turned off
141
+			return $this->loader->load($fqcn, $arguments, false);
142
+		}
143
+		$object_identifier = $this->object_identifier->getIdentifier($fqcn, $arguments);
144
+		if ($this->cache->has($object_identifier)) {
145
+			return $this->cache->get($object_identifier);
146
+		}
147
+		$object = $this->loader->load($fqcn, $arguments, $shared);
148
+		if ($object instanceof $fqcn) {
149
+			$this->cache->add($object, $object_identifier);
150
+		}
151
+		return $object;
152
+	}
153
+
154
+
155
+	/**
156
+	 * empties cache and calls reset() on loader if method exists
157
+	 */
158
+	public function reset()
159
+	{
160
+		$this->clearCache();
161
+		$this->loader->reset();
162
+	}
163
+
164
+
165
+	/**
166
+	 * unsets and detaches ALL objects from the cache
167
+	 *
168
+	 * @since 4.9.62.p
169
+	 */
170
+	public function clearCache()
171
+	{
172
+		$this->cache->trashAndDetachAll();
173
+	}
174 174
 }
Please login to merge, or discard this patch.
core/services/loaders/ObjectIdentifier.php 2 patches
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -73,7 +73,7 @@  discard block
 block discarded – undo
73 73
     public function fqcnMatchesObjectIdentifier($fqcn, $object_identifier)
74 74
     {
75 75
         return $fqcn === $object_identifier
76
-               || strpos($object_identifier, $fqcn . ObjectIdentifier::DELIMITER) === 0;
76
+               || strpos($object_identifier, $fqcn.ObjectIdentifier::DELIMITER) === 0;
77 77
     }
78 78
 
79 79
 
@@ -93,8 +93,8 @@  discard block
 block discarded – undo
93 93
         )
94 94
             ? $this->getIdentifierForArguments($arguments)
95 95
             : '';
96
-        if (! empty($identifier)) {
97
-            $fqcn .= ObjectIdentifier::DELIMITER . md5($identifier);
96
+        if ( ! empty($identifier)) {
97
+            $fqcn .= ObjectIdentifier::DELIMITER.md5($identifier);
98 98
         }
99 99
         return $fqcn;
100 100
     }
Please login to merge, or discard this patch.
Indentation   +98 added lines, -98 removed lines patch added patch discarded remove patch
@@ -16,113 +16,113 @@
 block discarded – undo
16 16
 class ObjectIdentifier
17 17
 {
18 18
 
19
-    /**
20
-     * used to separate the FQCN from the class's arguments identifier
21
-     */
22
-    const DELIMITER = '____';
19
+	/**
20
+	 * used to separate the FQCN from the class's arguments identifier
21
+	 */
22
+	const DELIMITER = '____';
23 23
 
24
-    /**
25
-     * @var ClassInterfaceCache $class_cache
26
-     */
27
-    private $class_cache;
24
+	/**
25
+	 * @var ClassInterfaceCache $class_cache
26
+	 */
27
+	private $class_cache;
28 28
 
29 29
 
30
-    /**
31
-     * ObjectIdentifier constructor.
32
-     *
33
-     * @param ClassInterfaceCache $class_cache
34
-     */
35
-    public function __construct(ClassInterfaceCache $class_cache)
36
-    {
37
-        $this->class_cache = $class_cache;
38
-    }
30
+	/**
31
+	 * ObjectIdentifier constructor.
32
+	 *
33
+	 * @param ClassInterfaceCache $class_cache
34
+	 */
35
+	public function __construct(ClassInterfaceCache $class_cache)
36
+	{
37
+		$this->class_cache = $class_cache;
38
+	}
39 39
 
40 40
 
41
-    /**
42
-     * Returns true if the supplied $object_identifier contains
43
-     * the delimiter used to separate an fqcn from the arguments hash
44
-     *
45
-     * @param string $object_identifier
46
-     * @return bool
47
-     */
48
-    public function hasArguments($object_identifier)
49
-    {
50
-        // type casting to bool instead of using strpos() !== false
51
-        // because an object identifier should never begin with the delimiter
52
-        // therefore the delimiter should NOT be found at position 0
53
-        return (bool) strpos($object_identifier, ObjectIdentifier::DELIMITER);
54
-    }
41
+	/**
42
+	 * Returns true if the supplied $object_identifier contains
43
+	 * the delimiter used to separate an fqcn from the arguments hash
44
+	 *
45
+	 * @param string $object_identifier
46
+	 * @return bool
47
+	 */
48
+	public function hasArguments($object_identifier)
49
+	{
50
+		// type casting to bool instead of using strpos() !== false
51
+		// because an object identifier should never begin with the delimiter
52
+		// therefore the delimiter should NOT be found at position 0
53
+		return (bool) strpos($object_identifier, ObjectIdentifier::DELIMITER);
54
+	}
55 55
 
56 56
 
57
-    /**
58
-     * Returns true if the supplied FQCN equals the supplied $object_identifier
59
-     * OR the supplied FQCN matches the FQCN portion of the supplied $object_identifier
60
-     * AND that $object_identifier is for an object with arguments.
61
-     * This allows a request for an object using a FQCN to match
62
-     * a previously instantiated object with arguments
63
-     * without having to know those arguments.
64
-     *
65
-     * @param string $fqcn
66
-     * @param string $object_identifier
67
-     * @return bool
68
-     */
69
-    public function fqcnMatchesObjectIdentifier($fqcn, $object_identifier)
70
-    {
71
-        return $fqcn === $object_identifier
72
-               || strpos($object_identifier, $fqcn . ObjectIdentifier::DELIMITER) === 0;
73
-    }
57
+	/**
58
+	 * Returns true if the supplied FQCN equals the supplied $object_identifier
59
+	 * OR the supplied FQCN matches the FQCN portion of the supplied $object_identifier
60
+	 * AND that $object_identifier is for an object with arguments.
61
+	 * This allows a request for an object using a FQCN to match
62
+	 * a previously instantiated object with arguments
63
+	 * without having to know those arguments.
64
+	 *
65
+	 * @param string $fqcn
66
+	 * @param string $object_identifier
67
+	 * @return bool
68
+	 */
69
+	public function fqcnMatchesObjectIdentifier($fqcn, $object_identifier)
70
+	{
71
+		return $fqcn === $object_identifier
72
+			   || strpos($object_identifier, $fqcn . ObjectIdentifier::DELIMITER) === 0;
73
+	}
74 74
 
75 75
 
76
-    /**
77
-     * build a string representation of an object's FQCN and arguments
78
-     *
79
-     * @param string $fqcn
80
-     * @param array  $arguments
81
-     * @return string
82
-     */
83
-    public function getIdentifier($fqcn, array $arguments = array())
84
-    {
85
-        // only build identifier from arguments if class is not ReservedInstanceInterface
86
-        $identifier = ! $this->class_cache->hasInterface(
87
-            $fqcn,
88
-            'EventEspresso\core\interfaces\ReservedInstanceInterface'
89
-        )
90
-            ? $this->getIdentifierForArguments($arguments)
91
-            : '';
92
-        if (! empty($identifier)) {
93
-            $fqcn .= ObjectIdentifier::DELIMITER . md5($identifier);
94
-        }
95
-        return $fqcn;
96
-    }
76
+	/**
77
+	 * build a string representation of an object's FQCN and arguments
78
+	 *
79
+	 * @param string $fqcn
80
+	 * @param array  $arguments
81
+	 * @return string
82
+	 */
83
+	public function getIdentifier($fqcn, array $arguments = array())
84
+	{
85
+		// only build identifier from arguments if class is not ReservedInstanceInterface
86
+		$identifier = ! $this->class_cache->hasInterface(
87
+			$fqcn,
88
+			'EventEspresso\core\interfaces\ReservedInstanceInterface'
89
+		)
90
+			? $this->getIdentifierForArguments($arguments)
91
+			: '';
92
+		if (! empty($identifier)) {
93
+			$fqcn .= ObjectIdentifier::DELIMITER . md5($identifier);
94
+		}
95
+		return $fqcn;
96
+	}
97 97
 
98 98
 
99
-    /**
100
-     * build a string representation of a object's arguments
101
-     * (mostly because Closures can't be serialized)
102
-     *
103
-     * @param array $arguments
104
-     * @return string
105
-     */
106
-    protected function getIdentifierForArguments(array $arguments)
107
-    {
108
-        if (empty($arguments)) {
109
-            return '';
110
-        }
111
-        $identifier = '';
112
-        foreach ($arguments as $argument) {
113
-            switch (true) {
114
-                case is_object($argument):
115
-                case $argument instanceof Closure:
116
-                    $identifier .= spl_object_hash($argument);
117
-                    break;
118
-                case is_array($argument):
119
-                    $identifier .= $this->getIdentifierForArguments($argument);
120
-                    break;
121
-                default:
122
-                    $identifier .= $argument;
123
-                    break;
124
-            }
125
-        }
126
-        return $identifier;
127
-    }
99
+	/**
100
+	 * build a string representation of a object's arguments
101
+	 * (mostly because Closures can't be serialized)
102
+	 *
103
+	 * @param array $arguments
104
+	 * @return string
105
+	 */
106
+	protected function getIdentifierForArguments(array $arguments)
107
+	{
108
+		if (empty($arguments)) {
109
+			return '';
110
+		}
111
+		$identifier = '';
112
+		foreach ($arguments as $argument) {
113
+			switch (true) {
114
+				case is_object($argument):
115
+				case $argument instanceof Closure:
116
+					$identifier .= spl_object_hash($argument);
117
+					break;
118
+				case is_array($argument):
119
+					$identifier .= $this->getIdentifierForArguments($argument);
120
+					break;
121
+				default:
122
+					$identifier .= $argument;
123
+					break;
124
+			}
125
+		}
126
+		return $identifier;
127
+	}
128 128
 }
Please login to merge, or discard this patch.
core/domain/DomainInterface.php 1 patch
Indentation   +36 added lines, -36 removed lines patch added patch discarded remove patch
@@ -16,55 +16,55 @@
 block discarded – undo
16 16
 interface DomainInterface extends InterminableInterface
17 17
 {
18 18
 
19
-    /**
20
-     * @return string
21
-     * @throws DomainException
22
-     */
23
-    public function pluginFile();
19
+	/**
20
+	 * @return string
21
+	 * @throws DomainException
22
+	 */
23
+	public function pluginFile();
24 24
 
25 25
 
26
-    /**
27
-     * @return string
28
-     * @throws DomainException
29
-     */
30
-    public function pluginBasename();
26
+	/**
27
+	 * @return string
28
+	 * @throws DomainException
29
+	 */
30
+	public function pluginBasename();
31 31
 
32 32
 
33
-    /**
34
-     * @return string
35
-     */
36
-    public function pluginPath();
33
+	/**
34
+	 * @return string
35
+	 */
36
+	public function pluginPath();
37 37
 
38 38
 
39
-    /**
40
-     * @return string
41
-     * @throws DomainException
42
-     */
43
-    public function pluginUrl();
39
+	/**
40
+	 * @return string
41
+	 * @throws DomainException
42
+	 */
43
+	public function pluginUrl();
44 44
 
45 45
 
46
-    /**
47
-     * @return string
48
-     * @throws DomainException
49
-     */
50
-    public function version();
46
+	/**
47
+	 * @return string
48
+	 * @throws DomainException
49
+	 */
50
+	public function version();
51 51
 
52 52
 
53
-    /**
54
-     * @return string
55
-     */
56
-    public function distributionAssetsPath();
53
+	/**
54
+	 * @return string
55
+	 */
56
+	public function distributionAssetsPath();
57 57
 
58 58
 
59
-    /**
60
-     * @return string
61
-     */
62
-    public function distributionAssetsUrl();
59
+	/**
60
+	 * @return string
61
+	 */
62
+	public function distributionAssetsUrl();
63 63
 
64 64
 
65
-    /**
66
-     * @return string
67
-     */
68
-    public function assetNamespace();
65
+	/**
66
+	 * @return string
67
+	 */
68
+	public function assetNamespace();
69 69
 
70 70
 }
Please login to merge, or discard this patch.
core/helpers/EEH_Debug_Tools.helper.php 3 patches
Doc Comments   +8 added lines, -5 removed lines patch added patch discarded remove patch
@@ -375,11 +375,11 @@  discard block
 block discarded – undo
375 375
 
376 376
 
377 377
     /**
378
-     * @param mixed      $var
378
+     * @param string      $var
379 379
      * @param string     $var_name
380 380
      * @param string     $file
381 381
      * @param int|string $line
382
-     * @param int|string $heading_tag
382
+     * @param integer $heading_tag
383 383
      * @param bool       $die
384 384
      * @param string     $margin
385 385
      */
@@ -411,6 +411,9 @@  discard block
 block discarded – undo
411 411
     }
412 412
 
413 413
 
414
+    /**
415
+     * @param integer $heading_tag
416
+     */
414 417
     protected static function headingTag($heading_tag)
415 418
     {
416 419
         $heading_tag = absint($heading_tag);
@@ -532,8 +535,8 @@  discard block
 block discarded – undo
532 535
      * @param mixed      $var
533 536
      * @param string     $var_name
534 537
      * @param string     $file
535
-     * @param int|string $line
536
-     * @param int|string $heading_tag
538
+     * @param integer $line
539
+     * @param integer $heading_tag
537 540
      * @param bool       $die
538 541
      */
539 542
     public static function printr(
@@ -596,7 +599,7 @@  discard block
 block discarded – undo
596 599
 
597 600
     /**
598 601
      * @deprecated 4.9.39.rc.034
599
-     * @param null $timer_name
602
+     * @param string $timer_name
600 603
      */
601 604
     public function start_timer($timer_name = null)
602 605
     {
Please login to merge, or discard this patch.
Indentation   +674 added lines, -674 removed lines patch added patch discarded remove patch
@@ -11,665 +11,665 @@  discard block
 block discarded – undo
11 11
 class EEH_Debug_Tools
12 12
 {
13 13
 
14
-    /**
15
-     *    instance of the EEH_Autoloader object
16
-     *
17
-     * @var    $_instance
18
-     * @access    private
19
-     */
20
-    private static $_instance;
21
-
22
-    /**
23
-     * @var array
24
-     */
25
-    protected $_memory_usage_points = array();
26
-
27
-
28
-
29
-    /**
30
-     * @singleton method used to instantiate class object
31
-     * @access    public
32
-     * @return EEH_Debug_Tools
33
-     */
34
-    public static function instance()
35
-    {
36
-        // check if class object is instantiated, and instantiated properly
37
-        if (! self::$_instance instanceof EEH_Debug_Tools) {
38
-            self::$_instance = new self();
39
-        }
40
-        return self::$_instance;
41
-    }
42
-
43
-
44
-
45
-    /**
46
-     * private class constructor
47
-     */
48
-    private function __construct()
49
-    {
50
-        // load Kint PHP debugging library
51
-        if (! class_exists('Kint') && file_exists(EE_PLUGIN_DIR_PATH . 'tests' . DS . 'kint' . DS . 'Kint.class.php')) {
52
-            // despite EE4 having a check for an existing copy of the Kint debugging class,
53
-            // if another plugin was loaded AFTER EE4 and they did NOT perform a similar check,
54
-            // then hilarity would ensue as PHP throws a "Cannot redeclare class Kint" error
55
-            // so we've moved it to our test folder so that it is not included with production releases
56
-            // plz use https://wordpress.org/plugins/kint-debugger/  if testing production versions of EE
57
-            require_once(EE_PLUGIN_DIR_PATH . 'tests' . DS . 'kint' . DS . 'Kint.class.php');
58
-        }
59
-        // if ( ! defined('DOING_AJAX') || $_REQUEST['noheader'] !== 'true' || ! isset( $_REQUEST['noheader'], $_REQUEST['TB_iframe'] ) ) {
60
-        // add_action( 'shutdown', array($this,'espresso_session_footer_dump') );
61
-        // }
62
-        $plugin = basename(EE_PLUGIN_DIR_PATH);
63
-        add_action("activate_{$plugin}", array('EEH_Debug_Tools', 'ee_plugin_activation_errors'));
64
-        add_action('activated_plugin', array('EEH_Debug_Tools', 'ee_plugin_activation_errors'));
65
-        add_action('shutdown', array('EEH_Debug_Tools', 'show_db_name'));
66
-    }
67
-
68
-
69
-
70
-    /**
71
-     *    show_db_name
72
-     *
73
-     * @return void
74
-     */
75
-    public static function show_db_name()
76
-    {
77
-        if (! defined('DOING_AJAX') && (defined('EE_ERROR_EMAILS') && EE_ERROR_EMAILS)) {
78
-            echo '<p style="font-size:10px;font-weight:normal;color:#E76700;margin: 1em 2em; text-align: right;">DB_NAME: '
79
-                 . DB_NAME
80
-                 . '</p>';
81
-        }
82
-        if (EE_DEBUG) {
83
-            Benchmark::displayResults();
84
-        }
85
-    }
86
-
87
-
88
-
89
-    /**
90
-     *    dump EE_Session object at bottom of page after everything else has happened
91
-     *
92
-     * @return void
93
-     */
94
-    public function espresso_session_footer_dump()
95
-    {
96
-        if ((defined('WP_DEBUG') && WP_DEBUG)
97
-            && ! defined('DOING_AJAX')
98
-            && class_exists('Kint')
99
-            && function_exists('wp_get_current_user')
100
-            && current_user_can('update_core')
101
-            && class_exists('EE_Registry')
102
-        ) {
103
-            Kint::dump(EE_Registry::instance()->SSN->id());
104
-            Kint::dump(EE_Registry::instance()->SSN);
105
-            //          Kint::dump( EE_Registry::instance()->SSN->get_session_data('cart')->get_tickets() );
106
-            $this->espresso_list_hooked_functions();
107
-            Benchmark::displayResults();
108
-        }
109
-    }
110
-
111
-
112
-
113
-    /**
114
-     *    List All Hooked Functions
115
-     *    to list all functions for a specific hook, add ee_list_hooks={hook-name} to URL
116
-     *    http://wp.smashingmagazine.com/2009/08/18/10-useful-wordpress-hook-hacks/
117
-     *
118
-     * @param string $tag
119
-     * @return void
120
-     */
121
-    public function espresso_list_hooked_functions($tag = '')
122
-    {
123
-        global $wp_filter;
124
-        echo '<br/><br/><br/><h3>Hooked Functions</h3>';
125
-        if ($tag) {
126
-            $hook[ $tag ] = $wp_filter[ $tag ];
127
-            if (! is_array($hook[ $tag ])) {
128
-                trigger_error("Nothing found for '$tag' hook", E_USER_WARNING);
129
-                return;
130
-            }
131
-            echo '<h5>For Tag: ' . $tag . '</h5>';
132
-        } else {
133
-            $hook = is_array($wp_filter) ? $wp_filter : array($wp_filter);
134
-            ksort($hook);
135
-        }
136
-        foreach ($hook as $tag_name => $priorities) {
137
-            echo "<br />&gt;&gt;&gt;&gt;&gt;\t<strong>$tag_name</strong><br />";
138
-            ksort($priorities);
139
-            foreach ($priorities as $priority => $function) {
140
-                echo $priority;
141
-                foreach ($function as $name => $properties) {
142
-                    echo "\t$name<br />";
143
-                }
144
-            }
145
-        }
146
-    }
147
-
148
-
149
-
150
-    /**
151
-     *    registered_filter_callbacks
152
-     *
153
-     * @param string $hook_name
154
-     * @return array
155
-     */
156
-    public static function registered_filter_callbacks($hook_name = '')
157
-    {
158
-        $filters = array();
159
-        global $wp_filter;
160
-        if (isset($wp_filter[ $hook_name ])) {
161
-            $filters[ $hook_name ] = array();
162
-            foreach ($wp_filter[ $hook_name ] as $priority => $callbacks) {
163
-                $filters[ $hook_name ][ $priority ] = array();
164
-                foreach ($callbacks as $callback) {
165
-                    $filters[ $hook_name ][ $priority ][] = $callback['function'];
166
-                }
167
-            }
168
-        }
169
-        return $filters;
170
-    }
171
-
172
-
173
-
174
-    /**
175
-     *    captures plugin activation errors for debugging
176
-     *
177
-     * @return void
178
-     * @throws EE_Error
179
-     */
180
-    public static function ee_plugin_activation_errors()
181
-    {
182
-        if (WP_DEBUG) {
183
-            $activation_errors = ob_get_contents();
184
-            if (! empty($activation_errors)) {
185
-                $activation_errors = date('Y-m-d H:i:s') . "\n" . $activation_errors;
186
-            }
187
-            espresso_load_required('EEH_File', EE_HELPERS . 'EEH_File.helper.php');
188
-            if (class_exists('EEH_File')) {
189
-                try {
190
-                    EEH_File::ensure_file_exists_and_is_writable(
191
-                        EVENT_ESPRESSO_UPLOAD_DIR . 'logs' . DS . 'espresso_plugin_activation_errors.html'
192
-                    );
193
-                    EEH_File::write_to_file(
194
-                        EVENT_ESPRESSO_UPLOAD_DIR . 'logs' . DS . 'espresso_plugin_activation_errors.html',
195
-                        $activation_errors
196
-                    );
197
-                } catch (EE_Error $e) {
198
-                    EE_Error::add_error(
199
-                        sprintf(
200
-                            __(
201
-                                'The Event Espresso activation errors file could not be setup because: %s',
202
-                                'event_espresso'
203
-                            ),
204
-                            $e->getMessage()
205
-                        ),
206
-                        __FILE__,
207
-                        __FUNCTION__,
208
-                        __LINE__
209
-                    );
210
-                }
211
-            } else {
212
-                // old school attempt
213
-                file_put_contents(
214
-                    EVENT_ESPRESSO_UPLOAD_DIR . 'logs' . DS . 'espresso_plugin_activation_errors.html',
215
-                    $activation_errors
216
-                );
217
-            }
218
-            $activation_errors = get_option('ee_plugin_activation_errors', '') . $activation_errors;
219
-            update_option('ee_plugin_activation_errors', $activation_errors);
220
-        }
221
-    }
222
-
223
-
224
-
225
-    /**
226
-     * This basically mimics the WordPress _doing_it_wrong() function except adds our own messaging etc.
227
-     * Very useful for providing helpful messages to developers when the method of doing something has been deprecated,
228
-     * or we want to make sure they use something the right way.
229
-     *
230
-     * @access public
231
-     * @param string $function      The function that was called
232
-     * @param string $message       A message explaining what has been done incorrectly
233
-     * @param string $version       The version of Event Espresso where the error was added
234
-     * @param string $applies_when  a version string for when you want the doing_it_wrong notice to begin appearing
235
-     *                              for a deprecated function. This allows deprecation to occur during one version,
236
-     *                              but not have any notices appear until a later version. This allows developers
237
-     *                              extra time to update their code before notices appear.
238
-     * @param int    $error_type
239
-     * @uses   trigger_error()
240
-     */
241
-    public function doing_it_wrong(
242
-        $function,
243
-        $message,
244
-        $version,
245
-        $applies_when = '',
246
-        $error_type = null
247
-    ) {
248
-        $applies_when = ! empty($applies_when) ? $applies_when : espresso_version();
249
-        $error_type = $error_type !== null ? $error_type : E_USER_NOTICE;
250
-        // because we swapped the parameter order around for the last two params,
251
-        // let's verify that some third party isn't still passing an error type value for the third param
252
-        if (is_int($applies_when)) {
253
-            $error_type = $applies_when;
254
-            $applies_when = espresso_version();
255
-        }
256
-        // if not displaying notices yet, then just leave
257
-        if (version_compare(espresso_version(), $applies_when, '<')) {
258
-            return;
259
-        }
260
-        do_action('AHEE__EEH_Debug_Tools__doing_it_wrong_run', $function, $message, $version);
261
-        $version = $version === null
262
-            ? ''
263
-            : sprintf(
264
-                __('(This message was added in version %s of Event Espresso)', 'event_espresso'),
265
-                $version
266
-            );
267
-        $error_message = sprintf(
268
-            esc_html__('%1$s was called %2$sincorrectly%3$s. %4$s %5$s', 'event_espresso'),
269
-            $function,
270
-            '<strong>',
271
-            '</strong>',
272
-            $message,
273
-            $version
274
-        );
275
-        // don't trigger error if doing ajax,
276
-        // instead we'll add a transient EE_Error notice that in theory should show on the next request.
277
-        if (defined('DOING_AJAX') && DOING_AJAX) {
278
-            $error_message .= ' ' . esc_html__(
279
-                'This is a doing_it_wrong message that was triggered during an ajax request.  The request params on this request were: ',
280
-                'event_espresso'
281
-            );
282
-            $error_message .= '<ul><li>';
283
-            $error_message .= implode('</li><li>', EE_Registry::instance()->REQ->params());
284
-            $error_message .= '</ul>';
285
-            EE_Error::add_error($error_message, 'debug::doing_it_wrong', $function, '42');
286
-            // now we set this on the transient so it shows up on the next request.
287
-            EE_Error::get_notices(false, true);
288
-        } else {
289
-            trigger_error($error_message, $error_type);
290
-        }
291
-    }
292
-
293
-
294
-
295
-
296
-    /**
297
-     * Logger helpers
298
-     */
299
-    /**
300
-     * debug
301
-     *
302
-     * @param string $class
303
-     * @param string $func
304
-     * @param string $line
305
-     * @param array  $info
306
-     * @param bool   $display_request
307
-     * @param string $debug_index
308
-     * @param string $debug_key
309
-     * @throws EE_Error
310
-     * @throws \EventEspresso\core\exceptions\InvalidSessionDataException
311
-     */
312
-    public static function log(
313
-        $class = '',
314
-        $func = '',
315
-        $line = '',
316
-        $info = array(),
317
-        $display_request = false,
318
-        $debug_index = '',
319
-        $debug_key = 'EE_DEBUG_SPCO'
320
-    ) {
321
-        if (WP_DEBUG) {
322
-            $debug_key = $debug_key . '_' . EE_Session::instance()->id();
323
-            $debug_data = get_option($debug_key, array());
324
-            $default_data = array(
325
-                $class => $func . '() : ' . $line,
326
-                'REQ'  => $display_request ? $_REQUEST : '',
327
-            );
328
-            // don't serialize objects
329
-            $info = self::strip_objects($info);
330
-            $index = ! empty($debug_index) ? $debug_index : 0;
331
-            if (! isset($debug_data[ $index ])) {
332
-                $debug_data[ $index ] = array();
333
-            }
334
-            $debug_data[ $index ][ microtime() ] = array_merge($default_data, $info);
335
-            update_option($debug_key, $debug_data);
336
-        }
337
-    }
338
-
339
-
340
-
341
-    /**
342
-     * strip_objects
343
-     *
344
-     * @param array $info
345
-     * @return array
346
-     */
347
-    public static function strip_objects($info = array())
348
-    {
349
-        foreach ($info as $key => $value) {
350
-            if (is_array($value)) {
351
-                $info[ $key ] = self::strip_objects($value);
352
-            } elseif (is_object($value)) {
353
-                $object_class = get_class($value);
354
-                $info[ $object_class ] = array();
355
-                $info[ $object_class ]['ID'] = method_exists($value, 'ID') ? $value->ID() : spl_object_hash($value);
356
-                if (method_exists($value, 'ID')) {
357
-                    $info[ $object_class ]['ID'] = $value->ID();
358
-                }
359
-                if (method_exists($value, 'status')) {
360
-                    $info[ $object_class ]['status'] = $value->status();
361
-                } elseif (method_exists($value, 'status_ID')) {
362
-                    $info[ $object_class ]['status'] = $value->status_ID();
363
-                }
364
-                unset($info[ $key ]);
365
-            }
366
-        }
367
-        return (array) $info;
368
-    }
369
-
370
-
371
-
372
-    /**
373
-     * @param mixed      $var
374
-     * @param string     $var_name
375
-     * @param string     $file
376
-     * @param int|string $line
377
-     * @param int|string $heading_tag
378
-     * @param bool       $die
379
-     * @param string     $margin
380
-     */
381
-    public static function printv(
382
-        $var,
383
-        $var_name = '',
384
-        $file = '',
385
-        $line = '',
386
-        $heading_tag = 5,
387
-        $die = false,
388
-        $margin = ''
389
-    ) {
390
-        $var_name = ! $var_name ? 'string' : $var_name;
391
-        $var_name = ucwords(str_replace('$', '', $var_name));
392
-        $is_method = method_exists($var_name, $var);
393
-        $var_name = ucwords(str_replace('_', ' ', $var_name));
394
-        $heading_tag = EEH_Debug_Tools::headingTag($heading_tag);
395
-        $result = EEH_Debug_Tools::headingSpacer($heading_tag);
396
-        $result .= EEH_Debug_Tools::heading($var_name, $heading_tag, $margin, $line);
397
-        $result .= $is_method
398
-            ? EEH_Debug_Tools::grey_span('::') . EEH_Debug_Tools::orange_span($var . '()')
399
-            : EEH_Debug_Tools::grey_span(' : ') . EEH_Debug_Tools::orange_span($var);
400
-        $result .= EEH_Debug_Tools::file_and_line($file, $line, $heading_tag);
401
-        $result .= EEH_Debug_Tools::headingX($heading_tag);
402
-        if ($die) {
403
-            die($result);
404
-        }
405
-        echo $result;
406
-    }
407
-
408
-
409
-    protected static function headingTag($heading_tag)
410
-    {
411
-        $heading_tag = absint($heading_tag);
412
-        return $heading_tag > 0 && $heading_tag < 7 ? "h{$heading_tag}" : 'h5';
413
-    }
414
-
415
-
416
-    protected static function headingSpacer($heading_tag)
417
-    {
418
-        return EEH_Debug_Tools::plainOutput() && ($heading_tag === 'h1' || $heading_tag === 'h2')
419
-            ? "\n"
420
-            : '';
421
-    }
422
-
423
-
424
-    protected static function plainOutput()
425
-    {
426
-        return defined('EE_TESTS_DIR') || (defined('DOING_AJAX') && DOING_AJAX);
427
-    }
428
-
429
-
430
-    /**
431
-     * @param string $var_name
432
-     * @param string $heading_tag
433
-     * @param string $margin
434
-     * @param int    $line
435
-     * @return string
436
-     */
437
-    protected static function heading($var_name = '', $heading_tag = 'h5', $margin = '', $line = 0)
438
-    {
439
-        if (EEH_Debug_Tools::plainOutput()) {
440
-            $heading = '';
441
-            if ($heading_tag === 'h1' || $heading_tag === 'h2') {
442
-                $heading .= "\n";
443
-            }
444
-            $heading .= "\n{$line}) {$var_name}";
445
-            return $heading;
446
-        }
447
-        $margin = "25px 0 0 {$margin}";
448
-        return '<' . $heading_tag . ' style="color:#2EA2CC; margin:' . $margin . ';"><b>' . $var_name . '</b>';
449
-    }
450
-
451
-
452
-
453
-    /**
454
-     * @param string $heading_tag
455
-     * @return string
456
-     */
457
-    protected static function headingX($heading_tag = 'h5')
458
-    {
459
-        if (EEH_Debug_Tools::plainOutput()) {
460
-            return '';
461
-        }
462
-        return '</' . $heading_tag . '>';
463
-    }
464
-
465
-
466
-
467
-    /**
468
-     * @param string $content
469
-     * @return string
470
-     */
471
-    protected static function grey_span($content = '')
472
-    {
473
-        if (EEH_Debug_Tools::plainOutput()) {
474
-            return $content;
475
-        }
476
-        return '<span style="color:#999">' . $content . '</span>';
477
-    }
478
-
479
-
480
-
481
-    /**
482
-     * @param string $file
483
-     * @param int    $line
484
-     * @return string
485
-     */
486
-    protected static function file_and_line($file, $line, $heading_tag)
487
-    {
488
-        if ($file === '' || $line === '') {
489
-            return '';
490
-        }
491
-        $file = str_replace(EE_PLUGIN_DIR_PATH, '/', $file);
492
-        if (EEH_Debug_Tools::plainOutput()) {
493
-            if ($heading_tag === 'h1' || $heading_tag === 'h2') {
494
-                return " ({$file})";
495
-            }
496
-            return '';
497
-        }
498
-        return '<br /><span style="font-size:9px;font-weight:normal;color:#666;line-height: 12px;">'
499
-               . $file
500
-               . '<br />line no: '
501
-               . $line
502
-               . '</span>';
503
-    }
504
-
505
-
506
-
507
-    /**
508
-     * @param string $content
509
-     * @return string
510
-     */
511
-    protected static function orange_span($content = '')
512
-    {
513
-        if (EEH_Debug_Tools::plainOutput()) {
514
-            return $content;
515
-        }
516
-        return '<span style="color:#E76700">' . $content . '</span>';
517
-    }
518
-
519
-
520
-
521
-    /**
522
-     * @param mixed $var
523
-     * @return string
524
-     */
525
-    protected static function pre_span($var)
526
-    {
527
-        ob_start();
528
-        var_dump($var);
529
-        $var = ob_get_clean();
530
-        if (EEH_Debug_Tools::plainOutput()) {
531
-            return $var;
532
-        }
533
-        return '<pre style="color:#999; padding:1em; background: #fff">' . $var . '</pre>';
534
-    }
535
-
536
-
537
-
538
-    /**
539
-     * @param mixed      $var
540
-     * @param string     $var_name
541
-     * @param string     $file
542
-     * @param int|string $line
543
-     * @param int|string $heading_tag
544
-     * @param bool       $die
545
-     */
546
-    public static function printr(
547
-        $var,
548
-        $var_name = '',
549
-        $file = '',
550
-        $line = '',
551
-        $heading_tag = 5,
552
-        $die = false
553
-    ) {
554
-        // return;
555
-        $file = str_replace(rtrim(ABSPATH, '\\/'), '', $file);
556
-        $margin = is_admin() ? ' 180px' : '0';
557
-        // $print_r = false;
558
-        if (is_string($var)) {
559
-            EEH_Debug_Tools::printv($var, $var_name, $file, $line, $heading_tag, $die, $margin);
560
-            return;
561
-        }
562
-        if (is_object($var)) {
563
-            $var_name = ! $var_name ? 'object' : $var_name;
564
-            // $print_r = true;
565
-        } elseif (is_array($var)) {
566
-            $var_name = ! $var_name ? 'array' : $var_name;
567
-            // $print_r = true;
568
-        } elseif (is_numeric($var)) {
569
-            $var_name = ! $var_name ? 'numeric' : $var_name;
570
-        } elseif ($var === null) {
571
-            $var_name = ! $var_name ? 'null' : $var_name;
572
-        }
573
-        $var_name = ucwords(str_replace(array('$', '_'), array('', ' '), $var_name));
574
-        $heading_tag = EEH_Debug_Tools::headingTag($heading_tag);
575
-        $result = EEH_Debug_Tools::headingSpacer($heading_tag);
576
-        $result .= EEH_Debug_Tools::heading($var_name, $heading_tag, $margin, $line);
577
-        $result .= EEH_Debug_Tools::grey_span(' : ') . EEH_Debug_Tools::orange_span(
578
-            EEH_Debug_Tools::pre_span($var)
579
-        );
580
-        $result .= EEH_Debug_Tools::file_and_line($file, $line, $heading_tag);
581
-        $result .= EEH_Debug_Tools::headingX($heading_tag);
582
-        if ($die) {
583
-            die($result);
584
-        }
585
-        echo $result;
586
-    }
587
-
588
-
589
-
590
-    /******************** deprecated ********************/
591
-
592
-
593
-
594
-    /**
595
-     * @deprecated 4.9.39.rc.034
596
-     */
597
-    public function reset_times()
598
-    {
599
-        Benchmark::resetTimes();
600
-    }
601
-
602
-
603
-
604
-    /**
605
-     * @deprecated 4.9.39.rc.034
606
-     * @param null $timer_name
607
-     */
608
-    public function start_timer($timer_name = null)
609
-    {
610
-        Benchmark::startTimer($timer_name);
611
-    }
612
-
613
-
614
-
615
-    /**
616
-     * @deprecated 4.9.39.rc.034
617
-     * @param string $timer_name
618
-     */
619
-    public function stop_timer($timer_name = '')
620
-    {
621
-        Benchmark::stopTimer($timer_name);
622
-    }
623
-
624
-
625
-
626
-    /**
627
-     * @deprecated 4.9.39.rc.034
628
-     * @param string  $label      The label to show for this time eg "Start of calling Some_Class::some_function"
629
-     * @param boolean $output_now whether to echo now, or wait until EEH_Debug_Tools::show_times() is called
630
-     * @return void
631
-     */
632
-    public function measure_memory($label, $output_now = false)
633
-    {
634
-        Benchmark::measureMemory($label, $output_now);
635
-    }
636
-
637
-
638
-
639
-    /**
640
-     * @deprecated 4.9.39.rc.034
641
-     * @param int $size
642
-     * @return string
643
-     */
644
-    public function convert($size)
645
-    {
646
-        return Benchmark::convert($size);
647
-    }
648
-
649
-
650
-
651
-    /**
652
-     * @deprecated 4.9.39.rc.034
653
-     * @param bool $output_now
654
-     * @return string
655
-     */
656
-    public function show_times($output_now = true)
657
-    {
658
-        return Benchmark::displayResults($output_now);
659
-    }
660
-
661
-
662
-
663
-    /**
664
-     * @deprecated 4.9.39.rc.034
665
-     * @param string $timer_name
666
-     * @param float  $total_time
667
-     * @return string
668
-     */
669
-    public function format_time($timer_name, $total_time)
670
-    {
671
-        return Benchmark::formatTime($timer_name, $total_time);
672
-    }
14
+	/**
15
+	 *    instance of the EEH_Autoloader object
16
+	 *
17
+	 * @var    $_instance
18
+	 * @access    private
19
+	 */
20
+	private static $_instance;
21
+
22
+	/**
23
+	 * @var array
24
+	 */
25
+	protected $_memory_usage_points = array();
26
+
27
+
28
+
29
+	/**
30
+	 * @singleton method used to instantiate class object
31
+	 * @access    public
32
+	 * @return EEH_Debug_Tools
33
+	 */
34
+	public static function instance()
35
+	{
36
+		// check if class object is instantiated, and instantiated properly
37
+		if (! self::$_instance instanceof EEH_Debug_Tools) {
38
+			self::$_instance = new self();
39
+		}
40
+		return self::$_instance;
41
+	}
42
+
43
+
44
+
45
+	/**
46
+	 * private class constructor
47
+	 */
48
+	private function __construct()
49
+	{
50
+		// load Kint PHP debugging library
51
+		if (! class_exists('Kint') && file_exists(EE_PLUGIN_DIR_PATH . 'tests' . DS . 'kint' . DS . 'Kint.class.php')) {
52
+			// despite EE4 having a check for an existing copy of the Kint debugging class,
53
+			// if another plugin was loaded AFTER EE4 and they did NOT perform a similar check,
54
+			// then hilarity would ensue as PHP throws a "Cannot redeclare class Kint" error
55
+			// so we've moved it to our test folder so that it is not included with production releases
56
+			// plz use https://wordpress.org/plugins/kint-debugger/  if testing production versions of EE
57
+			require_once(EE_PLUGIN_DIR_PATH . 'tests' . DS . 'kint' . DS . 'Kint.class.php');
58
+		}
59
+		// if ( ! defined('DOING_AJAX') || $_REQUEST['noheader'] !== 'true' || ! isset( $_REQUEST['noheader'], $_REQUEST['TB_iframe'] ) ) {
60
+		// add_action( 'shutdown', array($this,'espresso_session_footer_dump') );
61
+		// }
62
+		$plugin = basename(EE_PLUGIN_DIR_PATH);
63
+		add_action("activate_{$plugin}", array('EEH_Debug_Tools', 'ee_plugin_activation_errors'));
64
+		add_action('activated_plugin', array('EEH_Debug_Tools', 'ee_plugin_activation_errors'));
65
+		add_action('shutdown', array('EEH_Debug_Tools', 'show_db_name'));
66
+	}
67
+
68
+
69
+
70
+	/**
71
+	 *    show_db_name
72
+	 *
73
+	 * @return void
74
+	 */
75
+	public static function show_db_name()
76
+	{
77
+		if (! defined('DOING_AJAX') && (defined('EE_ERROR_EMAILS') && EE_ERROR_EMAILS)) {
78
+			echo '<p style="font-size:10px;font-weight:normal;color:#E76700;margin: 1em 2em; text-align: right;">DB_NAME: '
79
+				 . DB_NAME
80
+				 . '</p>';
81
+		}
82
+		if (EE_DEBUG) {
83
+			Benchmark::displayResults();
84
+		}
85
+	}
86
+
87
+
88
+
89
+	/**
90
+	 *    dump EE_Session object at bottom of page after everything else has happened
91
+	 *
92
+	 * @return void
93
+	 */
94
+	public function espresso_session_footer_dump()
95
+	{
96
+		if ((defined('WP_DEBUG') && WP_DEBUG)
97
+			&& ! defined('DOING_AJAX')
98
+			&& class_exists('Kint')
99
+			&& function_exists('wp_get_current_user')
100
+			&& current_user_can('update_core')
101
+			&& class_exists('EE_Registry')
102
+		) {
103
+			Kint::dump(EE_Registry::instance()->SSN->id());
104
+			Kint::dump(EE_Registry::instance()->SSN);
105
+			//          Kint::dump( EE_Registry::instance()->SSN->get_session_data('cart')->get_tickets() );
106
+			$this->espresso_list_hooked_functions();
107
+			Benchmark::displayResults();
108
+		}
109
+	}
110
+
111
+
112
+
113
+	/**
114
+	 *    List All Hooked Functions
115
+	 *    to list all functions for a specific hook, add ee_list_hooks={hook-name} to URL
116
+	 *    http://wp.smashingmagazine.com/2009/08/18/10-useful-wordpress-hook-hacks/
117
+	 *
118
+	 * @param string $tag
119
+	 * @return void
120
+	 */
121
+	public function espresso_list_hooked_functions($tag = '')
122
+	{
123
+		global $wp_filter;
124
+		echo '<br/><br/><br/><h3>Hooked Functions</h3>';
125
+		if ($tag) {
126
+			$hook[ $tag ] = $wp_filter[ $tag ];
127
+			if (! is_array($hook[ $tag ])) {
128
+				trigger_error("Nothing found for '$tag' hook", E_USER_WARNING);
129
+				return;
130
+			}
131
+			echo '<h5>For Tag: ' . $tag . '</h5>';
132
+		} else {
133
+			$hook = is_array($wp_filter) ? $wp_filter : array($wp_filter);
134
+			ksort($hook);
135
+		}
136
+		foreach ($hook as $tag_name => $priorities) {
137
+			echo "<br />&gt;&gt;&gt;&gt;&gt;\t<strong>$tag_name</strong><br />";
138
+			ksort($priorities);
139
+			foreach ($priorities as $priority => $function) {
140
+				echo $priority;
141
+				foreach ($function as $name => $properties) {
142
+					echo "\t$name<br />";
143
+				}
144
+			}
145
+		}
146
+	}
147
+
148
+
149
+
150
+	/**
151
+	 *    registered_filter_callbacks
152
+	 *
153
+	 * @param string $hook_name
154
+	 * @return array
155
+	 */
156
+	public static function registered_filter_callbacks($hook_name = '')
157
+	{
158
+		$filters = array();
159
+		global $wp_filter;
160
+		if (isset($wp_filter[ $hook_name ])) {
161
+			$filters[ $hook_name ] = array();
162
+			foreach ($wp_filter[ $hook_name ] as $priority => $callbacks) {
163
+				$filters[ $hook_name ][ $priority ] = array();
164
+				foreach ($callbacks as $callback) {
165
+					$filters[ $hook_name ][ $priority ][] = $callback['function'];
166
+				}
167
+			}
168
+		}
169
+		return $filters;
170
+	}
171
+
172
+
173
+
174
+	/**
175
+	 *    captures plugin activation errors for debugging
176
+	 *
177
+	 * @return void
178
+	 * @throws EE_Error
179
+	 */
180
+	public static function ee_plugin_activation_errors()
181
+	{
182
+		if (WP_DEBUG) {
183
+			$activation_errors = ob_get_contents();
184
+			if (! empty($activation_errors)) {
185
+				$activation_errors = date('Y-m-d H:i:s') . "\n" . $activation_errors;
186
+			}
187
+			espresso_load_required('EEH_File', EE_HELPERS . 'EEH_File.helper.php');
188
+			if (class_exists('EEH_File')) {
189
+				try {
190
+					EEH_File::ensure_file_exists_and_is_writable(
191
+						EVENT_ESPRESSO_UPLOAD_DIR . 'logs' . DS . 'espresso_plugin_activation_errors.html'
192
+					);
193
+					EEH_File::write_to_file(
194
+						EVENT_ESPRESSO_UPLOAD_DIR . 'logs' . DS . 'espresso_plugin_activation_errors.html',
195
+						$activation_errors
196
+					);
197
+				} catch (EE_Error $e) {
198
+					EE_Error::add_error(
199
+						sprintf(
200
+							__(
201
+								'The Event Espresso activation errors file could not be setup because: %s',
202
+								'event_espresso'
203
+							),
204
+							$e->getMessage()
205
+						),
206
+						__FILE__,
207
+						__FUNCTION__,
208
+						__LINE__
209
+					);
210
+				}
211
+			} else {
212
+				// old school attempt
213
+				file_put_contents(
214
+					EVENT_ESPRESSO_UPLOAD_DIR . 'logs' . DS . 'espresso_plugin_activation_errors.html',
215
+					$activation_errors
216
+				);
217
+			}
218
+			$activation_errors = get_option('ee_plugin_activation_errors', '') . $activation_errors;
219
+			update_option('ee_plugin_activation_errors', $activation_errors);
220
+		}
221
+	}
222
+
223
+
224
+
225
+	/**
226
+	 * This basically mimics the WordPress _doing_it_wrong() function except adds our own messaging etc.
227
+	 * Very useful for providing helpful messages to developers when the method of doing something has been deprecated,
228
+	 * or we want to make sure they use something the right way.
229
+	 *
230
+	 * @access public
231
+	 * @param string $function      The function that was called
232
+	 * @param string $message       A message explaining what has been done incorrectly
233
+	 * @param string $version       The version of Event Espresso where the error was added
234
+	 * @param string $applies_when  a version string for when you want the doing_it_wrong notice to begin appearing
235
+	 *                              for a deprecated function. This allows deprecation to occur during one version,
236
+	 *                              but not have any notices appear until a later version. This allows developers
237
+	 *                              extra time to update their code before notices appear.
238
+	 * @param int    $error_type
239
+	 * @uses   trigger_error()
240
+	 */
241
+	public function doing_it_wrong(
242
+		$function,
243
+		$message,
244
+		$version,
245
+		$applies_when = '',
246
+		$error_type = null
247
+	) {
248
+		$applies_when = ! empty($applies_when) ? $applies_when : espresso_version();
249
+		$error_type = $error_type !== null ? $error_type : E_USER_NOTICE;
250
+		// because we swapped the parameter order around for the last two params,
251
+		// let's verify that some third party isn't still passing an error type value for the third param
252
+		if (is_int($applies_when)) {
253
+			$error_type = $applies_when;
254
+			$applies_when = espresso_version();
255
+		}
256
+		// if not displaying notices yet, then just leave
257
+		if (version_compare(espresso_version(), $applies_when, '<')) {
258
+			return;
259
+		}
260
+		do_action('AHEE__EEH_Debug_Tools__doing_it_wrong_run', $function, $message, $version);
261
+		$version = $version === null
262
+			? ''
263
+			: sprintf(
264
+				__('(This message was added in version %s of Event Espresso)', 'event_espresso'),
265
+				$version
266
+			);
267
+		$error_message = sprintf(
268
+			esc_html__('%1$s was called %2$sincorrectly%3$s. %4$s %5$s', 'event_espresso'),
269
+			$function,
270
+			'<strong>',
271
+			'</strong>',
272
+			$message,
273
+			$version
274
+		);
275
+		// don't trigger error if doing ajax,
276
+		// instead we'll add a transient EE_Error notice that in theory should show on the next request.
277
+		if (defined('DOING_AJAX') && DOING_AJAX) {
278
+			$error_message .= ' ' . esc_html__(
279
+				'This is a doing_it_wrong message that was triggered during an ajax request.  The request params on this request were: ',
280
+				'event_espresso'
281
+			);
282
+			$error_message .= '<ul><li>';
283
+			$error_message .= implode('</li><li>', EE_Registry::instance()->REQ->params());
284
+			$error_message .= '</ul>';
285
+			EE_Error::add_error($error_message, 'debug::doing_it_wrong', $function, '42');
286
+			// now we set this on the transient so it shows up on the next request.
287
+			EE_Error::get_notices(false, true);
288
+		} else {
289
+			trigger_error($error_message, $error_type);
290
+		}
291
+	}
292
+
293
+
294
+
295
+
296
+	/**
297
+	 * Logger helpers
298
+	 */
299
+	/**
300
+	 * debug
301
+	 *
302
+	 * @param string $class
303
+	 * @param string $func
304
+	 * @param string $line
305
+	 * @param array  $info
306
+	 * @param bool   $display_request
307
+	 * @param string $debug_index
308
+	 * @param string $debug_key
309
+	 * @throws EE_Error
310
+	 * @throws \EventEspresso\core\exceptions\InvalidSessionDataException
311
+	 */
312
+	public static function log(
313
+		$class = '',
314
+		$func = '',
315
+		$line = '',
316
+		$info = array(),
317
+		$display_request = false,
318
+		$debug_index = '',
319
+		$debug_key = 'EE_DEBUG_SPCO'
320
+	) {
321
+		if (WP_DEBUG) {
322
+			$debug_key = $debug_key . '_' . EE_Session::instance()->id();
323
+			$debug_data = get_option($debug_key, array());
324
+			$default_data = array(
325
+				$class => $func . '() : ' . $line,
326
+				'REQ'  => $display_request ? $_REQUEST : '',
327
+			);
328
+			// don't serialize objects
329
+			$info = self::strip_objects($info);
330
+			$index = ! empty($debug_index) ? $debug_index : 0;
331
+			if (! isset($debug_data[ $index ])) {
332
+				$debug_data[ $index ] = array();
333
+			}
334
+			$debug_data[ $index ][ microtime() ] = array_merge($default_data, $info);
335
+			update_option($debug_key, $debug_data);
336
+		}
337
+	}
338
+
339
+
340
+
341
+	/**
342
+	 * strip_objects
343
+	 *
344
+	 * @param array $info
345
+	 * @return array
346
+	 */
347
+	public static function strip_objects($info = array())
348
+	{
349
+		foreach ($info as $key => $value) {
350
+			if (is_array($value)) {
351
+				$info[ $key ] = self::strip_objects($value);
352
+			} elseif (is_object($value)) {
353
+				$object_class = get_class($value);
354
+				$info[ $object_class ] = array();
355
+				$info[ $object_class ]['ID'] = method_exists($value, 'ID') ? $value->ID() : spl_object_hash($value);
356
+				if (method_exists($value, 'ID')) {
357
+					$info[ $object_class ]['ID'] = $value->ID();
358
+				}
359
+				if (method_exists($value, 'status')) {
360
+					$info[ $object_class ]['status'] = $value->status();
361
+				} elseif (method_exists($value, 'status_ID')) {
362
+					$info[ $object_class ]['status'] = $value->status_ID();
363
+				}
364
+				unset($info[ $key ]);
365
+			}
366
+		}
367
+		return (array) $info;
368
+	}
369
+
370
+
371
+
372
+	/**
373
+	 * @param mixed      $var
374
+	 * @param string     $var_name
375
+	 * @param string     $file
376
+	 * @param int|string $line
377
+	 * @param int|string $heading_tag
378
+	 * @param bool       $die
379
+	 * @param string     $margin
380
+	 */
381
+	public static function printv(
382
+		$var,
383
+		$var_name = '',
384
+		$file = '',
385
+		$line = '',
386
+		$heading_tag = 5,
387
+		$die = false,
388
+		$margin = ''
389
+	) {
390
+		$var_name = ! $var_name ? 'string' : $var_name;
391
+		$var_name = ucwords(str_replace('$', '', $var_name));
392
+		$is_method = method_exists($var_name, $var);
393
+		$var_name = ucwords(str_replace('_', ' ', $var_name));
394
+		$heading_tag = EEH_Debug_Tools::headingTag($heading_tag);
395
+		$result = EEH_Debug_Tools::headingSpacer($heading_tag);
396
+		$result .= EEH_Debug_Tools::heading($var_name, $heading_tag, $margin, $line);
397
+		$result .= $is_method
398
+			? EEH_Debug_Tools::grey_span('::') . EEH_Debug_Tools::orange_span($var . '()')
399
+			: EEH_Debug_Tools::grey_span(' : ') . EEH_Debug_Tools::orange_span($var);
400
+		$result .= EEH_Debug_Tools::file_and_line($file, $line, $heading_tag);
401
+		$result .= EEH_Debug_Tools::headingX($heading_tag);
402
+		if ($die) {
403
+			die($result);
404
+		}
405
+		echo $result;
406
+	}
407
+
408
+
409
+	protected static function headingTag($heading_tag)
410
+	{
411
+		$heading_tag = absint($heading_tag);
412
+		return $heading_tag > 0 && $heading_tag < 7 ? "h{$heading_tag}" : 'h5';
413
+	}
414
+
415
+
416
+	protected static function headingSpacer($heading_tag)
417
+	{
418
+		return EEH_Debug_Tools::plainOutput() && ($heading_tag === 'h1' || $heading_tag === 'h2')
419
+			? "\n"
420
+			: '';
421
+	}
422
+
423
+
424
+	protected static function plainOutput()
425
+	{
426
+		return defined('EE_TESTS_DIR') || (defined('DOING_AJAX') && DOING_AJAX);
427
+	}
428
+
429
+
430
+	/**
431
+	 * @param string $var_name
432
+	 * @param string $heading_tag
433
+	 * @param string $margin
434
+	 * @param int    $line
435
+	 * @return string
436
+	 */
437
+	protected static function heading($var_name = '', $heading_tag = 'h5', $margin = '', $line = 0)
438
+	{
439
+		if (EEH_Debug_Tools::plainOutput()) {
440
+			$heading = '';
441
+			if ($heading_tag === 'h1' || $heading_tag === 'h2') {
442
+				$heading .= "\n";
443
+			}
444
+			$heading .= "\n{$line}) {$var_name}";
445
+			return $heading;
446
+		}
447
+		$margin = "25px 0 0 {$margin}";
448
+		return '<' . $heading_tag . ' style="color:#2EA2CC; margin:' . $margin . ';"><b>' . $var_name . '</b>';
449
+	}
450
+
451
+
452
+
453
+	/**
454
+	 * @param string $heading_tag
455
+	 * @return string
456
+	 */
457
+	protected static function headingX($heading_tag = 'h5')
458
+	{
459
+		if (EEH_Debug_Tools::plainOutput()) {
460
+			return '';
461
+		}
462
+		return '</' . $heading_tag . '>';
463
+	}
464
+
465
+
466
+
467
+	/**
468
+	 * @param string $content
469
+	 * @return string
470
+	 */
471
+	protected static function grey_span($content = '')
472
+	{
473
+		if (EEH_Debug_Tools::plainOutput()) {
474
+			return $content;
475
+		}
476
+		return '<span style="color:#999">' . $content . '</span>';
477
+	}
478
+
479
+
480
+
481
+	/**
482
+	 * @param string $file
483
+	 * @param int    $line
484
+	 * @return string
485
+	 */
486
+	protected static function file_and_line($file, $line, $heading_tag)
487
+	{
488
+		if ($file === '' || $line === '') {
489
+			return '';
490
+		}
491
+		$file = str_replace(EE_PLUGIN_DIR_PATH, '/', $file);
492
+		if (EEH_Debug_Tools::plainOutput()) {
493
+			if ($heading_tag === 'h1' || $heading_tag === 'h2') {
494
+				return " ({$file})";
495
+			}
496
+			return '';
497
+		}
498
+		return '<br /><span style="font-size:9px;font-weight:normal;color:#666;line-height: 12px;">'
499
+			   . $file
500
+			   . '<br />line no: '
501
+			   . $line
502
+			   . '</span>';
503
+	}
504
+
505
+
506
+
507
+	/**
508
+	 * @param string $content
509
+	 * @return string
510
+	 */
511
+	protected static function orange_span($content = '')
512
+	{
513
+		if (EEH_Debug_Tools::plainOutput()) {
514
+			return $content;
515
+		}
516
+		return '<span style="color:#E76700">' . $content . '</span>';
517
+	}
518
+
519
+
520
+
521
+	/**
522
+	 * @param mixed $var
523
+	 * @return string
524
+	 */
525
+	protected static function pre_span($var)
526
+	{
527
+		ob_start();
528
+		var_dump($var);
529
+		$var = ob_get_clean();
530
+		if (EEH_Debug_Tools::plainOutput()) {
531
+			return $var;
532
+		}
533
+		return '<pre style="color:#999; padding:1em; background: #fff">' . $var . '</pre>';
534
+	}
535
+
536
+
537
+
538
+	/**
539
+	 * @param mixed      $var
540
+	 * @param string     $var_name
541
+	 * @param string     $file
542
+	 * @param int|string $line
543
+	 * @param int|string $heading_tag
544
+	 * @param bool       $die
545
+	 */
546
+	public static function printr(
547
+		$var,
548
+		$var_name = '',
549
+		$file = '',
550
+		$line = '',
551
+		$heading_tag = 5,
552
+		$die = false
553
+	) {
554
+		// return;
555
+		$file = str_replace(rtrim(ABSPATH, '\\/'), '', $file);
556
+		$margin = is_admin() ? ' 180px' : '0';
557
+		// $print_r = false;
558
+		if (is_string($var)) {
559
+			EEH_Debug_Tools::printv($var, $var_name, $file, $line, $heading_tag, $die, $margin);
560
+			return;
561
+		}
562
+		if (is_object($var)) {
563
+			$var_name = ! $var_name ? 'object' : $var_name;
564
+			// $print_r = true;
565
+		} elseif (is_array($var)) {
566
+			$var_name = ! $var_name ? 'array' : $var_name;
567
+			// $print_r = true;
568
+		} elseif (is_numeric($var)) {
569
+			$var_name = ! $var_name ? 'numeric' : $var_name;
570
+		} elseif ($var === null) {
571
+			$var_name = ! $var_name ? 'null' : $var_name;
572
+		}
573
+		$var_name = ucwords(str_replace(array('$', '_'), array('', ' '), $var_name));
574
+		$heading_tag = EEH_Debug_Tools::headingTag($heading_tag);
575
+		$result = EEH_Debug_Tools::headingSpacer($heading_tag);
576
+		$result .= EEH_Debug_Tools::heading($var_name, $heading_tag, $margin, $line);
577
+		$result .= EEH_Debug_Tools::grey_span(' : ') . EEH_Debug_Tools::orange_span(
578
+			EEH_Debug_Tools::pre_span($var)
579
+		);
580
+		$result .= EEH_Debug_Tools::file_and_line($file, $line, $heading_tag);
581
+		$result .= EEH_Debug_Tools::headingX($heading_tag);
582
+		if ($die) {
583
+			die($result);
584
+		}
585
+		echo $result;
586
+	}
587
+
588
+
589
+
590
+	/******************** deprecated ********************/
591
+
592
+
593
+
594
+	/**
595
+	 * @deprecated 4.9.39.rc.034
596
+	 */
597
+	public function reset_times()
598
+	{
599
+		Benchmark::resetTimes();
600
+	}
601
+
602
+
603
+
604
+	/**
605
+	 * @deprecated 4.9.39.rc.034
606
+	 * @param null $timer_name
607
+	 */
608
+	public function start_timer($timer_name = null)
609
+	{
610
+		Benchmark::startTimer($timer_name);
611
+	}
612
+
613
+
614
+
615
+	/**
616
+	 * @deprecated 4.9.39.rc.034
617
+	 * @param string $timer_name
618
+	 */
619
+	public function stop_timer($timer_name = '')
620
+	{
621
+		Benchmark::stopTimer($timer_name);
622
+	}
623
+
624
+
625
+
626
+	/**
627
+	 * @deprecated 4.9.39.rc.034
628
+	 * @param string  $label      The label to show for this time eg "Start of calling Some_Class::some_function"
629
+	 * @param boolean $output_now whether to echo now, or wait until EEH_Debug_Tools::show_times() is called
630
+	 * @return void
631
+	 */
632
+	public function measure_memory($label, $output_now = false)
633
+	{
634
+		Benchmark::measureMemory($label, $output_now);
635
+	}
636
+
637
+
638
+
639
+	/**
640
+	 * @deprecated 4.9.39.rc.034
641
+	 * @param int $size
642
+	 * @return string
643
+	 */
644
+	public function convert($size)
645
+	{
646
+		return Benchmark::convert($size);
647
+	}
648
+
649
+
650
+
651
+	/**
652
+	 * @deprecated 4.9.39.rc.034
653
+	 * @param bool $output_now
654
+	 * @return string
655
+	 */
656
+	public function show_times($output_now = true)
657
+	{
658
+		return Benchmark::displayResults($output_now);
659
+	}
660
+
661
+
662
+
663
+	/**
664
+	 * @deprecated 4.9.39.rc.034
665
+	 * @param string $timer_name
666
+	 * @param float  $total_time
667
+	 * @return string
668
+	 */
669
+	public function format_time($timer_name, $total_time)
670
+	{
671
+		return Benchmark::formatTime($timer_name, $total_time);
672
+	}
673 673
 }
674 674
 
675 675
 
@@ -679,31 +679,31 @@  discard block
 block discarded – undo
679 679
  * Plugin URI: http://upthemes.com/plugins/kint-debugger/
680 680
  */
681 681
 if (class_exists('Kint') && ! function_exists('dump_wp_query')) {
682
-    function dump_wp_query()
683
-    {
684
-        global $wp_query;
685
-        d($wp_query);
686
-    }
682
+	function dump_wp_query()
683
+	{
684
+		global $wp_query;
685
+		d($wp_query);
686
+	}
687 687
 }
688 688
 /**
689 689
  * borrowed from Kint Debugger
690 690
  * Plugin URI: http://upthemes.com/plugins/kint-debugger/
691 691
  */
692 692
 if (class_exists('Kint') && ! function_exists('dump_wp')) {
693
-    function dump_wp()
694
-    {
695
-        global $wp;
696
-        d($wp);
697
-    }
693
+	function dump_wp()
694
+	{
695
+		global $wp;
696
+		d($wp);
697
+	}
698 698
 }
699 699
 /**
700 700
  * borrowed from Kint Debugger
701 701
  * Plugin URI: http://upthemes.com/plugins/kint-debugger/
702 702
  */
703 703
 if (class_exists('Kint') && ! function_exists('dump_post')) {
704
-    function dump_post()
705
-    {
706
-        global $post;
707
-        d($post);
708
-    }
704
+	function dump_post()
705
+	{
706
+		global $post;
707
+		d($post);
708
+	}
709 709
 }
Please login to merge, or discard this patch.
Spacing   +40 added lines, -40 removed lines patch added patch discarded remove patch
@@ -34,7 +34,7 @@  discard block
 block discarded – undo
34 34
     public static function instance()
35 35
     {
36 36
         // check if class object is instantiated, and instantiated properly
37
-        if (! self::$_instance instanceof EEH_Debug_Tools) {
37
+        if ( ! self::$_instance instanceof EEH_Debug_Tools) {
38 38
             self::$_instance = new self();
39 39
         }
40 40
         return self::$_instance;
@@ -48,13 +48,13 @@  discard block
 block discarded – undo
48 48
     private function __construct()
49 49
     {
50 50
         // load Kint PHP debugging library
51
-        if (! class_exists('Kint') && file_exists(EE_PLUGIN_DIR_PATH . 'tests' . DS . 'kint' . DS . 'Kint.class.php')) {
51
+        if ( ! class_exists('Kint') && file_exists(EE_PLUGIN_DIR_PATH.'tests'.DS.'kint'.DS.'Kint.class.php')) {
52 52
             // despite EE4 having a check for an existing copy of the Kint debugging class,
53 53
             // if another plugin was loaded AFTER EE4 and they did NOT perform a similar check,
54 54
             // then hilarity would ensue as PHP throws a "Cannot redeclare class Kint" error
55 55
             // so we've moved it to our test folder so that it is not included with production releases
56 56
             // plz use https://wordpress.org/plugins/kint-debugger/  if testing production versions of EE
57
-            require_once(EE_PLUGIN_DIR_PATH . 'tests' . DS . 'kint' . DS . 'Kint.class.php');
57
+            require_once(EE_PLUGIN_DIR_PATH.'tests'.DS.'kint'.DS.'Kint.class.php');
58 58
         }
59 59
         // if ( ! defined('DOING_AJAX') || $_REQUEST['noheader'] !== 'true' || ! isset( $_REQUEST['noheader'], $_REQUEST['TB_iframe'] ) ) {
60 60
         // add_action( 'shutdown', array($this,'espresso_session_footer_dump') );
@@ -74,7 +74,7 @@  discard block
 block discarded – undo
74 74
      */
75 75
     public static function show_db_name()
76 76
     {
77
-        if (! defined('DOING_AJAX') && (defined('EE_ERROR_EMAILS') && EE_ERROR_EMAILS)) {
77
+        if ( ! defined('DOING_AJAX') && (defined('EE_ERROR_EMAILS') && EE_ERROR_EMAILS)) {
78 78
             echo '<p style="font-size:10px;font-weight:normal;color:#E76700;margin: 1em 2em; text-align: right;">DB_NAME: '
79 79
                  . DB_NAME
80 80
                  . '</p>';
@@ -123,12 +123,12 @@  discard block
 block discarded – undo
123 123
         global $wp_filter;
124 124
         echo '<br/><br/><br/><h3>Hooked Functions</h3>';
125 125
         if ($tag) {
126
-            $hook[ $tag ] = $wp_filter[ $tag ];
127
-            if (! is_array($hook[ $tag ])) {
126
+            $hook[$tag] = $wp_filter[$tag];
127
+            if ( ! is_array($hook[$tag])) {
128 128
                 trigger_error("Nothing found for '$tag' hook", E_USER_WARNING);
129 129
                 return;
130 130
             }
131
-            echo '<h5>For Tag: ' . $tag . '</h5>';
131
+            echo '<h5>For Tag: '.$tag.'</h5>';
132 132
         } else {
133 133
             $hook = is_array($wp_filter) ? $wp_filter : array($wp_filter);
134 134
             ksort($hook);
@@ -157,12 +157,12 @@  discard block
 block discarded – undo
157 157
     {
158 158
         $filters = array();
159 159
         global $wp_filter;
160
-        if (isset($wp_filter[ $hook_name ])) {
161
-            $filters[ $hook_name ] = array();
162
-            foreach ($wp_filter[ $hook_name ] as $priority => $callbacks) {
163
-                $filters[ $hook_name ][ $priority ] = array();
160
+        if (isset($wp_filter[$hook_name])) {
161
+            $filters[$hook_name] = array();
162
+            foreach ($wp_filter[$hook_name] as $priority => $callbacks) {
163
+                $filters[$hook_name][$priority] = array();
164 164
                 foreach ($callbacks as $callback) {
165
-                    $filters[ $hook_name ][ $priority ][] = $callback['function'];
165
+                    $filters[$hook_name][$priority][] = $callback['function'];
166 166
                 }
167 167
             }
168 168
         }
@@ -181,17 +181,17 @@  discard block
 block discarded – undo
181 181
     {
182 182
         if (WP_DEBUG) {
183 183
             $activation_errors = ob_get_contents();
184
-            if (! empty($activation_errors)) {
185
-                $activation_errors = date('Y-m-d H:i:s') . "\n" . $activation_errors;
184
+            if ( ! empty($activation_errors)) {
185
+                $activation_errors = date('Y-m-d H:i:s')."\n".$activation_errors;
186 186
             }
187
-            espresso_load_required('EEH_File', EE_HELPERS . 'EEH_File.helper.php');
187
+            espresso_load_required('EEH_File', EE_HELPERS.'EEH_File.helper.php');
188 188
             if (class_exists('EEH_File')) {
189 189
                 try {
190 190
                     EEH_File::ensure_file_exists_and_is_writable(
191
-                        EVENT_ESPRESSO_UPLOAD_DIR . 'logs' . DS . 'espresso_plugin_activation_errors.html'
191
+                        EVENT_ESPRESSO_UPLOAD_DIR.'logs'.DS.'espresso_plugin_activation_errors.html'
192 192
                     );
193 193
                     EEH_File::write_to_file(
194
-                        EVENT_ESPRESSO_UPLOAD_DIR . 'logs' . DS . 'espresso_plugin_activation_errors.html',
194
+                        EVENT_ESPRESSO_UPLOAD_DIR.'logs'.DS.'espresso_plugin_activation_errors.html',
195 195
                         $activation_errors
196 196
                     );
197 197
                 } catch (EE_Error $e) {
@@ -211,11 +211,11 @@  discard block
 block discarded – undo
211 211
             } else {
212 212
                 // old school attempt
213 213
                 file_put_contents(
214
-                    EVENT_ESPRESSO_UPLOAD_DIR . 'logs' . DS . 'espresso_plugin_activation_errors.html',
214
+                    EVENT_ESPRESSO_UPLOAD_DIR.'logs'.DS.'espresso_plugin_activation_errors.html',
215 215
                     $activation_errors
216 216
                 );
217 217
             }
218
-            $activation_errors = get_option('ee_plugin_activation_errors', '') . $activation_errors;
218
+            $activation_errors = get_option('ee_plugin_activation_errors', '').$activation_errors;
219 219
             update_option('ee_plugin_activation_errors', $activation_errors);
220 220
         }
221 221
     }
@@ -275,7 +275,7 @@  discard block
 block discarded – undo
275 275
         // don't trigger error if doing ajax,
276 276
         // instead we'll add a transient EE_Error notice that in theory should show on the next request.
277 277
         if (defined('DOING_AJAX') && DOING_AJAX) {
278
-            $error_message .= ' ' . esc_html__(
278
+            $error_message .= ' '.esc_html__(
279 279
                 'This is a doing_it_wrong message that was triggered during an ajax request.  The request params on this request were: ',
280 280
                 'event_espresso'
281 281
             );
@@ -319,19 +319,19 @@  discard block
 block discarded – undo
319 319
         $debug_key = 'EE_DEBUG_SPCO'
320 320
     ) {
321 321
         if (WP_DEBUG) {
322
-            $debug_key = $debug_key . '_' . EE_Session::instance()->id();
322
+            $debug_key = $debug_key.'_'.EE_Session::instance()->id();
323 323
             $debug_data = get_option($debug_key, array());
324 324
             $default_data = array(
325
-                $class => $func . '() : ' . $line,
325
+                $class => $func.'() : '.$line,
326 326
                 'REQ'  => $display_request ? $_REQUEST : '',
327 327
             );
328 328
             // don't serialize objects
329 329
             $info = self::strip_objects($info);
330 330
             $index = ! empty($debug_index) ? $debug_index : 0;
331
-            if (! isset($debug_data[ $index ])) {
332
-                $debug_data[ $index ] = array();
331
+            if ( ! isset($debug_data[$index])) {
332
+                $debug_data[$index] = array();
333 333
             }
334
-            $debug_data[ $index ][ microtime() ] = array_merge($default_data, $info);
334
+            $debug_data[$index][microtime()] = array_merge($default_data, $info);
335 335
             update_option($debug_key, $debug_data);
336 336
         }
337 337
     }
@@ -348,20 +348,20 @@  discard block
 block discarded – undo
348 348
     {
349 349
         foreach ($info as $key => $value) {
350 350
             if (is_array($value)) {
351
-                $info[ $key ] = self::strip_objects($value);
351
+                $info[$key] = self::strip_objects($value);
352 352
             } elseif (is_object($value)) {
353 353
                 $object_class = get_class($value);
354
-                $info[ $object_class ] = array();
355
-                $info[ $object_class ]['ID'] = method_exists($value, 'ID') ? $value->ID() : spl_object_hash($value);
354
+                $info[$object_class] = array();
355
+                $info[$object_class]['ID'] = method_exists($value, 'ID') ? $value->ID() : spl_object_hash($value);
356 356
                 if (method_exists($value, 'ID')) {
357
-                    $info[ $object_class ]['ID'] = $value->ID();
357
+                    $info[$object_class]['ID'] = $value->ID();
358 358
                 }
359 359
                 if (method_exists($value, 'status')) {
360
-                    $info[ $object_class ]['status'] = $value->status();
360
+                    $info[$object_class]['status'] = $value->status();
361 361
                 } elseif (method_exists($value, 'status_ID')) {
362
-                    $info[ $object_class ]['status'] = $value->status_ID();
362
+                    $info[$object_class]['status'] = $value->status_ID();
363 363
                 }
364
-                unset($info[ $key ]);
364
+                unset($info[$key]);
365 365
             }
366 366
         }
367 367
         return (array) $info;
@@ -395,8 +395,8 @@  discard block
 block discarded – undo
395 395
         $result = EEH_Debug_Tools::headingSpacer($heading_tag);
396 396
         $result .= EEH_Debug_Tools::heading($var_name, $heading_tag, $margin, $line);
397 397
         $result .= $is_method
398
-            ? EEH_Debug_Tools::grey_span('::') . EEH_Debug_Tools::orange_span($var . '()')
399
-            : EEH_Debug_Tools::grey_span(' : ') . EEH_Debug_Tools::orange_span($var);
398
+            ? EEH_Debug_Tools::grey_span('::').EEH_Debug_Tools::orange_span($var.'()')
399
+            : EEH_Debug_Tools::grey_span(' : ').EEH_Debug_Tools::orange_span($var);
400 400
         $result .= EEH_Debug_Tools::file_and_line($file, $line, $heading_tag);
401 401
         $result .= EEH_Debug_Tools::headingX($heading_tag);
402 402
         if ($die) {
@@ -445,7 +445,7 @@  discard block
 block discarded – undo
445 445
             return $heading;
446 446
         }
447 447
         $margin = "25px 0 0 {$margin}";
448
-        return '<' . $heading_tag . ' style="color:#2EA2CC; margin:' . $margin . ';"><b>' . $var_name . '</b>';
448
+        return '<'.$heading_tag.' style="color:#2EA2CC; margin:'.$margin.';"><b>'.$var_name.'</b>';
449 449
     }
450 450
 
451 451
 
@@ -459,7 +459,7 @@  discard block
 block discarded – undo
459 459
         if (EEH_Debug_Tools::plainOutput()) {
460 460
             return '';
461 461
         }
462
-        return '</' . $heading_tag . '>';
462
+        return '</'.$heading_tag.'>';
463 463
     }
464 464
 
465 465
 
@@ -473,7 +473,7 @@  discard block
 block discarded – undo
473 473
         if (EEH_Debug_Tools::plainOutput()) {
474 474
             return $content;
475 475
         }
476
-        return '<span style="color:#999">' . $content . '</span>';
476
+        return '<span style="color:#999">'.$content.'</span>';
477 477
     }
478 478
 
479 479
 
@@ -513,7 +513,7 @@  discard block
 block discarded – undo
513 513
         if (EEH_Debug_Tools::plainOutput()) {
514 514
             return $content;
515 515
         }
516
-        return '<span style="color:#E76700">' . $content . '</span>';
516
+        return '<span style="color:#E76700">'.$content.'</span>';
517 517
     }
518 518
 
519 519
 
@@ -530,7 +530,7 @@  discard block
 block discarded – undo
530 530
         if (EEH_Debug_Tools::plainOutput()) {
531 531
             return $var;
532 532
         }
533
-        return '<pre style="color:#999; padding:1em; background: #fff">' . $var . '</pre>';
533
+        return '<pre style="color:#999; padding:1em; background: #fff">'.$var.'</pre>';
534 534
     }
535 535
 
536 536
 
@@ -574,7 +574,7 @@  discard block
 block discarded – undo
574 574
         $heading_tag = EEH_Debug_Tools::headingTag($heading_tag);
575 575
         $result = EEH_Debug_Tools::headingSpacer($heading_tag);
576 576
         $result .= EEH_Debug_Tools::heading($var_name, $heading_tag, $margin, $line);
577
-        $result .= EEH_Debug_Tools::grey_span(' : ') . EEH_Debug_Tools::orange_span(
577
+        $result .= EEH_Debug_Tools::grey_span(' : ').EEH_Debug_Tools::orange_span(
578 578
             EEH_Debug_Tools::pre_span($var)
579 579
         );
580 580
         $result .= EEH_Debug_Tools::file_and_line($file, $line, $heading_tag);
Please login to merge, or discard this patch.
core/services/loaders/ClassInterfaceCache.php 2 patches
Indentation   +156 added lines, -156 removed lines patch added patch discarded remove patch
@@ -20,160 +20,160 @@
 block discarded – undo
20 20
 class ClassInterfaceCache
21 21
 {
22 22
 
23
-    /**
24
-     * array of interfaces indexed by FQCNs where values are arrays of interface FQNs
25
-     *
26
-     * @var string[][] $interfaces
27
-     */
28
-    private $interfaces = array();
29
-
30
-    /**
31
-     * @type string[][] $aliases
32
-     */
33
-    protected $aliases = array();
34
-
35
-
36
-    /**
37
-     * @param string $fqn
38
-     * @return string
39
-     */
40
-    public function getFqn($fqn)
41
-    {
42
-        return $fqn instanceof FullyQualifiedName ? $fqn->string() : $fqn;
43
-    }
44
-
45
-
46
-    /**
47
-     * @param string $fqn
48
-     * @return array
49
-     */
50
-    public function getInterfaces($fqn)
51
-    {
52
-        $fqn = $this->getFqn($fqn);
53
-        // have we already seen this FQCN ?
54
-        if (! array_key_exists($fqn, $this->interfaces)) {
55
-            $this->interfaces[ $fqn ] = array();
56
-            if (class_exists($fqn)) {
57
-                $this->interfaces[ $fqn ] = class_implements($fqn, false);
58
-                $this->interfaces[ $fqn ] = $this->interfaces[ $fqn ] !== false
59
-                    ? $this->interfaces[ $fqn ]
60
-                    : array();
61
-            }
62
-        }
63
-        return $this->interfaces[ $fqn ];
64
-    }
65
-
66
-
67
-    /**
68
-     * @param string $fqn
69
-     * @param string $interface
70
-     * @return bool
71
-     */
72
-    public function hasInterface($fqn, $interface)
73
-    {
74
-        $fqn        = $this->getFqn($fqn);
75
-        $interfaces = $this->getInterfaces($fqn);
76
-        return in_array($interface, $interfaces, true);
77
-    }
78
-
79
-
80
-    /**
81
-     * adds an alias for a classname
82
-     *
83
-     * @param string $fqn       the class name that should be used (concrete class to replace interface)
84
-     * @param string $alias     the class name that would be type hinted for (abstract parent or interface)
85
-     * @param string $for_class the class that has the dependency (is type hinting for the interface)
86
-     */
87
-    public function addAlias($fqn, $alias, $for_class = '')
88
-    {
89
-        $fqn   = $this->getFqn($fqn);
90
-        $alias = $this->getFqn($alias);
91
-        // are we adding an alias for a specific class?
92
-        if ($for_class !== '') {
93
-            // make sure it's set up as an array
94
-            if (! isset($this->aliases[ $for_class ])) {
95
-                $this->aliases[ $for_class ] = array();
96
-            }
97
-            $this->aliases[ $for_class ][ $alias ] = $fqn;
98
-            return;
99
-        }
100
-        $this->aliases[ $alias ] = $fqn;
101
-    }
102
-
103
-
104
-    /**
105
-     * returns TRUE if the provided FQN is an alias
106
-     *
107
-     * @param string $fqn
108
-     * @param string $for_class
109
-     * @return bool
110
-     */
111
-    public function isAlias($fqn = '', $for_class = '')
112
-    {
113
-        $fqn = $this->getFqn($fqn);
114
-        if ($this->isAliasForClass($fqn, $for_class)) {
115
-            return true;
116
-        }
117
-        if ($for_class === '' && $this->isDirectAlias($fqn)) {
118
-            return true;
119
-        }
120
-        return false;
121
-    }
122
-
123
-
124
-    /**
125
-     * returns TRUE if the provided FQN is an alias
126
-     *
127
-     * @param string $fqn
128
-     * @return bool
129
-     */
130
-    protected function isDirectAlias($fqn = '')
131
-    {
132
-        return isset($this->aliases[ (string) $fqn ]) && ! is_array($this->aliases[ (string) $fqn ]);
133
-    }
134
-
135
-
136
-    /**
137
-     * returns TRUE if the provided FQN is an alias for the specified class
138
-     *
139
-     * @param string $fqn
140
-     * @param string $for_class
141
-     * @return bool
142
-     */
143
-    protected function isAliasForClass($fqn = '', $for_class = '')
144
-    {
145
-        return (
146
-            $for_class !== ''
147
-            && isset($this->aliases[ (string) $for_class ][ (string) $fqn ])
148
-        );
149
-    }
150
-
151
-
152
-    /**
153
-     * returns FQN for provided alias if one exists, otherwise returns the original FQN
154
-     * functions recursively, so that multiple aliases can be used to drill down to a FQN
155
-     *  for example:
156
-     *      if the following two entries were added to the aliases array:
157
-     *          array(
158
-     *              'interface_alias'           => 'some\namespace\interface'
159
-     *              'some\namespace\interface'  => 'some\namespace\classname'
160
-     *          )
161
-     *      then one could use Loader::getNew( 'interface_alias' )
162
-     *      to load an instance of 'some\namespace\classname'
163
-     *
164
-     * @param string $alias
165
-     * @param string $for_class
166
-     * @return string
167
-     */
168
-    public function getFqnForAlias($alias = '', $for_class = '')
169
-    {
170
-        $alias = $this->getFqn($alias);
171
-        if ($this->isAliasForClass($alias, $for_class)) {
172
-            return $this->getFqnForAlias($this->aliases[ (string) $for_class ][ (string) $alias ], $for_class);
173
-        }
174
-        if ($this->isDirectAlias($alias)) {
175
-            return $this->getFqnForAlias($this->aliases[ (string) $alias ], '');
176
-        }
177
-        return $alias;
178
-    }
23
+	/**
24
+	 * array of interfaces indexed by FQCNs where values are arrays of interface FQNs
25
+	 *
26
+	 * @var string[][] $interfaces
27
+	 */
28
+	private $interfaces = array();
29
+
30
+	/**
31
+	 * @type string[][] $aliases
32
+	 */
33
+	protected $aliases = array();
34
+
35
+
36
+	/**
37
+	 * @param string $fqn
38
+	 * @return string
39
+	 */
40
+	public function getFqn($fqn)
41
+	{
42
+		return $fqn instanceof FullyQualifiedName ? $fqn->string() : $fqn;
43
+	}
44
+
45
+
46
+	/**
47
+	 * @param string $fqn
48
+	 * @return array
49
+	 */
50
+	public function getInterfaces($fqn)
51
+	{
52
+		$fqn = $this->getFqn($fqn);
53
+		// have we already seen this FQCN ?
54
+		if (! array_key_exists($fqn, $this->interfaces)) {
55
+			$this->interfaces[ $fqn ] = array();
56
+			if (class_exists($fqn)) {
57
+				$this->interfaces[ $fqn ] = class_implements($fqn, false);
58
+				$this->interfaces[ $fqn ] = $this->interfaces[ $fqn ] !== false
59
+					? $this->interfaces[ $fqn ]
60
+					: array();
61
+			}
62
+		}
63
+		return $this->interfaces[ $fqn ];
64
+	}
65
+
66
+
67
+	/**
68
+	 * @param string $fqn
69
+	 * @param string $interface
70
+	 * @return bool
71
+	 */
72
+	public function hasInterface($fqn, $interface)
73
+	{
74
+		$fqn        = $this->getFqn($fqn);
75
+		$interfaces = $this->getInterfaces($fqn);
76
+		return in_array($interface, $interfaces, true);
77
+	}
78
+
79
+
80
+	/**
81
+	 * adds an alias for a classname
82
+	 *
83
+	 * @param string $fqn       the class name that should be used (concrete class to replace interface)
84
+	 * @param string $alias     the class name that would be type hinted for (abstract parent or interface)
85
+	 * @param string $for_class the class that has the dependency (is type hinting for the interface)
86
+	 */
87
+	public function addAlias($fqn, $alias, $for_class = '')
88
+	{
89
+		$fqn   = $this->getFqn($fqn);
90
+		$alias = $this->getFqn($alias);
91
+		// are we adding an alias for a specific class?
92
+		if ($for_class !== '') {
93
+			// make sure it's set up as an array
94
+			if (! isset($this->aliases[ $for_class ])) {
95
+				$this->aliases[ $for_class ] = array();
96
+			}
97
+			$this->aliases[ $for_class ][ $alias ] = $fqn;
98
+			return;
99
+		}
100
+		$this->aliases[ $alias ] = $fqn;
101
+	}
102
+
103
+
104
+	/**
105
+	 * returns TRUE if the provided FQN is an alias
106
+	 *
107
+	 * @param string $fqn
108
+	 * @param string $for_class
109
+	 * @return bool
110
+	 */
111
+	public function isAlias($fqn = '', $for_class = '')
112
+	{
113
+		$fqn = $this->getFqn($fqn);
114
+		if ($this->isAliasForClass($fqn, $for_class)) {
115
+			return true;
116
+		}
117
+		if ($for_class === '' && $this->isDirectAlias($fqn)) {
118
+			return true;
119
+		}
120
+		return false;
121
+	}
122
+
123
+
124
+	/**
125
+	 * returns TRUE if the provided FQN is an alias
126
+	 *
127
+	 * @param string $fqn
128
+	 * @return bool
129
+	 */
130
+	protected function isDirectAlias($fqn = '')
131
+	{
132
+		return isset($this->aliases[ (string) $fqn ]) && ! is_array($this->aliases[ (string) $fqn ]);
133
+	}
134
+
135
+
136
+	/**
137
+	 * returns TRUE if the provided FQN is an alias for the specified class
138
+	 *
139
+	 * @param string $fqn
140
+	 * @param string $for_class
141
+	 * @return bool
142
+	 */
143
+	protected function isAliasForClass($fqn = '', $for_class = '')
144
+	{
145
+		return (
146
+			$for_class !== ''
147
+			&& isset($this->aliases[ (string) $for_class ][ (string) $fqn ])
148
+		);
149
+	}
150
+
151
+
152
+	/**
153
+	 * returns FQN for provided alias if one exists, otherwise returns the original FQN
154
+	 * functions recursively, so that multiple aliases can be used to drill down to a FQN
155
+	 *  for example:
156
+	 *      if the following two entries were added to the aliases array:
157
+	 *          array(
158
+	 *              'interface_alias'           => 'some\namespace\interface'
159
+	 *              'some\namespace\interface'  => 'some\namespace\classname'
160
+	 *          )
161
+	 *      then one could use Loader::getNew( 'interface_alias' )
162
+	 *      to load an instance of 'some\namespace\classname'
163
+	 *
164
+	 * @param string $alias
165
+	 * @param string $for_class
166
+	 * @return string
167
+	 */
168
+	public function getFqnForAlias($alias = '', $for_class = '')
169
+	{
170
+		$alias = $this->getFqn($alias);
171
+		if ($this->isAliasForClass($alias, $for_class)) {
172
+			return $this->getFqnForAlias($this->aliases[ (string) $for_class ][ (string) $alias ], $for_class);
173
+		}
174
+		if ($this->isDirectAlias($alias)) {
175
+			return $this->getFqnForAlias($this->aliases[ (string) $alias ], '');
176
+		}
177
+		return $alias;
178
+	}
179 179
 }
Please login to merge, or discard this patch.
Spacing   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -51,16 +51,16 @@  discard block
 block discarded – undo
51 51
     {
52 52
         $fqn = $this->getFqn($fqn);
53 53
         // have we already seen this FQCN ?
54
-        if (! array_key_exists($fqn, $this->interfaces)) {
55
-            $this->interfaces[ $fqn ] = array();
54
+        if ( ! array_key_exists($fqn, $this->interfaces)) {
55
+            $this->interfaces[$fqn] = array();
56 56
             if (class_exists($fqn)) {
57
-                $this->interfaces[ $fqn ] = class_implements($fqn, false);
58
-                $this->interfaces[ $fqn ] = $this->interfaces[ $fqn ] !== false
59
-                    ? $this->interfaces[ $fqn ]
57
+                $this->interfaces[$fqn] = class_implements($fqn, false);
58
+                $this->interfaces[$fqn] = $this->interfaces[$fqn] !== false
59
+                    ? $this->interfaces[$fqn]
60 60
                     : array();
61 61
             }
62 62
         }
63
-        return $this->interfaces[ $fqn ];
63
+        return $this->interfaces[$fqn];
64 64
     }
65 65
 
66 66
 
@@ -91,13 +91,13 @@  discard block
 block discarded – undo
91 91
         // are we adding an alias for a specific class?
92 92
         if ($for_class !== '') {
93 93
             // make sure it's set up as an array
94
-            if (! isset($this->aliases[ $for_class ])) {
95
-                $this->aliases[ $for_class ] = array();
94
+            if ( ! isset($this->aliases[$for_class])) {
95
+                $this->aliases[$for_class] = array();
96 96
             }
97
-            $this->aliases[ $for_class ][ $alias ] = $fqn;
97
+            $this->aliases[$for_class][$alias] = $fqn;
98 98
             return;
99 99
         }
100
-        $this->aliases[ $alias ] = $fqn;
100
+        $this->aliases[$alias] = $fqn;
101 101
     }
102 102
 
103 103
 
@@ -129,7 +129,7 @@  discard block
 block discarded – undo
129 129
      */
130 130
     protected function isDirectAlias($fqn = '')
131 131
     {
132
-        return isset($this->aliases[ (string) $fqn ]) && ! is_array($this->aliases[ (string) $fqn ]);
132
+        return isset($this->aliases[(string) $fqn]) && ! is_array($this->aliases[(string) $fqn]);
133 133
     }
134 134
 
135 135
 
@@ -144,7 +144,7 @@  discard block
 block discarded – undo
144 144
     {
145 145
         return (
146 146
             $for_class !== ''
147
-            && isset($this->aliases[ (string) $for_class ][ (string) $fqn ])
147
+            && isset($this->aliases[(string) $for_class][(string) $fqn])
148 148
         );
149 149
     }
150 150
 
@@ -169,10 +169,10 @@  discard block
 block discarded – undo
169 169
     {
170 170
         $alias = $this->getFqn($alias);
171 171
         if ($this->isAliasForClass($alias, $for_class)) {
172
-            return $this->getFqnForAlias($this->aliases[ (string) $for_class ][ (string) $alias ], $for_class);
172
+            return $this->getFqnForAlias($this->aliases[(string) $for_class][(string) $alias], $for_class);
173 173
         }
174 174
         if ($this->isDirectAlias($alias)) {
175
-            return $this->getFqnForAlias($this->aliases[ (string) $alias ], '');
175
+            return $this->getFqnForAlias($this->aliases[(string) $alias], '');
176 176
         }
177 177
         return $alias;
178 178
     }
Please login to merge, or discard this patch.
core/domain/services/custom_post_types/RegisterCustomPostTypes.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -61,7 +61,7 @@
 block discarded – undo
61 61
     {
62 62
         $custom_post_types = $this->custom_post_types->getDefinitions();
63 63
         foreach ($custom_post_types as $custom_post_type => $CPT) {
64
-            $this->wp_post_types[ $custom_post_type ] = $this->registerCustomPostType(
64
+            $this->wp_post_types[$custom_post_type] = $this->registerCustomPostType(
65 65
                 $custom_post_type,
66 66
                 $CPT['singular_name'],
67 67
                 $CPT['plural_name'],
Please login to merge, or discard this patch.
Indentation   +221 added lines, -221 removed lines patch added patch discarded remove patch
@@ -18,240 +18,240 @@
 block discarded – undo
18 18
 class RegisterCustomPostTypes
19 19
 {
20 20
 
21
-    /**
22
-     * @var CustomPostTypeDefinitions $custom_post_types
23
-     */
24
-    public $custom_post_types;
21
+	/**
22
+	 * @var CustomPostTypeDefinitions $custom_post_types
23
+	 */
24
+	public $custom_post_types;
25 25
 
26
-    /**
27
-     * @var WP_Post_Type[] $wp_post_types
28
-     */
29
-    public $wp_post_types = array();
26
+	/**
27
+	 * @var WP_Post_Type[] $wp_post_types
28
+	 */
29
+	public $wp_post_types = array();
30 30
 
31 31
 
32
-    /**
33
-     * RegisterCustomPostTypes constructor.
34
-     *
35
-     * @param CustomPostTypeDefinitions $custom_post_types
36
-     */
37
-    public function __construct(CustomPostTypeDefinitions $custom_post_types)
38
-    {
39
-        $this->custom_post_types = $custom_post_types;
40
-    }
32
+	/**
33
+	 * RegisterCustomPostTypes constructor.
34
+	 *
35
+	 * @param CustomPostTypeDefinitions $custom_post_types
36
+	 */
37
+	public function __construct(CustomPostTypeDefinitions $custom_post_types)
38
+	{
39
+		$this->custom_post_types = $custom_post_types;
40
+	}
41 41
 
42 42
 
43
-    /**
44
-     * @return WP_Post_Type[]
45
-     */
46
-    public function getRegisteredCustomPostTypes()
47
-    {
48
-        return $this->wp_post_types;
49
-    }
43
+	/**
44
+	 * @return WP_Post_Type[]
45
+	 */
46
+	public function getRegisteredCustomPostTypes()
47
+	{
48
+		return $this->wp_post_types;
49
+	}
50 50
 
51 51
 
52
-    /**
53
-     * @return void
54
-     * @throws DomainException
55
-     */
56
-    public function registerCustomPostTypes()
57
-    {
58
-        $custom_post_types = $this->custom_post_types->getDefinitions();
59
-        foreach ($custom_post_types as $custom_post_type => $CPT) {
60
-            $this->wp_post_types[ $custom_post_type ] = $this->registerCustomPostType(
61
-                $custom_post_type,
62
-                $CPT['singular_name'],
63
-                $CPT['plural_name'],
64
-                $CPT['singular_slug'],
65
-                $CPT['plural_slug'],
66
-                $CPT['args']
67
-            );
68
-        }
69
-    }
52
+	/**
53
+	 * @return void
54
+	 * @throws DomainException
55
+	 */
56
+	public function registerCustomPostTypes()
57
+	{
58
+		$custom_post_types = $this->custom_post_types->getDefinitions();
59
+		foreach ($custom_post_types as $custom_post_type => $CPT) {
60
+			$this->wp_post_types[ $custom_post_type ] = $this->registerCustomPostType(
61
+				$custom_post_type,
62
+				$CPT['singular_name'],
63
+				$CPT['plural_name'],
64
+				$CPT['singular_slug'],
65
+				$CPT['plural_slug'],
66
+				$CPT['args']
67
+			);
68
+		}
69
+	}
70 70
 
71 71
 
72
-    /**
73
-     * Registers a new custom post type. Sets default settings given only the following params.
74
-     * Returns the registered post type object, or an error object.
75
-     *
76
-     * @param string $post_type          the actual post type name
77
-     *                                   IMPORTANT:
78
-     *                                   this must match what the slug is for admin pages related to this CPT
79
-     *                                   Also any models must use this slug as well
80
-     * @param string $singular_name      a pre-internationalized string for the singular name of the objects
81
-     * @param string $plural_name        a pre-internationalized string for the plural name of the objects
82
-     * @param string $singular_slug
83
-     * @param string $plural_slug
84
-     * @param array  $override_arguments exactly like $args as described in
85
-     *                                   http://codex.wordpress.org/Function_Reference/register_post_type
86
-     * @return WP_Post_Type|WP_Error
87
-     * @throws DomainException
88
-     */
89
-    public function registerCustomPostType(
90
-        $post_type,
91
-        $singular_name,
92
-        $plural_name,
93
-        $singular_slug = '',
94
-        $plural_slug = '',
95
-        array $override_arguments = array()
96
-    ) {
97
-        $wp_post_type = register_post_type(
98
-            $post_type,
99
-            $this->prepareArguments(
100
-                $post_type,
101
-                $singular_name,
102
-                $plural_name,
103
-                $singular_slug,
104
-                $plural_slug,
105
-                $override_arguments
106
-            )
107
-        );
108
-        if ($wp_post_type instanceof WP_Error) {
109
-            throw new DomainException($wp_post_type->get_error_message());
110
-        }
111
-        return $wp_post_type;
112
-    }
72
+	/**
73
+	 * Registers a new custom post type. Sets default settings given only the following params.
74
+	 * Returns the registered post type object, or an error object.
75
+	 *
76
+	 * @param string $post_type          the actual post type name
77
+	 *                                   IMPORTANT:
78
+	 *                                   this must match what the slug is for admin pages related to this CPT
79
+	 *                                   Also any models must use this slug as well
80
+	 * @param string $singular_name      a pre-internationalized string for the singular name of the objects
81
+	 * @param string $plural_name        a pre-internationalized string for the plural name of the objects
82
+	 * @param string $singular_slug
83
+	 * @param string $plural_slug
84
+	 * @param array  $override_arguments exactly like $args as described in
85
+	 *                                   http://codex.wordpress.org/Function_Reference/register_post_type
86
+	 * @return WP_Post_Type|WP_Error
87
+	 * @throws DomainException
88
+	 */
89
+	public function registerCustomPostType(
90
+		$post_type,
91
+		$singular_name,
92
+		$plural_name,
93
+		$singular_slug = '',
94
+		$plural_slug = '',
95
+		array $override_arguments = array()
96
+	) {
97
+		$wp_post_type = register_post_type(
98
+			$post_type,
99
+			$this->prepareArguments(
100
+				$post_type,
101
+				$singular_name,
102
+				$plural_name,
103
+				$singular_slug,
104
+				$plural_slug,
105
+				$override_arguments
106
+			)
107
+		);
108
+		if ($wp_post_type instanceof WP_Error) {
109
+			throw new DomainException($wp_post_type->get_error_message());
110
+		}
111
+		return $wp_post_type;
112
+	}
113 113
 
114 114
 
115
-    /**
116
-     * @param string $post_type          the actual post type name
117
-     * @param string $singular_name      a pre-internationalized string for the singular name of the objects
118
-     * @param string $plural_name        a pre-internationalized string for the plural name of the objects
119
-     * @param string $singular_slug
120
-     * @param string $plural_slug
121
-     * @param array  $override_arguments The default values set in this function will be overridden
122
-     *                                   by whatever you set in $override_arguments
123
-     * @return array
124
-     */
125
-    protected function prepareArguments(
126
-        $post_type,
127
-        $singular_name,
128
-        $plural_name,
129
-        $singular_slug,
130
-        $plural_slug,
131
-        array $override_arguments = array()
132
-    ) {
133
-        // verify plural slug and singular slug, if they aren't we'll use $singular_name and $plural_name
134
-        $singular_slug = ! empty($singular_slug) ? $singular_slug : $singular_name;
135
-        $plural_slug = ! empty($plural_slug) ? $plural_slug : $plural_name;
136
-        $labels = $this->getLabels(
137
-            $singular_name,
138
-            $plural_name,
139
-            $singular_slug,
140
-            $plural_slug
141
-        );
142
-        // note the page_templates arg in the supports index is something specific to EE.
143
-        // WordPress doesn't actually have that in their register_post_type api.
144
-        $arguments = $this->getDefaultArguments($labels, $post_type, $plural_slug);
145
-        if ($override_arguments) {
146
-            if (isset($override_arguments['labels'])) {
147
-                $labels = array_merge($arguments['labels'], $override_arguments['labels']);
148
-            }
149
-            $arguments = array_merge($arguments, $override_arguments);
150
-            $arguments['labels'] = $labels;
151
-        }
152
-        return $arguments;
153
-    }
115
+	/**
116
+	 * @param string $post_type          the actual post type name
117
+	 * @param string $singular_name      a pre-internationalized string for the singular name of the objects
118
+	 * @param string $plural_name        a pre-internationalized string for the plural name of the objects
119
+	 * @param string $singular_slug
120
+	 * @param string $plural_slug
121
+	 * @param array  $override_arguments The default values set in this function will be overridden
122
+	 *                                   by whatever you set in $override_arguments
123
+	 * @return array
124
+	 */
125
+	protected function prepareArguments(
126
+		$post_type,
127
+		$singular_name,
128
+		$plural_name,
129
+		$singular_slug,
130
+		$plural_slug,
131
+		array $override_arguments = array()
132
+	) {
133
+		// verify plural slug and singular slug, if they aren't we'll use $singular_name and $plural_name
134
+		$singular_slug = ! empty($singular_slug) ? $singular_slug : $singular_name;
135
+		$plural_slug = ! empty($plural_slug) ? $plural_slug : $plural_name;
136
+		$labels = $this->getLabels(
137
+			$singular_name,
138
+			$plural_name,
139
+			$singular_slug,
140
+			$plural_slug
141
+		);
142
+		// note the page_templates arg in the supports index is something specific to EE.
143
+		// WordPress doesn't actually have that in their register_post_type api.
144
+		$arguments = $this->getDefaultArguments($labels, $post_type, $plural_slug);
145
+		if ($override_arguments) {
146
+			if (isset($override_arguments['labels'])) {
147
+				$labels = array_merge($arguments['labels'], $override_arguments['labels']);
148
+			}
149
+			$arguments = array_merge($arguments, $override_arguments);
150
+			$arguments['labels'] = $labels;
151
+		}
152
+		return $arguments;
153
+	}
154 154
 
155 155
 
156
-    /**
157
-     * @param string $singular_name
158
-     * @param string $plural_name
159
-     * @param string $singular_slug
160
-     * @param string $plural_slug
161
-     * @return array
162
-     */
163
-    private function getLabels($singular_name, $plural_name, $singular_slug, $plural_slug)
164
-    {
165
-        return array(
166
-            'name'               => $plural_name,
167
-            'singular_name'      => $singular_name,
168
-            'singular_slug'      => $singular_slug,
169
-            'plural_slug'        => $plural_slug,
170
-            'add_new'            => sprintf(
171
-                esc_html_x('Add %s', 'Add Event', 'event_espresso'),
172
-                $singular_name
173
-            ),
174
-            'add_new_item'       => sprintf(
175
-                esc_html_x('Add New %s', 'Add New Event', 'event_espresso'),
176
-                $singular_name
177
-            ),
178
-            'edit_item'          => sprintf(
179
-                esc_html_x('Edit %s', 'Edit Event', 'event_espresso'),
180
-                $singular_name
181
-            ),
182
-            'new_item'           => sprintf(
183
-                esc_html_x('New %s', 'New Event', 'event_espresso'),
184
-                $singular_name
185
-            ),
186
-            'all_items'          => sprintf(
187
-                esc_html_x('All %s', 'All Events', 'event_espresso'),
188
-                $plural_name
189
-            ),
190
-            'view_item'          => sprintf(
191
-                esc_html_x('View %s', 'View Event', 'event_espresso'),
192
-                $singular_name
193
-            ),
194
-            'search_items'       => sprintf(
195
-                esc_html_x('Search %s', 'Search Events', 'event_espresso'),
196
-                $plural_name
197
-            ),
198
-            'not_found'          => sprintf(
199
-                esc_html_x('No %s found', 'No Events found', 'event_espresso'),
200
-                $plural_name
201
-            ),
202
-            'not_found_in_trash' => sprintf(
203
-                esc_html_x('No %s found in Trash', 'No Events found in Trash', 'event_espresso'),
204
-                $plural_name
205
-            ),
206
-            'parent_item_colon'  => '',
207
-            'menu_name'          => $plural_name,
208
-        );
209
-    }
156
+	/**
157
+	 * @param string $singular_name
158
+	 * @param string $plural_name
159
+	 * @param string $singular_slug
160
+	 * @param string $plural_slug
161
+	 * @return array
162
+	 */
163
+	private function getLabels($singular_name, $plural_name, $singular_slug, $plural_slug)
164
+	{
165
+		return array(
166
+			'name'               => $plural_name,
167
+			'singular_name'      => $singular_name,
168
+			'singular_slug'      => $singular_slug,
169
+			'plural_slug'        => $plural_slug,
170
+			'add_new'            => sprintf(
171
+				esc_html_x('Add %s', 'Add Event', 'event_espresso'),
172
+				$singular_name
173
+			),
174
+			'add_new_item'       => sprintf(
175
+				esc_html_x('Add New %s', 'Add New Event', 'event_espresso'),
176
+				$singular_name
177
+			),
178
+			'edit_item'          => sprintf(
179
+				esc_html_x('Edit %s', 'Edit Event', 'event_espresso'),
180
+				$singular_name
181
+			),
182
+			'new_item'           => sprintf(
183
+				esc_html_x('New %s', 'New Event', 'event_espresso'),
184
+				$singular_name
185
+			),
186
+			'all_items'          => sprintf(
187
+				esc_html_x('All %s', 'All Events', 'event_espresso'),
188
+				$plural_name
189
+			),
190
+			'view_item'          => sprintf(
191
+				esc_html_x('View %s', 'View Event', 'event_espresso'),
192
+				$singular_name
193
+			),
194
+			'search_items'       => sprintf(
195
+				esc_html_x('Search %s', 'Search Events', 'event_espresso'),
196
+				$plural_name
197
+			),
198
+			'not_found'          => sprintf(
199
+				esc_html_x('No %s found', 'No Events found', 'event_espresso'),
200
+				$plural_name
201
+			),
202
+			'not_found_in_trash' => sprintf(
203
+				esc_html_x('No %s found in Trash', 'No Events found in Trash', 'event_espresso'),
204
+				$plural_name
205
+			),
206
+			'parent_item_colon'  => '',
207
+			'menu_name'          => $plural_name,
208
+		);
209
+	}
210 210
 
211 211
 
212
-    /**
213
-     * @param array  $labels
214
-     * @param string $post_type
215
-     * @param string $plural_slug
216
-     * @return array
217
-     */
218
-    private function getDefaultArguments(array $labels, $post_type, $plural_slug)
219
-    {
220
-        return array(
221
-            'labels'             => $labels,
222
-            'public'             => true,
223
-            'publicly_queryable' => true,
224
-            'show_ui'            => false,
225
-            'show_ee_ui'         => true,
226
-            'show_in_menu'       => false,
227
-            'show_in_nav_menus'  => false,
228
-            'query_var'          => true,
229
-            'rewrite'            => apply_filters(
230
-                'FHEE__EventEspresso_core_domain_entities_custom_post_types_RegisterCustomPostTypes__getDefaultArguments__rewrite',
231
-                // legacy filter applied for now,
232
-                // later on we'll run a has_filter($tag) check and throw a doing_it_wrong() notice
233
-                apply_filters(
234
-                    'FHEE__EE_Register_CPTs__register_CPT__rewrite',
235
-                    array('slug' => $plural_slug),
236
-                    $post_type
237
-                ),
238
-                $post_type,
239
-                $plural_slug
240
-            ),
241
-            'capability_type'    => 'post',
242
-            'map_meta_cap'       => true,
243
-            'has_archive'        => true,
244
-            'hierarchical'       => false,
245
-            'menu_position'      => null,
246
-            'supports'           => array(
247
-                'title',
248
-                'editor',
249
-                'author',
250
-                'thumbnail',
251
-                'excerpt',
252
-                'custom-fields',
253
-                'comments',
254
-            ),
255
-        );
256
-    }
212
+	/**
213
+	 * @param array  $labels
214
+	 * @param string $post_type
215
+	 * @param string $plural_slug
216
+	 * @return array
217
+	 */
218
+	private function getDefaultArguments(array $labels, $post_type, $plural_slug)
219
+	{
220
+		return array(
221
+			'labels'             => $labels,
222
+			'public'             => true,
223
+			'publicly_queryable' => true,
224
+			'show_ui'            => false,
225
+			'show_ee_ui'         => true,
226
+			'show_in_menu'       => false,
227
+			'show_in_nav_menus'  => false,
228
+			'query_var'          => true,
229
+			'rewrite'            => apply_filters(
230
+				'FHEE__EventEspresso_core_domain_entities_custom_post_types_RegisterCustomPostTypes__getDefaultArguments__rewrite',
231
+				// legacy filter applied for now,
232
+				// later on we'll run a has_filter($tag) check and throw a doing_it_wrong() notice
233
+				apply_filters(
234
+					'FHEE__EE_Register_CPTs__register_CPT__rewrite',
235
+					array('slug' => $plural_slug),
236
+					$post_type
237
+				),
238
+				$post_type,
239
+				$plural_slug
240
+			),
241
+			'capability_type'    => 'post',
242
+			'map_meta_cap'       => true,
243
+			'has_archive'        => true,
244
+			'hierarchical'       => false,
245
+			'menu_position'      => null,
246
+			'supports'           => array(
247
+				'title',
248
+				'editor',
249
+				'author',
250
+				'thumbnail',
251
+				'excerpt',
252
+				'custom-fields',
253
+				'comments',
254
+			),
255
+		);
256
+	}
257 257
 }
Please login to merge, or discard this patch.
core/services/collections/Collection.php 3 patches
Doc Comments   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -156,7 +156,7 @@  discard block
 block discarded – undo
156 156
      *
157 157
      * @access public
158 158
      * @param mixed $identifier
159
-     * @return mixed
159
+     * @return boolean
160 160
      */
161 161
     public function get($identifier)
162 162
     {
@@ -278,7 +278,7 @@  discard block
 block discarded – undo
278 278
      * advances pointer to the provided object
279 279
      *
280 280
      * @access public
281
-     * @param $object
281
+     * @param \EventEspresso\core\libraries\form_sections\form_handlers\SequentialStepForm $object
282 282
      * @return boolean
283 283
      */
284 284
     public function setCurrentUsingObject($object)
@@ -316,7 +316,7 @@  discard block
 block discarded – undo
316 316
      *
317 317
      * @see http://stackoverflow.com/a/8736013
318 318
      * @param $object
319
-     * @return boolean|int|string
319
+     * @return integer
320 320
      */
321 321
     public function indexOf($object)
322 322
     {
Please login to merge, or discard this patch.
Indentation   +467 added lines, -467 removed lines patch added patch discarded remove patch
@@ -21,471 +21,471 @@
 block discarded – undo
21 21
 class Collection extends SplObjectStorage implements CollectionInterface
22 22
 {
23 23
 
24
-    /**
25
-     * a unique string for identifying this collection
26
-     *
27
-     * @type string $collection_identifier
28
-     */
29
-    protected $collection_identifier;
30
-
31
-    /**
32
-     * an interface (or class) name to be used for restricting the type of objects added to the storage
33
-     * this should be set from within the child class constructor
34
-     *
35
-     * @type string $interface
36
-     */
37
-    protected $collection_interface;
38
-
39
-
40
-    /**
41
-     * Collection constructor
42
-     *
43
-     * @param string $collection_interface
44
-     * @throws InvalidInterfaceException
45
-     */
46
-    public function __construct($collection_interface)
47
-    {
48
-        $this->setCollectionInterface($collection_interface);
49
-        $this->setCollectionIdentifier();
50
-    }
51
-
52
-
53
-    /**
54
-     * @return string
55
-     */
56
-    public function collectionIdentifier()
57
-    {
58
-        return $this->collection_identifier;
59
-    }
60
-
61
-
62
-    /**
63
-     * creates a very readable unique 9 character identifier like:  CF2-532-DAC
64
-     * and appends it to the non-qualified class name, ex: ThingCollection-CF2-532-DAC
65
-     *
66
-     * @return void
67
-     */
68
-    protected function setCollectionIdentifier()
69
-    {
70
-        // hash a few collection details
71
-        $identifier = md5(spl_object_hash($this) . $this->collection_interface . time());
72
-        // grab a few characters from the start, middle, and end of the hash
73
-        $id = array();
74
-        for ($x = 0; $x < 19; $x += 9) {
75
-            $id[] = substr($identifier, $x, 3);
76
-        }
77
-        $identifier = basename(str_replace('\\', '/', get_class($this)));
78
-        $identifier .= '-' . strtoupper(implode('-', $id));
79
-        $this->collection_identifier = $identifier;
80
-    }
81
-
82
-
83
-    /**
84
-     * setCollectionInterface
85
-     *
86
-     * @access protected
87
-     * @param  string $collection_interface
88
-     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
89
-     */
90
-    protected function setCollectionInterface($collection_interface)
91
-    {
92
-        if (! (interface_exists($collection_interface) || class_exists($collection_interface))) {
93
-            throw new InvalidInterfaceException($collection_interface);
94
-        }
95
-        $this->collection_interface = $collection_interface;
96
-    }
97
-
98
-
99
-    /**
100
-     * add
101
-     * attaches an object to the Collection
102
-     * and sets any supplied data associated with the current iterator entry
103
-     * by calling EE_Object_Collection::set_identifier()
104
-     *
105
-     * @access public
106
-     * @param        $object
107
-     * @param  mixed $identifier
108
-     * @return bool
109
-     * @throws InvalidEntityException
110
-     * @throws DuplicateCollectionIdentifierException
111
-     */
112
-    public function add($object, $identifier = null)
113
-    {
114
-        if (! $object instanceof $this->collection_interface) {
115
-            throw new InvalidEntityException($object, $this->collection_interface);
116
-        }
117
-        if ($this->contains($object)) {
118
-            throw new DuplicateCollectionIdentifierException($identifier);
119
-        }
120
-        $this->attach($object);
121
-        $this->setIdentifier($object, $identifier);
122
-        return $this->contains($object);
123
-    }
124
-
125
-
126
-    /**
127
-     * setIdentifier
128
-     * Sets the data associated with an object in the Collection
129
-     * if no $identifier is supplied, then the spl_object_hash() is used
130
-     *
131
-     * @access public
132
-     * @param        $object
133
-     * @param  mixed $identifier
134
-     * @return bool
135
-     */
136
-    public function setIdentifier($object, $identifier = null)
137
-    {
138
-        $identifier = ! empty($identifier)
139
-            ? $identifier
140
-            : spl_object_hash($object);
141
-        $this->rewind();
142
-        while ($this->valid()) {
143
-            if ($object === $this->current()) {
144
-                $this->setInfo($identifier);
145
-                $this->rewind();
146
-                return true;
147
-            }
148
-            $this->next();
149
-        }
150
-        return false;
151
-    }
152
-
153
-
154
-    /**
155
-     * get
156
-     * finds and returns an object in the Collection based on the identifier that was set using addObject()
157
-     * PLZ NOTE: the pointer is reset to the beginning of the collection before returning
158
-     *
159
-     * @access public
160
-     * @param mixed $identifier
161
-     * @return mixed
162
-     */
163
-    public function get($identifier)
164
-    {
165
-        $this->rewind();
166
-        while ($this->valid()) {
167
-            if ($identifier === $this->getInfo()) {
168
-                $object = $this->current();
169
-                $this->rewind();
170
-                return $object;
171
-            }
172
-            $this->next();
173
-        }
174
-        return null;
175
-    }
176
-
177
-
178
-    /**
179
-     * has
180
-     * returns TRUE or FALSE
181
-     * depending on whether the object is within the Collection
182
-     * based on the supplied $identifier
183
-     *
184
-     * @access public
185
-     * @param  mixed $identifier
186
-     * @return bool
187
-     */
188
-    public function has($identifier)
189
-    {
190
-        $this->rewind();
191
-        while ($this->valid()) {
192
-            if ($identifier === $this->getInfo()) {
193
-                $this->rewind();
194
-                return true;
195
-            }
196
-            $this->next();
197
-        }
198
-        return false;
199
-    }
200
-
201
-
202
-    /**
203
-     * hasObject
204
-     * returns TRUE or FALSE depending on whether the supplied object is within the Collection
205
-     *
206
-     * @access public
207
-     * @param $object
208
-     * @return bool
209
-     */
210
-    public function hasObject($object)
211
-    {
212
-        return $this->contains($object);
213
-    }
214
-
215
-
216
-    /**
217
-     * hasObjects
218
-     * returns true if there are objects within the Collection, and false if it is empty
219
-     *
220
-     * @access public
221
-     * @return bool
222
-     */
223
-    public function hasObjects()
224
-    {
225
-        return $this->count() !== 0;
226
-    }
227
-
228
-
229
-    /**
230
-     * isEmpty
231
-     * returns true if there are no objects within the Collection, and false if there are
232
-     *
233
-     * @access public
234
-     * @return bool
235
-     */
236
-    public function isEmpty()
237
-    {
238
-        return $this->count() === 0;
239
-    }
240
-
241
-
242
-    /**
243
-     * remove
244
-     * detaches an object from the Collection
245
-     *
246
-     * @access public
247
-     * @param $object
248
-     * @return bool
249
-     */
250
-    public function remove($object)
251
-    {
252
-        $this->detach($object);
253
-        return true;
254
-    }
255
-
256
-
257
-    /**
258
-     * setCurrent
259
-     * advances pointer to the object whose identifier matches that which was provided
260
-     *
261
-     * @access public
262
-     * @param mixed $identifier
263
-     * @return boolean
264
-     */
265
-    public function setCurrent($identifier)
266
-    {
267
-        $this->rewind();
268
-        while ($this->valid()) {
269
-            if ($identifier === $this->getInfo()) {
270
-                return true;
271
-            }
272
-            $this->next();
273
-        }
274
-        return false;
275
-    }
276
-
277
-
278
-    /**
279
-     * setCurrentUsingObject
280
-     * advances pointer to the provided object
281
-     *
282
-     * @access public
283
-     * @param $object
284
-     * @return boolean
285
-     */
286
-    public function setCurrentUsingObject($object)
287
-    {
288
-        $this->rewind();
289
-        while ($this->valid()) {
290
-            if ($this->current() === $object) {
291
-                return true;
292
-            }
293
-            $this->next();
294
-        }
295
-        return false;
296
-    }
297
-
298
-
299
-    /**
300
-     * Returns the object occupying the index before the current object,
301
-     * unless this is already the first object, in which case it just returns the first object
302
-     *
303
-     * @return mixed
304
-     */
305
-    public function previous()
306
-    {
307
-        $index = $this->indexOf($this->current());
308
-        if ($index === 0) {
309
-            return $this->current();
310
-        }
311
-        $index--;
312
-        return $this->objectAtIndex($index);
313
-    }
314
-
315
-
316
-    /**
317
-     * Returns the index of a given object, or false if not found
318
-     *
319
-     * @see http://stackoverflow.com/a/8736013
320
-     * @param $object
321
-     * @return boolean|int|string
322
-     */
323
-    public function indexOf($object)
324
-    {
325
-        if (! $this->contains($object)) {
326
-            return false;
327
-        }
328
-        foreach ($this as $index => $obj) {
329
-            if ($obj === $object) {
330
-                return $index;
331
-            }
332
-        }
333
-        return false;
334
-    }
335
-
336
-
337
-    /**
338
-     * Returns the object at the given index
339
-     *
340
-     * @see http://stackoverflow.com/a/8736013
341
-     * @param int $index
342
-     * @return mixed
343
-     */
344
-    public function objectAtIndex($index)
345
-    {
346
-        $iterator = new LimitIterator($this, $index, 1);
347
-        $iterator->rewind();
348
-        return $iterator->current();
349
-    }
350
-
351
-
352
-    /**
353
-     * Returns the sequence of objects as specified by the offset and length
354
-     *
355
-     * @see http://stackoverflow.com/a/8736013
356
-     * @param int $offset
357
-     * @param int $length
358
-     * @return array
359
-     */
360
-    public function slice($offset, $length)
361
-    {
362
-        $slice = array();
363
-        $iterator = new LimitIterator($this, $offset, $length);
364
-        foreach ($iterator as $object) {
365
-            $slice[] = $object;
366
-        }
367
-        return $slice;
368
-    }
369
-
370
-
371
-    /**
372
-     * Inserts an object at a certain point
373
-     *
374
-     * @see http://stackoverflow.com/a/8736013
375
-     * @param mixed $object A single object
376
-     * @param int   $index
377
-     * @param mixed $identifier
378
-     * @return bool
379
-     * @throws DuplicateCollectionIdentifierException
380
-     * @throws InvalidEntityException
381
-     */
382
-    public function insertObjectAt($object, $index, $identifier = null)
383
-    {
384
-        // check to ensure that objects don't already exist in the collection
385
-        if ($this->has($identifier)) {
386
-            throw new DuplicateCollectionIdentifierException($identifier);
387
-        }
388
-        // detach any objects at or past this index
389
-        $remaining_objects = array();
390
-        if ($index < $this->count()) {
391
-            $remaining_objects = $this->slice($index, $this->count() - $index);
392
-            foreach ($remaining_objects as $key => $remaining_object) {
393
-                // we need to grab the identifiers for each object and use them as keys
394
-                $remaining_objects[ $remaining_object->getInfo() ] = $remaining_object;
395
-                // and then remove the object from the current tracking array
396
-                unset($remaining_objects[ $key ]);
397
-                // and then remove it from the Collection
398
-                $this->detach($remaining_object);
399
-            }
400
-        }
401
-        // add the new object we're splicing in
402
-        $this->add($object, $identifier);
403
-        // attach the objects we previously detached
404
-        foreach ($remaining_objects as $key => $remaining_object) {
405
-            $this->add($remaining_object, $key);
406
-        }
407
-        return $this->contains($object);
408
-    }
409
-
410
-
411
-    /**
412
-     * Inserts an object (or an array of objects) at a certain point
413
-     *
414
-     * @see http://stackoverflow.com/a/8736013
415
-     * @param mixed $objects A single object or an array of objects
416
-     * @param int   $index
417
-     */
418
-    public function insertAt($objects, $index)
419
-    {
420
-        if (! is_array($objects)) {
421
-            $objects = array($objects);
422
-        }
423
-        // check to ensure that objects don't already exist in the collection
424
-        foreach ($objects as $key => $object) {
425
-            if ($this->contains($object)) {
426
-                unset($objects[ $key ]);
427
-            }
428
-        }
429
-        // do we have any objects left?
430
-        if (! $objects) {
431
-            return;
432
-        }
433
-        // detach any objects at or past this index
434
-        $remaining = array();
435
-        if ($index < $this->count()) {
436
-            $remaining = $this->slice($index, $this->count() - $index);
437
-            foreach ($remaining as $object) {
438
-                $this->detach($object);
439
-            }
440
-        }
441
-        // add the new objects we're splicing in
442
-        foreach ($objects as $object) {
443
-            $this->attach($object);
444
-        }
445
-        // attach the objects we previously detached
446
-        foreach ($remaining as $object) {
447
-            $this->attach($object);
448
-        }
449
-    }
450
-
451
-
452
-    /**
453
-     * Removes the object at the given index
454
-     *
455
-     * @see http://stackoverflow.com/a/8736013
456
-     * @param int $index
457
-     */
458
-    public function removeAt($index)
459
-    {
460
-        $this->detach($this->objectAtIndex($index));
461
-    }
462
-
463
-
464
-    /**
465
-     * detaches ALL objects from the Collection
466
-     */
467
-    public function detachAll()
468
-    {
469
-        $this->rewind();
470
-        while ($this->valid()) {
471
-            $object = $this->current();
472
-            $this->next();
473
-            $this->detach($object);
474
-        }
475
-    }
476
-
477
-
478
-    /**
479
-     * unsets and detaches ALL objects from the Collection
480
-     */
481
-    public function trashAndDetachAll()
482
-    {
483
-        $this->rewind();
484
-        while ($this->valid()) {
485
-            $object = $this->current();
486
-            $this->next();
487
-            $this->detach($object);
488
-            unset($object);
489
-        }
490
-    }
24
+	/**
25
+	 * a unique string for identifying this collection
26
+	 *
27
+	 * @type string $collection_identifier
28
+	 */
29
+	protected $collection_identifier;
30
+
31
+	/**
32
+	 * an interface (or class) name to be used for restricting the type of objects added to the storage
33
+	 * this should be set from within the child class constructor
34
+	 *
35
+	 * @type string $interface
36
+	 */
37
+	protected $collection_interface;
38
+
39
+
40
+	/**
41
+	 * Collection constructor
42
+	 *
43
+	 * @param string $collection_interface
44
+	 * @throws InvalidInterfaceException
45
+	 */
46
+	public function __construct($collection_interface)
47
+	{
48
+		$this->setCollectionInterface($collection_interface);
49
+		$this->setCollectionIdentifier();
50
+	}
51
+
52
+
53
+	/**
54
+	 * @return string
55
+	 */
56
+	public function collectionIdentifier()
57
+	{
58
+		return $this->collection_identifier;
59
+	}
60
+
61
+
62
+	/**
63
+	 * creates a very readable unique 9 character identifier like:  CF2-532-DAC
64
+	 * and appends it to the non-qualified class name, ex: ThingCollection-CF2-532-DAC
65
+	 *
66
+	 * @return void
67
+	 */
68
+	protected function setCollectionIdentifier()
69
+	{
70
+		// hash a few collection details
71
+		$identifier = md5(spl_object_hash($this) . $this->collection_interface . time());
72
+		// grab a few characters from the start, middle, and end of the hash
73
+		$id = array();
74
+		for ($x = 0; $x < 19; $x += 9) {
75
+			$id[] = substr($identifier, $x, 3);
76
+		}
77
+		$identifier = basename(str_replace('\\', '/', get_class($this)));
78
+		$identifier .= '-' . strtoupper(implode('-', $id));
79
+		$this->collection_identifier = $identifier;
80
+	}
81
+
82
+
83
+	/**
84
+	 * setCollectionInterface
85
+	 *
86
+	 * @access protected
87
+	 * @param  string $collection_interface
88
+	 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
89
+	 */
90
+	protected function setCollectionInterface($collection_interface)
91
+	{
92
+		if (! (interface_exists($collection_interface) || class_exists($collection_interface))) {
93
+			throw new InvalidInterfaceException($collection_interface);
94
+		}
95
+		$this->collection_interface = $collection_interface;
96
+	}
97
+
98
+
99
+	/**
100
+	 * add
101
+	 * attaches an object to the Collection
102
+	 * and sets any supplied data associated with the current iterator entry
103
+	 * by calling EE_Object_Collection::set_identifier()
104
+	 *
105
+	 * @access public
106
+	 * @param        $object
107
+	 * @param  mixed $identifier
108
+	 * @return bool
109
+	 * @throws InvalidEntityException
110
+	 * @throws DuplicateCollectionIdentifierException
111
+	 */
112
+	public function add($object, $identifier = null)
113
+	{
114
+		if (! $object instanceof $this->collection_interface) {
115
+			throw new InvalidEntityException($object, $this->collection_interface);
116
+		}
117
+		if ($this->contains($object)) {
118
+			throw new DuplicateCollectionIdentifierException($identifier);
119
+		}
120
+		$this->attach($object);
121
+		$this->setIdentifier($object, $identifier);
122
+		return $this->contains($object);
123
+	}
124
+
125
+
126
+	/**
127
+	 * setIdentifier
128
+	 * Sets the data associated with an object in the Collection
129
+	 * if no $identifier is supplied, then the spl_object_hash() is used
130
+	 *
131
+	 * @access public
132
+	 * @param        $object
133
+	 * @param  mixed $identifier
134
+	 * @return bool
135
+	 */
136
+	public function setIdentifier($object, $identifier = null)
137
+	{
138
+		$identifier = ! empty($identifier)
139
+			? $identifier
140
+			: spl_object_hash($object);
141
+		$this->rewind();
142
+		while ($this->valid()) {
143
+			if ($object === $this->current()) {
144
+				$this->setInfo($identifier);
145
+				$this->rewind();
146
+				return true;
147
+			}
148
+			$this->next();
149
+		}
150
+		return false;
151
+	}
152
+
153
+
154
+	/**
155
+	 * get
156
+	 * finds and returns an object in the Collection based on the identifier that was set using addObject()
157
+	 * PLZ NOTE: the pointer is reset to the beginning of the collection before returning
158
+	 *
159
+	 * @access public
160
+	 * @param mixed $identifier
161
+	 * @return mixed
162
+	 */
163
+	public function get($identifier)
164
+	{
165
+		$this->rewind();
166
+		while ($this->valid()) {
167
+			if ($identifier === $this->getInfo()) {
168
+				$object = $this->current();
169
+				$this->rewind();
170
+				return $object;
171
+			}
172
+			$this->next();
173
+		}
174
+		return null;
175
+	}
176
+
177
+
178
+	/**
179
+	 * has
180
+	 * returns TRUE or FALSE
181
+	 * depending on whether the object is within the Collection
182
+	 * based on the supplied $identifier
183
+	 *
184
+	 * @access public
185
+	 * @param  mixed $identifier
186
+	 * @return bool
187
+	 */
188
+	public function has($identifier)
189
+	{
190
+		$this->rewind();
191
+		while ($this->valid()) {
192
+			if ($identifier === $this->getInfo()) {
193
+				$this->rewind();
194
+				return true;
195
+			}
196
+			$this->next();
197
+		}
198
+		return false;
199
+	}
200
+
201
+
202
+	/**
203
+	 * hasObject
204
+	 * returns TRUE or FALSE depending on whether the supplied object is within the Collection
205
+	 *
206
+	 * @access public
207
+	 * @param $object
208
+	 * @return bool
209
+	 */
210
+	public function hasObject($object)
211
+	{
212
+		return $this->contains($object);
213
+	}
214
+
215
+
216
+	/**
217
+	 * hasObjects
218
+	 * returns true if there are objects within the Collection, and false if it is empty
219
+	 *
220
+	 * @access public
221
+	 * @return bool
222
+	 */
223
+	public function hasObjects()
224
+	{
225
+		return $this->count() !== 0;
226
+	}
227
+
228
+
229
+	/**
230
+	 * isEmpty
231
+	 * returns true if there are no objects within the Collection, and false if there are
232
+	 *
233
+	 * @access public
234
+	 * @return bool
235
+	 */
236
+	public function isEmpty()
237
+	{
238
+		return $this->count() === 0;
239
+	}
240
+
241
+
242
+	/**
243
+	 * remove
244
+	 * detaches an object from the Collection
245
+	 *
246
+	 * @access public
247
+	 * @param $object
248
+	 * @return bool
249
+	 */
250
+	public function remove($object)
251
+	{
252
+		$this->detach($object);
253
+		return true;
254
+	}
255
+
256
+
257
+	/**
258
+	 * setCurrent
259
+	 * advances pointer to the object whose identifier matches that which was provided
260
+	 *
261
+	 * @access public
262
+	 * @param mixed $identifier
263
+	 * @return boolean
264
+	 */
265
+	public function setCurrent($identifier)
266
+	{
267
+		$this->rewind();
268
+		while ($this->valid()) {
269
+			if ($identifier === $this->getInfo()) {
270
+				return true;
271
+			}
272
+			$this->next();
273
+		}
274
+		return false;
275
+	}
276
+
277
+
278
+	/**
279
+	 * setCurrentUsingObject
280
+	 * advances pointer to the provided object
281
+	 *
282
+	 * @access public
283
+	 * @param $object
284
+	 * @return boolean
285
+	 */
286
+	public function setCurrentUsingObject($object)
287
+	{
288
+		$this->rewind();
289
+		while ($this->valid()) {
290
+			if ($this->current() === $object) {
291
+				return true;
292
+			}
293
+			$this->next();
294
+		}
295
+		return false;
296
+	}
297
+
298
+
299
+	/**
300
+	 * Returns the object occupying the index before the current object,
301
+	 * unless this is already the first object, in which case it just returns the first object
302
+	 *
303
+	 * @return mixed
304
+	 */
305
+	public function previous()
306
+	{
307
+		$index = $this->indexOf($this->current());
308
+		if ($index === 0) {
309
+			return $this->current();
310
+		}
311
+		$index--;
312
+		return $this->objectAtIndex($index);
313
+	}
314
+
315
+
316
+	/**
317
+	 * Returns the index of a given object, or false if not found
318
+	 *
319
+	 * @see http://stackoverflow.com/a/8736013
320
+	 * @param $object
321
+	 * @return boolean|int|string
322
+	 */
323
+	public function indexOf($object)
324
+	{
325
+		if (! $this->contains($object)) {
326
+			return false;
327
+		}
328
+		foreach ($this as $index => $obj) {
329
+			if ($obj === $object) {
330
+				return $index;
331
+			}
332
+		}
333
+		return false;
334
+	}
335
+
336
+
337
+	/**
338
+	 * Returns the object at the given index
339
+	 *
340
+	 * @see http://stackoverflow.com/a/8736013
341
+	 * @param int $index
342
+	 * @return mixed
343
+	 */
344
+	public function objectAtIndex($index)
345
+	{
346
+		$iterator = new LimitIterator($this, $index, 1);
347
+		$iterator->rewind();
348
+		return $iterator->current();
349
+	}
350
+
351
+
352
+	/**
353
+	 * Returns the sequence of objects as specified by the offset and length
354
+	 *
355
+	 * @see http://stackoverflow.com/a/8736013
356
+	 * @param int $offset
357
+	 * @param int $length
358
+	 * @return array
359
+	 */
360
+	public function slice($offset, $length)
361
+	{
362
+		$slice = array();
363
+		$iterator = new LimitIterator($this, $offset, $length);
364
+		foreach ($iterator as $object) {
365
+			$slice[] = $object;
366
+		}
367
+		return $slice;
368
+	}
369
+
370
+
371
+	/**
372
+	 * Inserts an object at a certain point
373
+	 *
374
+	 * @see http://stackoverflow.com/a/8736013
375
+	 * @param mixed $object A single object
376
+	 * @param int   $index
377
+	 * @param mixed $identifier
378
+	 * @return bool
379
+	 * @throws DuplicateCollectionIdentifierException
380
+	 * @throws InvalidEntityException
381
+	 */
382
+	public function insertObjectAt($object, $index, $identifier = null)
383
+	{
384
+		// check to ensure that objects don't already exist in the collection
385
+		if ($this->has($identifier)) {
386
+			throw new DuplicateCollectionIdentifierException($identifier);
387
+		}
388
+		// detach any objects at or past this index
389
+		$remaining_objects = array();
390
+		if ($index < $this->count()) {
391
+			$remaining_objects = $this->slice($index, $this->count() - $index);
392
+			foreach ($remaining_objects as $key => $remaining_object) {
393
+				// we need to grab the identifiers for each object and use them as keys
394
+				$remaining_objects[ $remaining_object->getInfo() ] = $remaining_object;
395
+				// and then remove the object from the current tracking array
396
+				unset($remaining_objects[ $key ]);
397
+				// and then remove it from the Collection
398
+				$this->detach($remaining_object);
399
+			}
400
+		}
401
+		// add the new object we're splicing in
402
+		$this->add($object, $identifier);
403
+		// attach the objects we previously detached
404
+		foreach ($remaining_objects as $key => $remaining_object) {
405
+			$this->add($remaining_object, $key);
406
+		}
407
+		return $this->contains($object);
408
+	}
409
+
410
+
411
+	/**
412
+	 * Inserts an object (or an array of objects) at a certain point
413
+	 *
414
+	 * @see http://stackoverflow.com/a/8736013
415
+	 * @param mixed $objects A single object or an array of objects
416
+	 * @param int   $index
417
+	 */
418
+	public function insertAt($objects, $index)
419
+	{
420
+		if (! is_array($objects)) {
421
+			$objects = array($objects);
422
+		}
423
+		// check to ensure that objects don't already exist in the collection
424
+		foreach ($objects as $key => $object) {
425
+			if ($this->contains($object)) {
426
+				unset($objects[ $key ]);
427
+			}
428
+		}
429
+		// do we have any objects left?
430
+		if (! $objects) {
431
+			return;
432
+		}
433
+		// detach any objects at or past this index
434
+		$remaining = array();
435
+		if ($index < $this->count()) {
436
+			$remaining = $this->slice($index, $this->count() - $index);
437
+			foreach ($remaining as $object) {
438
+				$this->detach($object);
439
+			}
440
+		}
441
+		// add the new objects we're splicing in
442
+		foreach ($objects as $object) {
443
+			$this->attach($object);
444
+		}
445
+		// attach the objects we previously detached
446
+		foreach ($remaining as $object) {
447
+			$this->attach($object);
448
+		}
449
+	}
450
+
451
+
452
+	/**
453
+	 * Removes the object at the given index
454
+	 *
455
+	 * @see http://stackoverflow.com/a/8736013
456
+	 * @param int $index
457
+	 */
458
+	public function removeAt($index)
459
+	{
460
+		$this->detach($this->objectAtIndex($index));
461
+	}
462
+
463
+
464
+	/**
465
+	 * detaches ALL objects from the Collection
466
+	 */
467
+	public function detachAll()
468
+	{
469
+		$this->rewind();
470
+		while ($this->valid()) {
471
+			$object = $this->current();
472
+			$this->next();
473
+			$this->detach($object);
474
+		}
475
+	}
476
+
477
+
478
+	/**
479
+	 * unsets and detaches ALL objects from the Collection
480
+	 */
481
+	public function trashAndDetachAll()
482
+	{
483
+		$this->rewind();
484
+		while ($this->valid()) {
485
+			$object = $this->current();
486
+			$this->next();
487
+			$this->detach($object);
488
+			unset($object);
489
+		}
490
+	}
491 491
 }
Please login to merge, or discard this patch.
Spacing   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -68,14 +68,14 @@  discard block
 block discarded – undo
68 68
     protected function setCollectionIdentifier()
69 69
     {
70 70
         // hash a few collection details
71
-        $identifier = md5(spl_object_hash($this) . $this->collection_interface . time());
71
+        $identifier = md5(spl_object_hash($this).$this->collection_interface.time());
72 72
         // grab a few characters from the start, middle, and end of the hash
73 73
         $id = array();
74 74
         for ($x = 0; $x < 19; $x += 9) {
75 75
             $id[] = substr($identifier, $x, 3);
76 76
         }
77 77
         $identifier = basename(str_replace('\\', '/', get_class($this)));
78
-        $identifier .= '-' . strtoupper(implode('-', $id));
78
+        $identifier .= '-'.strtoupper(implode('-', $id));
79 79
         $this->collection_identifier = $identifier;
80 80
     }
81 81
 
@@ -89,7 +89,7 @@  discard block
 block discarded – undo
89 89
      */
90 90
     protected function setCollectionInterface($collection_interface)
91 91
     {
92
-        if (! (interface_exists($collection_interface) || class_exists($collection_interface))) {
92
+        if ( ! (interface_exists($collection_interface) || class_exists($collection_interface))) {
93 93
             throw new InvalidInterfaceException($collection_interface);
94 94
         }
95 95
         $this->collection_interface = $collection_interface;
@@ -111,7 +111,7 @@  discard block
 block discarded – undo
111 111
      */
112 112
     public function add($object, $identifier = null)
113 113
     {
114
-        if (! $object instanceof $this->collection_interface) {
114
+        if ( ! $object instanceof $this->collection_interface) {
115 115
             throw new InvalidEntityException($object, $this->collection_interface);
116 116
         }
117 117
         if ($this->contains($object)) {
@@ -322,7 +322,7 @@  discard block
 block discarded – undo
322 322
      */
323 323
     public function indexOf($object)
324 324
     {
325
-        if (! $this->contains($object)) {
325
+        if ( ! $this->contains($object)) {
326 326
             return false;
327 327
         }
328 328
         foreach ($this as $index => $obj) {
@@ -391,9 +391,9 @@  discard block
 block discarded – undo
391 391
             $remaining_objects = $this->slice($index, $this->count() - $index);
392 392
             foreach ($remaining_objects as $key => $remaining_object) {
393 393
                 // we need to grab the identifiers for each object and use them as keys
394
-                $remaining_objects[ $remaining_object->getInfo() ] = $remaining_object;
394
+                $remaining_objects[$remaining_object->getInfo()] = $remaining_object;
395 395
                 // and then remove the object from the current tracking array
396
-                unset($remaining_objects[ $key ]);
396
+                unset($remaining_objects[$key]);
397 397
                 // and then remove it from the Collection
398 398
                 $this->detach($remaining_object);
399 399
             }
@@ -417,17 +417,17 @@  discard block
 block discarded – undo
417 417
      */
418 418
     public function insertAt($objects, $index)
419 419
     {
420
-        if (! is_array($objects)) {
420
+        if ( ! is_array($objects)) {
421 421
             $objects = array($objects);
422 422
         }
423 423
         // check to ensure that objects don't already exist in the collection
424 424
         foreach ($objects as $key => $object) {
425 425
             if ($this->contains($object)) {
426
-                unset($objects[ $key ]);
426
+                unset($objects[$key]);
427 427
             }
428 428
         }
429 429
         // do we have any objects left?
430
-        if (! $objects) {
430
+        if ( ! $objects) {
431 431
             return;
432 432
         }
433 433
         // detach any objects at or past this index
Please login to merge, or discard this patch.