Completed
Branch BUG-11137-domain-base (47e169)
by
unknown
12:10
created
core/libraries/plugin_api/EE_Register_Addon.lib.php 2 patches
Indentation   +1048 added lines, -1048 removed lines patch added patch discarded remove patch
@@ -22,1108 +22,1108 @@
 block discarded – undo
22 22
 {
23 23
 
24 24
 
25
-    /**
26
-     * possibly truncated version of the EE core version string
27
-     *
28
-     * @var string
29
-     */
30
-    protected static $_core_version = '';
25
+	/**
26
+	 * possibly truncated version of the EE core version string
27
+	 *
28
+	 * @var string
29
+	 */
30
+	protected static $_core_version = '';
31 31
 
32
-    /**
33
-     * Holds values for registered addons
34
-     *
35
-     * @var array
36
-     */
37
-    protected static $_settings = array();
32
+	/**
33
+	 * Holds values for registered addons
34
+	 *
35
+	 * @var array
36
+	 */
37
+	protected static $_settings = array();
38 38
 
39
-    /**
40
-     * @var  array $_incompatible_addons keys are addon SLUGS
41
-     * (first argument passed to EE_Register_Addon::register()), keys are
42
-     * their MINIMUM VERSION (with all 5 parts. Eg 1.2.3.rc.004).
43
-     * Generally this should be used sparingly, as we don't want to muddle up
44
-     * EE core with knowledge of ALL the addons out there.
45
-     * If you want NO versions of an addon to run with a certain version of core,
46
-     * it's usually best to define the addon's "min_core_version" as part of its call
47
-     * to EE_Register_Addon::register(), rather than using this array with a super high value for its
48
-     * minimum plugin version.
49
-     * @access    protected
50
-     */
51
-    protected static $_incompatible_addons = array(
52
-        'Multi_Event_Registration' => '2.0.11.rc.002',
53
-        'Promotions'               => '1.0.0.rc.084',
54
-    );
39
+	/**
40
+	 * @var  array $_incompatible_addons keys are addon SLUGS
41
+	 * (first argument passed to EE_Register_Addon::register()), keys are
42
+	 * their MINIMUM VERSION (with all 5 parts. Eg 1.2.3.rc.004).
43
+	 * Generally this should be used sparingly, as we don't want to muddle up
44
+	 * EE core with knowledge of ALL the addons out there.
45
+	 * If you want NO versions of an addon to run with a certain version of core,
46
+	 * it's usually best to define the addon's "min_core_version" as part of its call
47
+	 * to EE_Register_Addon::register(), rather than using this array with a super high value for its
48
+	 * minimum plugin version.
49
+	 * @access    protected
50
+	 */
51
+	protected static $_incompatible_addons = array(
52
+		'Multi_Event_Registration' => '2.0.11.rc.002',
53
+		'Promotions'               => '1.0.0.rc.084',
54
+	);
55 55
 
56 56
 
57
-    /**
58
-     * We should always be comparing core to a version like '4.3.0.rc.000',
59
-     * not just '4.3.0'.
60
-     * So if the addon developer doesn't provide that full version string,
61
-     * fill in the blanks for them
62
-     *
63
-     * @param string $min_core_version
64
-     * @return string always like '4.3.0.rc.000'
65
-     */
66
-    protected static function _effective_version($min_core_version)
67
-    {
68
-        // versions: 4 . 3 . 1 . p . 123
69
-        // offsets:    0 . 1 . 2 . 3 . 4
70
-        $version_parts = explode('.', $min_core_version);
71
-        //check they specified the micro version (after 2nd period)
72
-        if (! isset($version_parts[2])) {
73
-            $version_parts[2] = '0';
74
-        }
75
-        //if they didn't specify the 'p', or 'rc' part. Just assume the lowest possible
76
-        //soon we can assume that's 'rc', but this current version is 'alpha'
77
-        if (! isset($version_parts[3])) {
78
-            $version_parts[3] = 'dev';
79
-        }
80
-        if (! isset($version_parts[4])) {
81
-            $version_parts[4] = '000';
82
-        }
83
-        return implode('.', $version_parts);
84
-    }
57
+	/**
58
+	 * We should always be comparing core to a version like '4.3.0.rc.000',
59
+	 * not just '4.3.0'.
60
+	 * So if the addon developer doesn't provide that full version string,
61
+	 * fill in the blanks for them
62
+	 *
63
+	 * @param string $min_core_version
64
+	 * @return string always like '4.3.0.rc.000'
65
+	 */
66
+	protected static function _effective_version($min_core_version)
67
+	{
68
+		// versions: 4 . 3 . 1 . p . 123
69
+		// offsets:    0 . 1 . 2 . 3 . 4
70
+		$version_parts = explode('.', $min_core_version);
71
+		//check they specified the micro version (after 2nd period)
72
+		if (! isset($version_parts[2])) {
73
+			$version_parts[2] = '0';
74
+		}
75
+		//if they didn't specify the 'p', or 'rc' part. Just assume the lowest possible
76
+		//soon we can assume that's 'rc', but this current version is 'alpha'
77
+		if (! isset($version_parts[3])) {
78
+			$version_parts[3] = 'dev';
79
+		}
80
+		if (! isset($version_parts[4])) {
81
+			$version_parts[4] = '000';
82
+		}
83
+		return implode('.', $version_parts);
84
+	}
85 85
 
86 86
 
87
-    /**
88
-     * Returns whether or not the min core version requirement of the addon is met
89
-     *
90
-     * @param string $min_core_version    the minimum core version required by the addon
91
-     * @param string $actual_core_version the actual core version, optional
92
-     * @return boolean
93
-     */
94
-    public static function _meets_min_core_version_requirement(
95
-        $min_core_version,
96
-        $actual_core_version = EVENT_ESPRESSO_VERSION
97
-    ) {
98
-        return version_compare(
99
-            self::_effective_version($actual_core_version),
100
-            self::_effective_version($min_core_version),
101
-            '>='
102
-        );
103
-    }
87
+	/**
88
+	 * Returns whether or not the min core version requirement of the addon is met
89
+	 *
90
+	 * @param string $min_core_version    the minimum core version required by the addon
91
+	 * @param string $actual_core_version the actual core version, optional
92
+	 * @return boolean
93
+	 */
94
+	public static function _meets_min_core_version_requirement(
95
+		$min_core_version,
96
+		$actual_core_version = EVENT_ESPRESSO_VERSION
97
+	) {
98
+		return version_compare(
99
+			self::_effective_version($actual_core_version),
100
+			self::_effective_version($min_core_version),
101
+			'>='
102
+		);
103
+	}
104 104
 
105 105
 
106
-    /**
107
-     * Method for registering new EE_Addons.
108
-     * Should be called AFTER AHEE__EE_System__load_espresso_addons but BEFORE
109
-     * AHEE__EE_System___detect_if_activation_or_upgrade__begin in order to register all its components. However, it
110
-     * may also be called after the 'activate_plugin' action (when an addon is activated), because an activating addon
111
-     * won't be loaded by WP until after AHEE__EE_System__load_espresso_addons has fired. If its called after
112
-     * 'activate_plugin', it registers the addon still, but its components are not registered
113
-     * (they shouldn't be needed anyways, because it's just an activation request and they won't have a chance to do
114
-     * anything anyways). Instead, it just sets the newly-activated addon's activation indicator wp option and returns
115
-     * (so that we can detect that the addon has activated on the subsequent request)
116
-     *
117
-     * @since    4.3.0
118
-     * @param string                  $addon_name                       the EE_Addon's name. Required.
119
-     * @param  array                  $setup_args                       {
120
-     *                                                                  An array of arguments provided for registering the
121
-     *                                                                  message type.
122
-     * @type  string                  $class_name                       the addon's main file name.
123
-     *                                                                  If left blank, generated from the addon name,
124
-     *                                                                  changes something like "calendar" to "EE_Calendar"
125
-     * @type string                   $min_core_version                 the minimum version of EE Core that the
126
-     *                                                                  addon will work with. eg "4.8.1.rc.084"
127
-     * @type string                   $version                          the "software" version for the addon. eg
128
-     *                                                                  "1.0.0.p" for a first stable release, or
129
-     *                                                                  "1.0.0.rc.043" for a version in progress
130
-     * @type string                   $main_file_path                   the full server path to the main file
131
-     *                                                                  loaded directly by WP
132
-     * @type string                   $admin_path                       full server path to the folder where the
133
-     *                                                                  addon\'s admin files reside
134
-     * @type string                   $admin_callback                   a method to be called when the EE Admin is
135
-     *                                                                  first invoked, can be used for hooking into
136
-     *                                                                  any admin page
137
-     * @type string                   $config_section                   the section name for this addon's
138
-     *                                                                  configuration settings section
139
-     *                                                                  (defaults to "addons")
140
-     * @type string                   $config_class                     the class name for this addon's
141
-     *                                                                  configuration settings object
142
-     * @type string                   $config_name                      the class name for this addon's
143
-     *                                                                  configuration settings object
144
-     * @type string                   $autoloader_paths                 an array of class names and the full server
145
-     *                                                                  paths to those files. Required.
146
-     * @type string                   $autoloader_folders               an array of  "full server paths" for any
147
-     *                                                                  folders containing classes that might be
148
-     *                                                                  invoked by the addon
149
-     * @type string                   $dms_paths                        an array of full server paths to folders that
150
-     *                                                                  contain data migration scripts. Required.
151
-     * @type string                   $module_paths                     an array of full server paths to any
152
-     *                                                                  EED_Modules used by the addon
153
-     * @type string                   $shortcode_paths                  an array of full server paths to folders
154
-     *                                                                  that contain EES_Shortcodes
155
-     * @type string                   $widget_paths                     an array of full server paths to folders
156
-     *                                                                  that contain WP_Widgets
157
-     * @type string                   $pue_options
158
-     * @type array                    $capabilities                     an array indexed by role name
159
-     *                                                                  (i.e administrator,author ) and the values
160
-     *                                                                  are an array of caps to add to the role.
161
-     *                                                                  'administrator' => array(
162
-     *                                                                  'read_addon',
163
-     *                                                                  'edit_addon',
164
-     *                                                                  etc.
165
-     *                                                                  ).
166
-     * @type EE_Meta_Capability_Map[] $capability_maps                  an array of EE_Meta_Capability_Map object
167
-     *                                                                  for any addons that need to register any
168
-     *                                                                  special meta mapped capabilities.  Should
169
-     *                                                                  be indexed where the key is the
170
-     *                                                                  EE_Meta_Capability_Map class name and the
171
-     *                                                                  values are the arguments sent to the class.
172
-     * @type array                    $model_paths                      array of folders containing DB models
173
-     * @see      EE_Register_Model
174
-     * @type array                    $class_paths                      array of folders containing DB classes
175
-     * @see      EE_Register_Model
176
-     * @type array                    $model_extension_paths            array of folders containing DB model
177
-     *                                                                  extensions
178
-     * @see      EE_Register_Model_Extension
179
-     * @type array                    $class_extension_paths            array of folders containing DB class
180
-     *                                                                  extensions
181
-     * @see      EE_Register_Model_Extension
182
-     * @type array message_types {
183
-     *                                                                  An array of message types with the key as
184
-     *                                                                  the message type name and the values as
185
-     *                                                                  below:
186
-     * @type string                   $mtfilename                       The filename of the message type being
187
-     *                                                                  registered. This will be the main
188
-     *                                                                  EE_{Message Type Name}_message_type class.
189
-     *                                                                  (eg. EE_Declined_Registration_message_type.class.php)
190
-     *                                                                  Required.
191
-     * @type array                    $autoloadpaths                    An array of paths to add to the messages
192
-     *                                                                  autoloader for the new message type.
193
-     *                                                                  Required.
194
-     * @type array                    $messengers_to_activate_with      An array of messengers that this message
195
-     *                                                                  type should activate with. Each value in
196
-     *                                                                  the
197
-     *                                                                  array
198
-     *                                                                  should match the name property of a
199
-     *                                                                  EE_messenger. Optional.
200
-     * @type array                    $messengers_to_validate_with      An array of messengers that this message
201
-     *                                                                  type should validate with. Each value in
202
-     *                                                                  the
203
-     *                                                                  array
204
-     *                                                                  should match the name property of an
205
-     *                                                                  EE_messenger.
206
-     *                                                                  Optional.
207
-     *                                                                  }
208
-     * @type array                    $custom_post_types
209
-     * @type array                    $custom_taxonomies
210
-     * @type array                    $payment_method_paths             each element is the folder containing the
211
-     *                                                                  EE_PMT_Base child class
212
-     *                                                                  (eg,
213
-     *                                                                  '/wp-content/plugins/my_plugin/Payomatic/'
214
-     *                                                                  which contains the files
215
-     *                                                                  EE_PMT_Payomatic.pm.php)
216
-     * @type array                    $default_terms
217
-     * @type array                    $namespace                        {
218
-     *                                                                  An array with two items for registering the
219
-     *                                                                  addon's namespace. (If, for some reason, you
220
-     *                                                                  require additional namespaces,
221
-     *                                                                  use EventEspresso\core\Psr4Autoloader::addNamespace()
222
-     *                                                                  directly)
223
-     * @see      EventEspresso\core\Psr4Autoloader::addNamespace()
224
-     * @type string                   $FQNS                             the namespace prefix
225
-     * @type string                   $DIR                              a base directory for class files in the
226
-     *                                                                  namespace.
227
-     *                                                                  }
228
-     *                                                                  }
229
-     * @return void
230
-     * @throws DomainException
231
-     * @throws EE_Error
232
-     * @throws InvalidArgumentException
233
-     * @throws ReflectionException
234
-     * @throws InvalidDataTypeException
235
-     * @throws InvalidInterfaceException
236
-     */
237
-    public static function register($addon_name = '', $setup_args = array())
238
-    {
239
-        // required fields MUST be present, so let's make sure they are.
240
-        EE_Register_Addon::_verify_parameters($addon_name, $setup_args);
241
-        // get class name for addon
242
-        $class_name = EE_Register_Addon::_parse_class_name($addon_name, $setup_args);
243
-        //setup $_settings array from incoming values.
244
-        $addon_settings = EE_Register_Addon::_get_addon_settings($class_name, $setup_args);
245
-        // setup PUE
246
-        EE_Register_Addon::_parse_pue_options($addon_name, $class_name, $setup_args);
247
-        // does this addon work with this version of core or WordPress ?
248
-        if (! EE_Register_Addon::_addon_is_compatible($addon_name, $addon_settings)) {
249
-            return;
250
-        }
251
-        // register namespaces
252
-        EE_Register_Addon::_setup_namespaces($addon_settings);
253
-        // check if this is an activation request
254
-        if (EE_Register_Addon::_addon_activation($addon_name, $addon_settings)) {
255
-            // dont bother setting up the rest of the addon atm
256
-            return;
257
-        }
258
-        // we need cars
259
-        EE_Register_Addon::_setup_autoloaders($addon_name);
260
-        // register new models and extensions
261
-        EE_Register_Addon::_register_models_and_extensions($addon_name);
262
-        // setup DMS
263
-        EE_Register_Addon::_register_data_migration_scripts($addon_name);
264
-        // if config_class is present let's register config.
265
-        EE_Register_Addon::_register_config($addon_name);
266
-        // register admin pages
267
-        EE_Register_Addon::_register_admin_pages($addon_name);
268
-        // add to list of modules to be registered
269
-        EE_Register_Addon::_register_modules($addon_name);
270
-        // add to list of shortcodes to be registered
271
-        EE_Register_Addon::_register_shortcodes($addon_name);
272
-        // add to list of widgets to be registered
273
-        EE_Register_Addon::_register_widgets($addon_name);
274
-        // register capability related stuff.
275
-        EE_Register_Addon::_register_capabilities($addon_name);
276
-        // any message type to register?
277
-        EE_Register_Addon::_register_message_types($addon_name);
278
-        // any custom post type/ custom capabilities or default terms to register
279
-        EE_Register_Addon::_register_custom_post_types($addon_name);
280
-        // and any payment methods
281
-        EE_Register_Addon::_register_payment_methods($addon_name);
282
-        // load and instantiate main addon class
283
-        $addon = EE_Register_Addon::_load_and_init_addon_class($addon_name);
284
-        //delay calling after_registration hook on each addon until after all add-ons have been registered.
285
-        add_action('AHEE__EE_System__load_espresso_addons__complete', array($addon, 'after_registration'), 999);
286
-    }
106
+	/**
107
+	 * Method for registering new EE_Addons.
108
+	 * Should be called AFTER AHEE__EE_System__load_espresso_addons but BEFORE
109
+	 * AHEE__EE_System___detect_if_activation_or_upgrade__begin in order to register all its components. However, it
110
+	 * may also be called after the 'activate_plugin' action (when an addon is activated), because an activating addon
111
+	 * won't be loaded by WP until after AHEE__EE_System__load_espresso_addons has fired. If its called after
112
+	 * 'activate_plugin', it registers the addon still, but its components are not registered
113
+	 * (they shouldn't be needed anyways, because it's just an activation request and they won't have a chance to do
114
+	 * anything anyways). Instead, it just sets the newly-activated addon's activation indicator wp option and returns
115
+	 * (so that we can detect that the addon has activated on the subsequent request)
116
+	 *
117
+	 * @since    4.3.0
118
+	 * @param string                  $addon_name                       the EE_Addon's name. Required.
119
+	 * @param  array                  $setup_args                       {
120
+	 *                                                                  An array of arguments provided for registering the
121
+	 *                                                                  message type.
122
+	 * @type  string                  $class_name                       the addon's main file name.
123
+	 *                                                                  If left blank, generated from the addon name,
124
+	 *                                                                  changes something like "calendar" to "EE_Calendar"
125
+	 * @type string                   $min_core_version                 the minimum version of EE Core that the
126
+	 *                                                                  addon will work with. eg "4.8.1.rc.084"
127
+	 * @type string                   $version                          the "software" version for the addon. eg
128
+	 *                                                                  "1.0.0.p" for a first stable release, or
129
+	 *                                                                  "1.0.0.rc.043" for a version in progress
130
+	 * @type string                   $main_file_path                   the full server path to the main file
131
+	 *                                                                  loaded directly by WP
132
+	 * @type string                   $admin_path                       full server path to the folder where the
133
+	 *                                                                  addon\'s admin files reside
134
+	 * @type string                   $admin_callback                   a method to be called when the EE Admin is
135
+	 *                                                                  first invoked, can be used for hooking into
136
+	 *                                                                  any admin page
137
+	 * @type string                   $config_section                   the section name for this addon's
138
+	 *                                                                  configuration settings section
139
+	 *                                                                  (defaults to "addons")
140
+	 * @type string                   $config_class                     the class name for this addon's
141
+	 *                                                                  configuration settings object
142
+	 * @type string                   $config_name                      the class name for this addon's
143
+	 *                                                                  configuration settings object
144
+	 * @type string                   $autoloader_paths                 an array of class names and the full server
145
+	 *                                                                  paths to those files. Required.
146
+	 * @type string                   $autoloader_folders               an array of  "full server paths" for any
147
+	 *                                                                  folders containing classes that might be
148
+	 *                                                                  invoked by the addon
149
+	 * @type string                   $dms_paths                        an array of full server paths to folders that
150
+	 *                                                                  contain data migration scripts. Required.
151
+	 * @type string                   $module_paths                     an array of full server paths to any
152
+	 *                                                                  EED_Modules used by the addon
153
+	 * @type string                   $shortcode_paths                  an array of full server paths to folders
154
+	 *                                                                  that contain EES_Shortcodes
155
+	 * @type string                   $widget_paths                     an array of full server paths to folders
156
+	 *                                                                  that contain WP_Widgets
157
+	 * @type string                   $pue_options
158
+	 * @type array                    $capabilities                     an array indexed by role name
159
+	 *                                                                  (i.e administrator,author ) and the values
160
+	 *                                                                  are an array of caps to add to the role.
161
+	 *                                                                  'administrator' => array(
162
+	 *                                                                  'read_addon',
163
+	 *                                                                  'edit_addon',
164
+	 *                                                                  etc.
165
+	 *                                                                  ).
166
+	 * @type EE_Meta_Capability_Map[] $capability_maps                  an array of EE_Meta_Capability_Map object
167
+	 *                                                                  for any addons that need to register any
168
+	 *                                                                  special meta mapped capabilities.  Should
169
+	 *                                                                  be indexed where the key is the
170
+	 *                                                                  EE_Meta_Capability_Map class name and the
171
+	 *                                                                  values are the arguments sent to the class.
172
+	 * @type array                    $model_paths                      array of folders containing DB models
173
+	 * @see      EE_Register_Model
174
+	 * @type array                    $class_paths                      array of folders containing DB classes
175
+	 * @see      EE_Register_Model
176
+	 * @type array                    $model_extension_paths            array of folders containing DB model
177
+	 *                                                                  extensions
178
+	 * @see      EE_Register_Model_Extension
179
+	 * @type array                    $class_extension_paths            array of folders containing DB class
180
+	 *                                                                  extensions
181
+	 * @see      EE_Register_Model_Extension
182
+	 * @type array message_types {
183
+	 *                                                                  An array of message types with the key as
184
+	 *                                                                  the message type name and the values as
185
+	 *                                                                  below:
186
+	 * @type string                   $mtfilename                       The filename of the message type being
187
+	 *                                                                  registered. This will be the main
188
+	 *                                                                  EE_{Message Type Name}_message_type class.
189
+	 *                                                                  (eg. EE_Declined_Registration_message_type.class.php)
190
+	 *                                                                  Required.
191
+	 * @type array                    $autoloadpaths                    An array of paths to add to the messages
192
+	 *                                                                  autoloader for the new message type.
193
+	 *                                                                  Required.
194
+	 * @type array                    $messengers_to_activate_with      An array of messengers that this message
195
+	 *                                                                  type should activate with. Each value in
196
+	 *                                                                  the
197
+	 *                                                                  array
198
+	 *                                                                  should match the name property of a
199
+	 *                                                                  EE_messenger. Optional.
200
+	 * @type array                    $messengers_to_validate_with      An array of messengers that this message
201
+	 *                                                                  type should validate with. Each value in
202
+	 *                                                                  the
203
+	 *                                                                  array
204
+	 *                                                                  should match the name property of an
205
+	 *                                                                  EE_messenger.
206
+	 *                                                                  Optional.
207
+	 *                                                                  }
208
+	 * @type array                    $custom_post_types
209
+	 * @type array                    $custom_taxonomies
210
+	 * @type array                    $payment_method_paths             each element is the folder containing the
211
+	 *                                                                  EE_PMT_Base child class
212
+	 *                                                                  (eg,
213
+	 *                                                                  '/wp-content/plugins/my_plugin/Payomatic/'
214
+	 *                                                                  which contains the files
215
+	 *                                                                  EE_PMT_Payomatic.pm.php)
216
+	 * @type array                    $default_terms
217
+	 * @type array                    $namespace                        {
218
+	 *                                                                  An array with two items for registering the
219
+	 *                                                                  addon's namespace. (If, for some reason, you
220
+	 *                                                                  require additional namespaces,
221
+	 *                                                                  use EventEspresso\core\Psr4Autoloader::addNamespace()
222
+	 *                                                                  directly)
223
+	 * @see      EventEspresso\core\Psr4Autoloader::addNamespace()
224
+	 * @type string                   $FQNS                             the namespace prefix
225
+	 * @type string                   $DIR                              a base directory for class files in the
226
+	 *                                                                  namespace.
227
+	 *                                                                  }
228
+	 *                                                                  }
229
+	 * @return void
230
+	 * @throws DomainException
231
+	 * @throws EE_Error
232
+	 * @throws InvalidArgumentException
233
+	 * @throws ReflectionException
234
+	 * @throws InvalidDataTypeException
235
+	 * @throws InvalidInterfaceException
236
+	 */
237
+	public static function register($addon_name = '', $setup_args = array())
238
+	{
239
+		// required fields MUST be present, so let's make sure they are.
240
+		EE_Register_Addon::_verify_parameters($addon_name, $setup_args);
241
+		// get class name for addon
242
+		$class_name = EE_Register_Addon::_parse_class_name($addon_name, $setup_args);
243
+		//setup $_settings array from incoming values.
244
+		$addon_settings = EE_Register_Addon::_get_addon_settings($class_name, $setup_args);
245
+		// setup PUE
246
+		EE_Register_Addon::_parse_pue_options($addon_name, $class_name, $setup_args);
247
+		// does this addon work with this version of core or WordPress ?
248
+		if (! EE_Register_Addon::_addon_is_compatible($addon_name, $addon_settings)) {
249
+			return;
250
+		}
251
+		// register namespaces
252
+		EE_Register_Addon::_setup_namespaces($addon_settings);
253
+		// check if this is an activation request
254
+		if (EE_Register_Addon::_addon_activation($addon_name, $addon_settings)) {
255
+			// dont bother setting up the rest of the addon atm
256
+			return;
257
+		}
258
+		// we need cars
259
+		EE_Register_Addon::_setup_autoloaders($addon_name);
260
+		// register new models and extensions
261
+		EE_Register_Addon::_register_models_and_extensions($addon_name);
262
+		// setup DMS
263
+		EE_Register_Addon::_register_data_migration_scripts($addon_name);
264
+		// if config_class is present let's register config.
265
+		EE_Register_Addon::_register_config($addon_name);
266
+		// register admin pages
267
+		EE_Register_Addon::_register_admin_pages($addon_name);
268
+		// add to list of modules to be registered
269
+		EE_Register_Addon::_register_modules($addon_name);
270
+		// add to list of shortcodes to be registered
271
+		EE_Register_Addon::_register_shortcodes($addon_name);
272
+		// add to list of widgets to be registered
273
+		EE_Register_Addon::_register_widgets($addon_name);
274
+		// register capability related stuff.
275
+		EE_Register_Addon::_register_capabilities($addon_name);
276
+		// any message type to register?
277
+		EE_Register_Addon::_register_message_types($addon_name);
278
+		// any custom post type/ custom capabilities or default terms to register
279
+		EE_Register_Addon::_register_custom_post_types($addon_name);
280
+		// and any payment methods
281
+		EE_Register_Addon::_register_payment_methods($addon_name);
282
+		// load and instantiate main addon class
283
+		$addon = EE_Register_Addon::_load_and_init_addon_class($addon_name);
284
+		//delay calling after_registration hook on each addon until after all add-ons have been registered.
285
+		add_action('AHEE__EE_System__load_espresso_addons__complete', array($addon, 'after_registration'), 999);
286
+	}
287 287
 
288 288
 
289
-    /**
290
-     * @param string $addon_name
291
-     * @param array  $setup_args
292
-     * @return void
293
-     * @throws EE_Error
294
-     */
295
-    private static function _verify_parameters($addon_name, array $setup_args)
296
-    {
297
-        // required fields MUST be present, so let's make sure they are.
298
-        if (empty($addon_name) || ! is_array($setup_args)) {
299
-            throw new EE_Error(
300
-                __(
301
-                    'In order to register an EE_Addon with EE_Register_Addon::register(), you must include the "addon_name" (the name of the addon), and an array of arguments.',
302
-                    'event_espresso'
303
-                )
304
-            );
305
-        }
306
-        if (! isset($setup_args['main_file_path']) || empty($setup_args['main_file_path'])) {
307
-            throw new EE_Error(
308
-                sprintf(
309
-                    __(
310
-                        'When registering an addon, you didn\'t provide the "main_file_path", which is the full path to the main file loaded directly by Wordpress. You only provided %s',
311
-                        'event_espresso'
312
-                    ),
313
-                    implode(',', array_keys($setup_args))
314
-                )
315
-            );
316
-        }
317
-        // check that addon has not already been registered with that name
318
-        if (isset(self::$_settings[ $addon_name ]) && ! did_action('activate_plugin')) {
319
-            throw new EE_Error(
320
-                sprintf(
321
-                    __(
322
-                        'An EE_Addon with the name "%s" has already been registered and each EE_Addon requires a unique name.',
323
-                        'event_espresso'
324
-                    ),
325
-                    $addon_name
326
-                )
327
-            );
328
-        }
329
-    }
289
+	/**
290
+	 * @param string $addon_name
291
+	 * @param array  $setup_args
292
+	 * @return void
293
+	 * @throws EE_Error
294
+	 */
295
+	private static function _verify_parameters($addon_name, array $setup_args)
296
+	{
297
+		// required fields MUST be present, so let's make sure they are.
298
+		if (empty($addon_name) || ! is_array($setup_args)) {
299
+			throw new EE_Error(
300
+				__(
301
+					'In order to register an EE_Addon with EE_Register_Addon::register(), you must include the "addon_name" (the name of the addon), and an array of arguments.',
302
+					'event_espresso'
303
+				)
304
+			);
305
+		}
306
+		if (! isset($setup_args['main_file_path']) || empty($setup_args['main_file_path'])) {
307
+			throw new EE_Error(
308
+				sprintf(
309
+					__(
310
+						'When registering an addon, you didn\'t provide the "main_file_path", which is the full path to the main file loaded directly by Wordpress. You only provided %s',
311
+						'event_espresso'
312
+					),
313
+					implode(',', array_keys($setup_args))
314
+				)
315
+			);
316
+		}
317
+		// check that addon has not already been registered with that name
318
+		if (isset(self::$_settings[ $addon_name ]) && ! did_action('activate_plugin')) {
319
+			throw new EE_Error(
320
+				sprintf(
321
+					__(
322
+						'An EE_Addon with the name "%s" has already been registered and each EE_Addon requires a unique name.',
323
+						'event_espresso'
324
+					),
325
+					$addon_name
326
+				)
327
+			);
328
+		}
329
+	}
330 330
 
331 331
 
332
-    /**
333
-     * @param string $addon_name
334
-     * @param array  $setup_args
335
-     * @return string
336
-     */
337
-    private static function _parse_class_name($addon_name, array $setup_args)
338
-    {
339
-        if (empty($setup_args['class_name'])) {
340
-            // generate one by first separating name with spaces
341
-            $class_name = str_replace(array('-', '_'), ' ', trim($addon_name));
342
-            //capitalize, then replace spaces with underscores
343
-            $class_name = str_replace(' ', '_', ucwords($class_name));
344
-        } else {
345
-            $class_name = $setup_args['class_name'];
346
-        }
347
-        // check if classname is fully  qualified or is a legacy classname already prefixed with 'EE_'
348
-        return strpos($class_name, '\\') || strpos($class_name, 'EE_') === 0
349
-            ? $class_name
350
-            : 'EE_' . $class_name;
351
-    }
332
+	/**
333
+	 * @param string $addon_name
334
+	 * @param array  $setup_args
335
+	 * @return string
336
+	 */
337
+	private static function _parse_class_name($addon_name, array $setup_args)
338
+	{
339
+		if (empty($setup_args['class_name'])) {
340
+			// generate one by first separating name with spaces
341
+			$class_name = str_replace(array('-', '_'), ' ', trim($addon_name));
342
+			//capitalize, then replace spaces with underscores
343
+			$class_name = str_replace(' ', '_', ucwords($class_name));
344
+		} else {
345
+			$class_name = $setup_args['class_name'];
346
+		}
347
+		// check if classname is fully  qualified or is a legacy classname already prefixed with 'EE_'
348
+		return strpos($class_name, '\\') || strpos($class_name, 'EE_') === 0
349
+			? $class_name
350
+			: 'EE_' . $class_name;
351
+	}
352 352
 
353 353
 
354
-    /**
355
-     * @param string $class_name
356
-     * @param array  $setup_args
357
-     * @return array
358
-     */
359
-    private static function _get_addon_settings($class_name, array $setup_args)
360
-    {
361
-        //setup $_settings array from incoming values.
362
-        $addon_settings = array(
363
-            // generated from the addon name, changes something like "calendar" to "EE_Calendar"
364
-            'class_name'            => $class_name,
365
-            // the addon slug for use in URLs, etc
366
-            'plugin_slug'           => isset($setup_args['plugin_slug'])
367
-                ? (string) $setup_args['plugin_slug']
368
-                : '',
369
-            // page slug to be used when generating the "Settings" link on the WP plugin page
370
-            'plugin_action_slug'    => isset($setup_args['plugin_action_slug'])
371
-                ? (string) $setup_args['plugin_action_slug']
372
-                : '',
373
-            // the "software" version for the addon
374
-            'version'               => isset($setup_args['version'])
375
-                ? (string) $setup_args['version']
376
-                : '',
377
-            // the minimum version of EE Core that the addon will work with
378
-            'min_core_version'      => isset($setup_args['min_core_version'])
379
-                ? (string) $setup_args['min_core_version']
380
-                : '',
381
-            // the minimum version of WordPress that the addon will work with
382
-            'min_wp_version'        => isset($setup_args['min_wp_version'])
383
-                ? (string) $setup_args['min_wp_version']
384
-                : EE_MIN_WP_VER_REQUIRED,
385
-            // full server path to main file (file loaded directly by WP)
386
-            'main_file_path'        => isset($setup_args['main_file_path'])
387
-                ? (string) $setup_args['main_file_path']
388
-                : '',
389
-            // path to folder containing files for integrating with the EE core admin and/or setting up EE admin pages
390
-            'admin_path'            => isset($setup_args['admin_path'])
391
-                ? (string) $setup_args['admin_path'] : '',
392
-            // a method to be called when the EE Admin is first invoked, can be used for hooking into any admin page
393
-            'admin_callback'        => isset($setup_args['admin_callback'])
394
-                ? (string) $setup_args['admin_callback']
395
-                : '',
396
-            // the section name for this addon's configuration settings section (defaults to "addons")
397
-            'config_section'        => isset($setup_args['config_section'])
398
-                ? (string) $setup_args['config_section']
399
-                : 'addons',
400
-            // the class name for this addon's configuration settings object
401
-            'config_class'          => isset($setup_args['config_class'])
402
-                ? (string) $setup_args['config_class'] : '',
403
-            //the name given to the config for this addons' configuration settings object (optional)
404
-            'config_name'           => isset($setup_args['config_name'])
405
-                ? (string) $setup_args['config_name'] : '',
406
-            // an array of "class names" => "full server paths" for any classes that might be invoked by the addon
407
-            'autoloader_paths'      => isset($setup_args['autoloader_paths'])
408
-                ? (array) $setup_args['autoloader_paths']
409
-                : array(),
410
-            // an array of  "full server paths" for any folders containing classes that might be invoked by the addon
411
-            'autoloader_folders'    => isset($setup_args['autoloader_folders'])
412
-                ? (array) $setup_args['autoloader_folders']
413
-                : array(),
414
-            // array of full server paths to any EE_DMS data migration scripts used by the addon
415
-            'dms_paths'             => isset($setup_args['dms_paths'])
416
-                ? (array) $setup_args['dms_paths']
417
-                : array(),
418
-            // array of full server paths to any EED_Modules used by the addon
419
-            'module_paths'          => isset($setup_args['module_paths'])
420
-                ? (array) $setup_args['module_paths']
421
-                : array(),
422
-            // array of full server paths to any EES_Shortcodes used by the addon
423
-            'shortcode_paths'       => isset($setup_args['shortcode_paths'])
424
-                ? (array) $setup_args['shortcode_paths']
425
-                : array(),
426
-            'shortcode_fqcns'       => isset($setup_args['shortcode_fqcns'])
427
-                ? (array) $setup_args['shortcode_fqcns']
428
-                : array(),
429
-            // array of full server paths to any WP_Widgets used by the addon
430
-            'widget_paths'          => isset($setup_args['widget_paths'])
431
-                ? (array) $setup_args['widget_paths']
432
-                : array(),
433
-            // array of PUE options used by the addon
434
-            'pue_options'           => isset($setup_args['pue_options'])
435
-                ? (array) $setup_args['pue_options']
436
-                : array(),
437
-            'message_types'         => isset($setup_args['message_types'])
438
-                ? (array) $setup_args['message_types']
439
-                : array(),
440
-            'capabilities'          => isset($setup_args['capabilities'])
441
-                ? (array) $setup_args['capabilities']
442
-                : array(),
443
-            'capability_maps'       => isset($setup_args['capability_maps'])
444
-                ? (array) $setup_args['capability_maps']
445
-                : array(),
446
-            'model_paths'           => isset($setup_args['model_paths'])
447
-                ? (array) $setup_args['model_paths']
448
-                : array(),
449
-            'class_paths'           => isset($setup_args['class_paths'])
450
-                ? (array) $setup_args['class_paths']
451
-                : array(),
452
-            'model_extension_paths' => isset($setup_args['model_extension_paths'])
453
-                ? (array) $setup_args['model_extension_paths']
454
-                : array(),
455
-            'class_extension_paths' => isset($setup_args['class_extension_paths'])
456
-                ? (array) $setup_args['class_extension_paths']
457
-                : array(),
458
-            'custom_post_types'     => isset($setup_args['custom_post_types'])
459
-                ? (array) $setup_args['custom_post_types']
460
-                : array(),
461
-            'custom_taxonomies'     => isset($setup_args['custom_taxonomies'])
462
-                ? (array) $setup_args['custom_taxonomies']
463
-                : array(),
464
-            'payment_method_paths'  => isset($setup_args['payment_method_paths'])
465
-                ? (array) $setup_args['payment_method_paths']
466
-                : array(),
467
-            'default_terms'         => isset($setup_args['default_terms'])
468
-                ? (array) $setup_args['default_terms']
469
-                : array(),
470
-            // if not empty, inserts a new table row after this plugin's row on the WP Plugins page
471
-            // that can be used for adding upgrading/marketing info
472
-            'plugins_page_row'      => isset($setup_args['plugins_page_row'])
473
-                ? $setup_args['plugins_page_row']
474
-                : '',
475
-            'namespace'             => isset(
476
-                $setup_args['namespace']['FQNS'],
477
-                $setup_args['namespace']['DIR']
478
-            )
479
-                ? (array) $setup_args['namespace']
480
-                : array(),
481
-        );
482
-        // if plugin_action_slug is NOT set, but an admin page path IS set,
483
-        // then let's just use the plugin_slug since that will be used for linking to the admin page
484
-        $addon_settings['plugin_action_slug'] = empty($addon_settings['plugin_action_slug'])
485
-                                                && ! empty($addon_settings['admin_path'])
486
-            ? $addon_settings['plugin_slug']
487
-            : $addon_settings['plugin_action_slug'];
488
-        // full server path to main file (file loaded directly by WP)
489
-        $addon_settings['plugin_basename'] = plugin_basename($addon_settings['main_file_path']);
490
-        return $addon_settings;
491
-    }
354
+	/**
355
+	 * @param string $class_name
356
+	 * @param array  $setup_args
357
+	 * @return array
358
+	 */
359
+	private static function _get_addon_settings($class_name, array $setup_args)
360
+	{
361
+		//setup $_settings array from incoming values.
362
+		$addon_settings = array(
363
+			// generated from the addon name, changes something like "calendar" to "EE_Calendar"
364
+			'class_name'            => $class_name,
365
+			// the addon slug for use in URLs, etc
366
+			'plugin_slug'           => isset($setup_args['plugin_slug'])
367
+				? (string) $setup_args['plugin_slug']
368
+				: '',
369
+			// page slug to be used when generating the "Settings" link on the WP plugin page
370
+			'plugin_action_slug'    => isset($setup_args['plugin_action_slug'])
371
+				? (string) $setup_args['plugin_action_slug']
372
+				: '',
373
+			// the "software" version for the addon
374
+			'version'               => isset($setup_args['version'])
375
+				? (string) $setup_args['version']
376
+				: '',
377
+			// the minimum version of EE Core that the addon will work with
378
+			'min_core_version'      => isset($setup_args['min_core_version'])
379
+				? (string) $setup_args['min_core_version']
380
+				: '',
381
+			// the minimum version of WordPress that the addon will work with
382
+			'min_wp_version'        => isset($setup_args['min_wp_version'])
383
+				? (string) $setup_args['min_wp_version']
384
+				: EE_MIN_WP_VER_REQUIRED,
385
+			// full server path to main file (file loaded directly by WP)
386
+			'main_file_path'        => isset($setup_args['main_file_path'])
387
+				? (string) $setup_args['main_file_path']
388
+				: '',
389
+			// path to folder containing files for integrating with the EE core admin and/or setting up EE admin pages
390
+			'admin_path'            => isset($setup_args['admin_path'])
391
+				? (string) $setup_args['admin_path'] : '',
392
+			// a method to be called when the EE Admin is first invoked, can be used for hooking into any admin page
393
+			'admin_callback'        => isset($setup_args['admin_callback'])
394
+				? (string) $setup_args['admin_callback']
395
+				: '',
396
+			// the section name for this addon's configuration settings section (defaults to "addons")
397
+			'config_section'        => isset($setup_args['config_section'])
398
+				? (string) $setup_args['config_section']
399
+				: 'addons',
400
+			// the class name for this addon's configuration settings object
401
+			'config_class'          => isset($setup_args['config_class'])
402
+				? (string) $setup_args['config_class'] : '',
403
+			//the name given to the config for this addons' configuration settings object (optional)
404
+			'config_name'           => isset($setup_args['config_name'])
405
+				? (string) $setup_args['config_name'] : '',
406
+			// an array of "class names" => "full server paths" for any classes that might be invoked by the addon
407
+			'autoloader_paths'      => isset($setup_args['autoloader_paths'])
408
+				? (array) $setup_args['autoloader_paths']
409
+				: array(),
410
+			// an array of  "full server paths" for any folders containing classes that might be invoked by the addon
411
+			'autoloader_folders'    => isset($setup_args['autoloader_folders'])
412
+				? (array) $setup_args['autoloader_folders']
413
+				: array(),
414
+			// array of full server paths to any EE_DMS data migration scripts used by the addon
415
+			'dms_paths'             => isset($setup_args['dms_paths'])
416
+				? (array) $setup_args['dms_paths']
417
+				: array(),
418
+			// array of full server paths to any EED_Modules used by the addon
419
+			'module_paths'          => isset($setup_args['module_paths'])
420
+				? (array) $setup_args['module_paths']
421
+				: array(),
422
+			// array of full server paths to any EES_Shortcodes used by the addon
423
+			'shortcode_paths'       => isset($setup_args['shortcode_paths'])
424
+				? (array) $setup_args['shortcode_paths']
425
+				: array(),
426
+			'shortcode_fqcns'       => isset($setup_args['shortcode_fqcns'])
427
+				? (array) $setup_args['shortcode_fqcns']
428
+				: array(),
429
+			// array of full server paths to any WP_Widgets used by the addon
430
+			'widget_paths'          => isset($setup_args['widget_paths'])
431
+				? (array) $setup_args['widget_paths']
432
+				: array(),
433
+			// array of PUE options used by the addon
434
+			'pue_options'           => isset($setup_args['pue_options'])
435
+				? (array) $setup_args['pue_options']
436
+				: array(),
437
+			'message_types'         => isset($setup_args['message_types'])
438
+				? (array) $setup_args['message_types']
439
+				: array(),
440
+			'capabilities'          => isset($setup_args['capabilities'])
441
+				? (array) $setup_args['capabilities']
442
+				: array(),
443
+			'capability_maps'       => isset($setup_args['capability_maps'])
444
+				? (array) $setup_args['capability_maps']
445
+				: array(),
446
+			'model_paths'           => isset($setup_args['model_paths'])
447
+				? (array) $setup_args['model_paths']
448
+				: array(),
449
+			'class_paths'           => isset($setup_args['class_paths'])
450
+				? (array) $setup_args['class_paths']
451
+				: array(),
452
+			'model_extension_paths' => isset($setup_args['model_extension_paths'])
453
+				? (array) $setup_args['model_extension_paths']
454
+				: array(),
455
+			'class_extension_paths' => isset($setup_args['class_extension_paths'])
456
+				? (array) $setup_args['class_extension_paths']
457
+				: array(),
458
+			'custom_post_types'     => isset($setup_args['custom_post_types'])
459
+				? (array) $setup_args['custom_post_types']
460
+				: array(),
461
+			'custom_taxonomies'     => isset($setup_args['custom_taxonomies'])
462
+				? (array) $setup_args['custom_taxonomies']
463
+				: array(),
464
+			'payment_method_paths'  => isset($setup_args['payment_method_paths'])
465
+				? (array) $setup_args['payment_method_paths']
466
+				: array(),
467
+			'default_terms'         => isset($setup_args['default_terms'])
468
+				? (array) $setup_args['default_terms']
469
+				: array(),
470
+			// if not empty, inserts a new table row after this plugin's row on the WP Plugins page
471
+			// that can be used for adding upgrading/marketing info
472
+			'plugins_page_row'      => isset($setup_args['plugins_page_row'])
473
+				? $setup_args['plugins_page_row']
474
+				: '',
475
+			'namespace'             => isset(
476
+				$setup_args['namespace']['FQNS'],
477
+				$setup_args['namespace']['DIR']
478
+			)
479
+				? (array) $setup_args['namespace']
480
+				: array(),
481
+		);
482
+		// if plugin_action_slug is NOT set, but an admin page path IS set,
483
+		// then let's just use the plugin_slug since that will be used for linking to the admin page
484
+		$addon_settings['plugin_action_slug'] = empty($addon_settings['plugin_action_slug'])
485
+												&& ! empty($addon_settings['admin_path'])
486
+			? $addon_settings['plugin_slug']
487
+			: $addon_settings['plugin_action_slug'];
488
+		// full server path to main file (file loaded directly by WP)
489
+		$addon_settings['plugin_basename'] = plugin_basename($addon_settings['main_file_path']);
490
+		return $addon_settings;
491
+	}
492 492
 
493 493
 
494
-    /**
495
-     * @param string $addon_name
496
-     * @param array  $addon_settings
497
-     * @return boolean
498
-     */
499
-    private static function _addon_is_compatible($addon_name, array $addon_settings)
500
-    {
501
-        global $wp_version;
502
-        $incompatibility_message = '';
503
-        //check whether this addon version is compatible with EE core
504
-        if (
505
-            isset(EE_Register_Addon::$_incompatible_addons[ $addon_name ])
506
-            && ! self::_meets_min_core_version_requirement(
507
-                EE_Register_Addon::$_incompatible_addons[ $addon_name ],
508
-                $addon_settings['version']
509
-            )
510
-        ) {
511
-            $incompatibility_message = sprintf(
512
-                __(
513
-                    '%4$sIMPORTANT!%5$sThe Event Espresso "%1$s" addon is not compatible with this version of Event Espresso.%2$sPlease upgrade your "%1$s" addon to version %3$s or newer to resolve this issue.'
514
-                ),
515
-                $addon_name,
516
-                '<br />',
517
-                EE_Register_Addon::$_incompatible_addons[ $addon_name ],
518
-                '<span style="font-weight: bold; color: #D54E21;">',
519
-                '</span><br />'
520
-            );
521
-        } elseif (
522
-        ! self::_meets_min_core_version_requirement($addon_settings['min_core_version'], espresso_version())
523
-        ) {
524
-            $incompatibility_message = sprintf(
525
-                __(
526
-                    '%5$sIMPORTANT!%6$sThe Event Espresso "%1$s" addon requires Event Espresso Core version "%2$s" or higher in order to run.%4$sYour version of Event Espresso Core is currently at "%3$s". Please upgrade Event Espresso Core first and then re-activate "%1$s".',
527
-                    'event_espresso'
528
-                ),
529
-                $addon_name,
530
-                self::_effective_version($addon_settings['min_core_version']),
531
-                self::_effective_version(espresso_version()),
532
-                '<br />',
533
-                '<span style="font-weight: bold; color: #D54E21;">',
534
-                '</span><br />'
535
-            );
536
-        } elseif (version_compare($wp_version, $addon_settings['min_wp_version'], '<')) {
537
-            $incompatibility_message = sprintf(
538
-                __(
539
-                    '%4$sIMPORTANT!%5$sThe Event Espresso "%1$s" addon requires WordPress version "%2$s" or greater.%3$sPlease update your version of WordPress to use the "%1$s" addon and to keep your site secure.',
540
-                    'event_espresso'
541
-                ),
542
-                $addon_name,
543
-                $addon_settings['min_wp_version'],
544
-                '<br />',
545
-                '<span style="font-weight: bold; color: #D54E21;">',
546
-                '</span><br />'
547
-            );
548
-        }
549
-        if (! empty($incompatibility_message)) {
550
-            // remove 'activate' from the REQUEST
551
-            // so WP doesn't erroneously tell the user the plugin activated fine when it didn't
552
-            unset($_GET['activate'], $_REQUEST['activate']);
553
-            if (current_user_can('activate_plugins')) {
554
-                // show an error message indicating the plugin didn't activate properly
555
-                EE_Error::add_error($incompatibility_message, __FILE__, __FUNCTION__, __LINE__);
556
-            }
557
-            // BAIL FROM THE ADDON REGISTRATION PROCESS
558
-            return false;
559
-        }
560
-        // addon IS compatible
561
-        return true;
562
-    }
494
+	/**
495
+	 * @param string $addon_name
496
+	 * @param array  $addon_settings
497
+	 * @return boolean
498
+	 */
499
+	private static function _addon_is_compatible($addon_name, array $addon_settings)
500
+	{
501
+		global $wp_version;
502
+		$incompatibility_message = '';
503
+		//check whether this addon version is compatible with EE core
504
+		if (
505
+			isset(EE_Register_Addon::$_incompatible_addons[ $addon_name ])
506
+			&& ! self::_meets_min_core_version_requirement(
507
+				EE_Register_Addon::$_incompatible_addons[ $addon_name ],
508
+				$addon_settings['version']
509
+			)
510
+		) {
511
+			$incompatibility_message = sprintf(
512
+				__(
513
+					'%4$sIMPORTANT!%5$sThe Event Espresso "%1$s" addon is not compatible with this version of Event Espresso.%2$sPlease upgrade your "%1$s" addon to version %3$s or newer to resolve this issue.'
514
+				),
515
+				$addon_name,
516
+				'<br />',
517
+				EE_Register_Addon::$_incompatible_addons[ $addon_name ],
518
+				'<span style="font-weight: bold; color: #D54E21;">',
519
+				'</span><br />'
520
+			);
521
+		} elseif (
522
+		! self::_meets_min_core_version_requirement($addon_settings['min_core_version'], espresso_version())
523
+		) {
524
+			$incompatibility_message = sprintf(
525
+				__(
526
+					'%5$sIMPORTANT!%6$sThe Event Espresso "%1$s" addon requires Event Espresso Core version "%2$s" or higher in order to run.%4$sYour version of Event Espresso Core is currently at "%3$s". Please upgrade Event Espresso Core first and then re-activate "%1$s".',
527
+					'event_espresso'
528
+				),
529
+				$addon_name,
530
+				self::_effective_version($addon_settings['min_core_version']),
531
+				self::_effective_version(espresso_version()),
532
+				'<br />',
533
+				'<span style="font-weight: bold; color: #D54E21;">',
534
+				'</span><br />'
535
+			);
536
+		} elseif (version_compare($wp_version, $addon_settings['min_wp_version'], '<')) {
537
+			$incompatibility_message = sprintf(
538
+				__(
539
+					'%4$sIMPORTANT!%5$sThe Event Espresso "%1$s" addon requires WordPress version "%2$s" or greater.%3$sPlease update your version of WordPress to use the "%1$s" addon and to keep your site secure.',
540
+					'event_espresso'
541
+				),
542
+				$addon_name,
543
+				$addon_settings['min_wp_version'],
544
+				'<br />',
545
+				'<span style="font-weight: bold; color: #D54E21;">',
546
+				'</span><br />'
547
+			);
548
+		}
549
+		if (! empty($incompatibility_message)) {
550
+			// remove 'activate' from the REQUEST
551
+			// so WP doesn't erroneously tell the user the plugin activated fine when it didn't
552
+			unset($_GET['activate'], $_REQUEST['activate']);
553
+			if (current_user_can('activate_plugins')) {
554
+				// show an error message indicating the plugin didn't activate properly
555
+				EE_Error::add_error($incompatibility_message, __FILE__, __FUNCTION__, __LINE__);
556
+			}
557
+			// BAIL FROM THE ADDON REGISTRATION PROCESS
558
+			return false;
559
+		}
560
+		// addon IS compatible
561
+		return true;
562
+	}
563 563
 
564 564
 
565
-    /**
566
-     * if plugin update engine is being used for auto-updates,
567
-     * then let's set that up now before going any further so that ALL addons can be updated
568
-     * (not needed if PUE is not being used)
569
-     *
570
-     * @param string $addon_name
571
-     * @param string $class_name
572
-     * @param array  $setup_args
573
-     * @return void
574
-     */
575
-    private static function _parse_pue_options($addon_name, $class_name, array $setup_args)
576
-    {
577
-        if (! empty($setup_args['pue_options'])) {
578
-            self::$_settings[ $addon_name ]['pue_options'] = array(
579
-                'pue_plugin_slug' => isset($setup_args['pue_options']['pue_plugin_slug'])
580
-                    ? (string) $setup_args['pue_options']['pue_plugin_slug']
581
-                    : 'espresso_' . strtolower($class_name),
582
-                'plugin_basename' => isset($setup_args['pue_options']['plugin_basename'])
583
-                    ? (string) $setup_args['pue_options']['plugin_basename']
584
-                    : plugin_basename($setup_args['main_file_path']),
585
-                'checkPeriod'     => isset($setup_args['pue_options']['checkPeriod'])
586
-                    ? (string) $setup_args['pue_options']['checkPeriod']
587
-                    : '24',
588
-                'use_wp_update'   => isset($setup_args['pue_options']['use_wp_update'])
589
-                    ? (string) $setup_args['pue_options']['use_wp_update']
590
-                    : false,
591
-            );
592
-            add_action(
593
-                'AHEE__EE_System__brew_espresso__after_pue_init',
594
-                array('EE_Register_Addon', 'load_pue_update')
595
-            );
596
-        }
597
-    }
565
+	/**
566
+	 * if plugin update engine is being used for auto-updates,
567
+	 * then let's set that up now before going any further so that ALL addons can be updated
568
+	 * (not needed if PUE is not being used)
569
+	 *
570
+	 * @param string $addon_name
571
+	 * @param string $class_name
572
+	 * @param array  $setup_args
573
+	 * @return void
574
+	 */
575
+	private static function _parse_pue_options($addon_name, $class_name, array $setup_args)
576
+	{
577
+		if (! empty($setup_args['pue_options'])) {
578
+			self::$_settings[ $addon_name ]['pue_options'] = array(
579
+				'pue_plugin_slug' => isset($setup_args['pue_options']['pue_plugin_slug'])
580
+					? (string) $setup_args['pue_options']['pue_plugin_slug']
581
+					: 'espresso_' . strtolower($class_name),
582
+				'plugin_basename' => isset($setup_args['pue_options']['plugin_basename'])
583
+					? (string) $setup_args['pue_options']['plugin_basename']
584
+					: plugin_basename($setup_args['main_file_path']),
585
+				'checkPeriod'     => isset($setup_args['pue_options']['checkPeriod'])
586
+					? (string) $setup_args['pue_options']['checkPeriod']
587
+					: '24',
588
+				'use_wp_update'   => isset($setup_args['pue_options']['use_wp_update'])
589
+					? (string) $setup_args['pue_options']['use_wp_update']
590
+					: false,
591
+			);
592
+			add_action(
593
+				'AHEE__EE_System__brew_espresso__after_pue_init',
594
+				array('EE_Register_Addon', 'load_pue_update')
595
+			);
596
+		}
597
+	}
598 598
 
599 599
 
600
-    /**
601
-     * register namespaces right away before any other files or classes get loaded, but AFTER the version checks
602
-     *
603
-     * @param array $addon_settings
604
-     * @return void
605
-     */
606
-    private static function _setup_namespaces(array $addon_settings)
607
-    {
608
-        //
609
-        if (
610
-        isset(
611
-            $addon_settings['namespace']['FQNS'],
612
-            $addon_settings['namespace']['DIR']
613
-        )
614
-        ) {
615
-            EE_Psr4AutoloaderInit::psr4_loader()->addNamespace(
616
-                $addon_settings['namespace']['FQNS'],
617
-                $addon_settings['namespace']['DIR']
618
-            );
619
-        }
620
-    }
600
+	/**
601
+	 * register namespaces right away before any other files or classes get loaded, but AFTER the version checks
602
+	 *
603
+	 * @param array $addon_settings
604
+	 * @return void
605
+	 */
606
+	private static function _setup_namespaces(array $addon_settings)
607
+	{
608
+		//
609
+		if (
610
+		isset(
611
+			$addon_settings['namespace']['FQNS'],
612
+			$addon_settings['namespace']['DIR']
613
+		)
614
+		) {
615
+			EE_Psr4AutoloaderInit::psr4_loader()->addNamespace(
616
+				$addon_settings['namespace']['FQNS'],
617
+				$addon_settings['namespace']['DIR']
618
+			);
619
+		}
620
+	}
621 621
 
622 622
 
623
-    /**
624
-     * @param string $addon_name
625
-     * @param array  $addon_settings
626
-     * @return bool
627
-     * @throws EE_Error
628
-     * @throws InvalidArgumentException
629
-     * @throws ReflectionException
630
-     * @throws InvalidDataTypeException
631
-     * @throws InvalidInterfaceException
632
-     */
633
-    private static function _addon_activation($addon_name, array $addon_settings)
634
-    {
635
-        // this is an activation request
636
-        if (did_action('activate_plugin')) {
637
-            //to find if THIS is the addon that was activated, just check if we have already registered it or not
638
-            //(as the newly-activated addon wasn't around the first time addons were registered).
639
-            //Note: the presence of pue_options in the addon registration options will initialize the $_settings
640
-            //property for the add-on, but the add-on is only partially initialized.  Hence, the additional check.
641
-            if (! isset(self::$_settings[ $addon_name ])
642
-                || (isset(self::$_settings[ $addon_name ])
643
-                    && ! isset(self::$_settings[ $addon_name ]['class_name'])
644
-                )
645
-            ) {
646
-                self::$_settings[ $addon_name ] = $addon_settings;
647
-                $addon                          = self::_load_and_init_addon_class($addon_name);
648
-                $addon->set_activation_indicator_option();
649
-                // dont bother setting up the rest of the addon.
650
-                // we know it was just activated and the request will end soon
651
-            }
652
-            return true;
653
-        }
654
-        // make sure this was called in the right place!
655
-        if (
656
-            ! did_action('AHEE__EE_System__load_espresso_addons')
657
-            || did_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin')
658
-        ) {
659
-            EE_Error::doing_it_wrong(
660
-                __METHOD__,
661
-                sprintf(
662
-                    __(
663
-                        'An attempt to register an EE_Addon named "%s" has failed because it was not registered at the correct time.  Please use the "AHEE__EE_System__load_espresso_addons" hook to register addons.',
664
-                        'event_espresso'
665
-                    ),
666
-                    $addon_name
667
-                ),
668
-                '4.3.0'
669
-            );
670
-        }
671
-        // make sure addon settings are set correctly without overwriting anything existing
672
-        if (isset(self::$_settings[ $addon_name ])) {
673
-            self::$_settings[ $addon_name ] += $addon_settings;
674
-        } else {
675
-            self::$_settings[ $addon_name ] = $addon_settings;
676
-        }
677
-        return false;
678
-    }
623
+	/**
624
+	 * @param string $addon_name
625
+	 * @param array  $addon_settings
626
+	 * @return bool
627
+	 * @throws EE_Error
628
+	 * @throws InvalidArgumentException
629
+	 * @throws ReflectionException
630
+	 * @throws InvalidDataTypeException
631
+	 * @throws InvalidInterfaceException
632
+	 */
633
+	private static function _addon_activation($addon_name, array $addon_settings)
634
+	{
635
+		// this is an activation request
636
+		if (did_action('activate_plugin')) {
637
+			//to find if THIS is the addon that was activated, just check if we have already registered it or not
638
+			//(as the newly-activated addon wasn't around the first time addons were registered).
639
+			//Note: the presence of pue_options in the addon registration options will initialize the $_settings
640
+			//property for the add-on, but the add-on is only partially initialized.  Hence, the additional check.
641
+			if (! isset(self::$_settings[ $addon_name ])
642
+				|| (isset(self::$_settings[ $addon_name ])
643
+					&& ! isset(self::$_settings[ $addon_name ]['class_name'])
644
+				)
645
+			) {
646
+				self::$_settings[ $addon_name ] = $addon_settings;
647
+				$addon                          = self::_load_and_init_addon_class($addon_name);
648
+				$addon->set_activation_indicator_option();
649
+				// dont bother setting up the rest of the addon.
650
+				// we know it was just activated and the request will end soon
651
+			}
652
+			return true;
653
+		}
654
+		// make sure this was called in the right place!
655
+		if (
656
+			! did_action('AHEE__EE_System__load_espresso_addons')
657
+			|| did_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin')
658
+		) {
659
+			EE_Error::doing_it_wrong(
660
+				__METHOD__,
661
+				sprintf(
662
+					__(
663
+						'An attempt to register an EE_Addon named "%s" has failed because it was not registered at the correct time.  Please use the "AHEE__EE_System__load_espresso_addons" hook to register addons.',
664
+						'event_espresso'
665
+					),
666
+					$addon_name
667
+				),
668
+				'4.3.0'
669
+			);
670
+		}
671
+		// make sure addon settings are set correctly without overwriting anything existing
672
+		if (isset(self::$_settings[ $addon_name ])) {
673
+			self::$_settings[ $addon_name ] += $addon_settings;
674
+		} else {
675
+			self::$_settings[ $addon_name ] = $addon_settings;
676
+		}
677
+		return false;
678
+	}
679 679
 
680 680
 
681
-    /**
682
-     * @param string $addon_name
683
-     * @return void
684
-     * @throws EE_Error
685
-     */
686
-    private static function _setup_autoloaders($addon_name)
687
-    {
688
-        if (! empty(self::$_settings[ $addon_name ]['autoloader_paths'])) {
689
-            // setup autoloader for single file
690
-            EEH_Autoloader::instance()->register_autoloader(self::$_settings[ $addon_name ]['autoloader_paths']);
691
-        }
692
-        // setup autoloaders for folders
693
-        if (! empty(self::$_settings[ $addon_name ]['autoloader_folders'])) {
694
-            foreach ((array) self::$_settings[ $addon_name ]['autoloader_folders'] as $autoloader_folder) {
695
-                EEH_Autoloader::register_autoloaders_for_each_file_in_folder($autoloader_folder);
696
-            }
697
-        }
698
-    }
681
+	/**
682
+	 * @param string $addon_name
683
+	 * @return void
684
+	 * @throws EE_Error
685
+	 */
686
+	private static function _setup_autoloaders($addon_name)
687
+	{
688
+		if (! empty(self::$_settings[ $addon_name ]['autoloader_paths'])) {
689
+			// setup autoloader for single file
690
+			EEH_Autoloader::instance()->register_autoloader(self::$_settings[ $addon_name ]['autoloader_paths']);
691
+		}
692
+		// setup autoloaders for folders
693
+		if (! empty(self::$_settings[ $addon_name ]['autoloader_folders'])) {
694
+			foreach ((array) self::$_settings[ $addon_name ]['autoloader_folders'] as $autoloader_folder) {
695
+				EEH_Autoloader::register_autoloaders_for_each_file_in_folder($autoloader_folder);
696
+			}
697
+		}
698
+	}
699 699
 
700 700
 
701
-    /**
702
-     * register new models and extensions
703
-     *
704
-     * @param string $addon_name
705
-     * @return void
706
-     * @throws EE_Error
707
-     */
708
-    private static function _register_models_and_extensions($addon_name)
709
-    {
710
-        // register new models
711
-        if (
712
-            ! empty(self::$_settings[ $addon_name ]['model_paths'])
713
-            || ! empty(self::$_settings[ $addon_name ]['class_paths'])
714
-        ) {
715
-            EE_Register_Model::register(
716
-                $addon_name,
717
-                array(
718
-                    'model_paths' => self::$_settings[ $addon_name ]['model_paths'],
719
-                    'class_paths' => self::$_settings[ $addon_name ]['class_paths'],
720
-                )
721
-            );
722
-        }
723
-        // register model extensions
724
-        if (
725
-            ! empty(self::$_settings[ $addon_name ]['model_extension_paths'])
726
-            || ! empty(self::$_settings[ $addon_name ]['class_extension_paths'])
727
-        ) {
728
-            EE_Register_Model_Extensions::register(
729
-                $addon_name,
730
-                array(
731
-                    'model_extension_paths' => self::$_settings[ $addon_name ]['model_extension_paths'],
732
-                    'class_extension_paths' => self::$_settings[ $addon_name ]['class_extension_paths'],
733
-                )
734
-            );
735
-        }
736
-    }
701
+	/**
702
+	 * register new models and extensions
703
+	 *
704
+	 * @param string $addon_name
705
+	 * @return void
706
+	 * @throws EE_Error
707
+	 */
708
+	private static function _register_models_and_extensions($addon_name)
709
+	{
710
+		// register new models
711
+		if (
712
+			! empty(self::$_settings[ $addon_name ]['model_paths'])
713
+			|| ! empty(self::$_settings[ $addon_name ]['class_paths'])
714
+		) {
715
+			EE_Register_Model::register(
716
+				$addon_name,
717
+				array(
718
+					'model_paths' => self::$_settings[ $addon_name ]['model_paths'],
719
+					'class_paths' => self::$_settings[ $addon_name ]['class_paths'],
720
+				)
721
+			);
722
+		}
723
+		// register model extensions
724
+		if (
725
+			! empty(self::$_settings[ $addon_name ]['model_extension_paths'])
726
+			|| ! empty(self::$_settings[ $addon_name ]['class_extension_paths'])
727
+		) {
728
+			EE_Register_Model_Extensions::register(
729
+				$addon_name,
730
+				array(
731
+					'model_extension_paths' => self::$_settings[ $addon_name ]['model_extension_paths'],
732
+					'class_extension_paths' => self::$_settings[ $addon_name ]['class_extension_paths'],
733
+				)
734
+			);
735
+		}
736
+	}
737 737
 
738 738
 
739
-    /**
740
-     * @param string $addon_name
741
-     * @return void
742
-     * @throws EE_Error
743
-     */
744
-    private static function _register_data_migration_scripts($addon_name)
745
-    {
746
-        // setup DMS
747
-        if (! empty(self::$_settings[ $addon_name ]['dms_paths'])) {
748
-            EE_Register_Data_Migration_Scripts::register(
749
-                $addon_name,
750
-                array('dms_paths' => self::$_settings[ $addon_name ]['dms_paths'])
751
-            );
752
-        }
753
-    }
739
+	/**
740
+	 * @param string $addon_name
741
+	 * @return void
742
+	 * @throws EE_Error
743
+	 */
744
+	private static function _register_data_migration_scripts($addon_name)
745
+	{
746
+		// setup DMS
747
+		if (! empty(self::$_settings[ $addon_name ]['dms_paths'])) {
748
+			EE_Register_Data_Migration_Scripts::register(
749
+				$addon_name,
750
+				array('dms_paths' => self::$_settings[ $addon_name ]['dms_paths'])
751
+			);
752
+		}
753
+	}
754 754
 
755 755
 
756
-    /**
757
-     * @param string $addon_name
758
-     * @return void
759
-     * @throws EE_Error
760
-     */
761
-    private static function _register_config($addon_name)
762
-    {
763
-        // if config_class is present let's register config.
764
-        if (! empty(self::$_settings[ $addon_name ]['config_class'])) {
765
-            EE_Register_Config::register(
766
-                self::$_settings[ $addon_name ]['config_class'],
767
-                array(
768
-                    'config_section' => self::$_settings[ $addon_name ]['config_section'],
769
-                    'config_name'    => self::$_settings[ $addon_name ]['config_name'],
770
-                )
771
-            );
772
-        }
773
-    }
756
+	/**
757
+	 * @param string $addon_name
758
+	 * @return void
759
+	 * @throws EE_Error
760
+	 */
761
+	private static function _register_config($addon_name)
762
+	{
763
+		// if config_class is present let's register config.
764
+		if (! empty(self::$_settings[ $addon_name ]['config_class'])) {
765
+			EE_Register_Config::register(
766
+				self::$_settings[ $addon_name ]['config_class'],
767
+				array(
768
+					'config_section' => self::$_settings[ $addon_name ]['config_section'],
769
+					'config_name'    => self::$_settings[ $addon_name ]['config_name'],
770
+				)
771
+			);
772
+		}
773
+	}
774 774
 
775 775
 
776
-    /**
777
-     * @param string $addon_name
778
-     * @return void
779
-     * @throws EE_Error
780
-     */
781
-    private static function _register_admin_pages($addon_name)
782
-    {
783
-        if (! empty(self::$_settings[ $addon_name ]['admin_path'])) {
784
-            EE_Register_Admin_Page::register(
785
-                $addon_name,
786
-                array('page_path' => self::$_settings[ $addon_name ]['admin_path'])
787
-            );
788
-        }
789
-    }
776
+	/**
777
+	 * @param string $addon_name
778
+	 * @return void
779
+	 * @throws EE_Error
780
+	 */
781
+	private static function _register_admin_pages($addon_name)
782
+	{
783
+		if (! empty(self::$_settings[ $addon_name ]['admin_path'])) {
784
+			EE_Register_Admin_Page::register(
785
+				$addon_name,
786
+				array('page_path' => self::$_settings[ $addon_name ]['admin_path'])
787
+			);
788
+		}
789
+	}
790 790
 
791 791
 
792
-    /**
793
-     * @param string $addon_name
794
-     * @return void
795
-     * @throws EE_Error
796
-     */
797
-    private static function _register_modules($addon_name)
798
-    {
799
-        if (! empty(self::$_settings[ $addon_name ]['module_paths'])) {
800
-            EE_Register_Module::register(
801
-                $addon_name,
802
-                array('module_paths' => self::$_settings[ $addon_name ]['module_paths'])
803
-            );
804
-        }
805
-    }
792
+	/**
793
+	 * @param string $addon_name
794
+	 * @return void
795
+	 * @throws EE_Error
796
+	 */
797
+	private static function _register_modules($addon_name)
798
+	{
799
+		if (! empty(self::$_settings[ $addon_name ]['module_paths'])) {
800
+			EE_Register_Module::register(
801
+				$addon_name,
802
+				array('module_paths' => self::$_settings[ $addon_name ]['module_paths'])
803
+			);
804
+		}
805
+	}
806 806
 
807 807
 
808
-    /**
809
-     * @param string $addon_name
810
-     * @return void
811
-     * @throws EE_Error
812
-     */
813
-    private static function _register_shortcodes($addon_name)
814
-    {
815
-        if (! empty(self::$_settings[ $addon_name ]['shortcode_paths'])
816
-            || ! empty(self::$_settings[ $addon_name ]['shortcode_fqcns'])
817
-        ) {
818
-            EE_Register_Shortcode::register(
819
-                $addon_name,
820
-                array(
821
-                    'shortcode_paths' => isset(self::$_settings[ $addon_name ]['shortcode_paths'])
822
-                        ? self::$_settings[ $addon_name ]['shortcode_paths']
823
-                        : array(),
824
-                    'shortcode_fqcns' => isset(self::$_settings[ $addon_name ]['shortcode_fqcns'])
825
-                        ? self::$_settings[ $addon_name ]['shortcode_fqcns']
826
-                        : array(),
827
-                )
828
-            );
829
-        }
830
-    }
808
+	/**
809
+	 * @param string $addon_name
810
+	 * @return void
811
+	 * @throws EE_Error
812
+	 */
813
+	private static function _register_shortcodes($addon_name)
814
+	{
815
+		if (! empty(self::$_settings[ $addon_name ]['shortcode_paths'])
816
+			|| ! empty(self::$_settings[ $addon_name ]['shortcode_fqcns'])
817
+		) {
818
+			EE_Register_Shortcode::register(
819
+				$addon_name,
820
+				array(
821
+					'shortcode_paths' => isset(self::$_settings[ $addon_name ]['shortcode_paths'])
822
+						? self::$_settings[ $addon_name ]['shortcode_paths']
823
+						: array(),
824
+					'shortcode_fqcns' => isset(self::$_settings[ $addon_name ]['shortcode_fqcns'])
825
+						? self::$_settings[ $addon_name ]['shortcode_fqcns']
826
+						: array(),
827
+				)
828
+			);
829
+		}
830
+	}
831 831
 
832 832
 
833
-    /**
834
-     * @param string $addon_name
835
-     * @return void
836
-     * @throws EE_Error
837
-     */
838
-    private static function _register_widgets($addon_name)
839
-    {
840
-        if (! empty(self::$_settings[ $addon_name ]['widget_paths'])) {
841
-            EE_Register_Widget::register(
842
-                $addon_name,
843
-                array('widget_paths' => self::$_settings[ $addon_name ]['widget_paths'])
844
-            );
845
-        }
846
-    }
833
+	/**
834
+	 * @param string $addon_name
835
+	 * @return void
836
+	 * @throws EE_Error
837
+	 */
838
+	private static function _register_widgets($addon_name)
839
+	{
840
+		if (! empty(self::$_settings[ $addon_name ]['widget_paths'])) {
841
+			EE_Register_Widget::register(
842
+				$addon_name,
843
+				array('widget_paths' => self::$_settings[ $addon_name ]['widget_paths'])
844
+			);
845
+		}
846
+	}
847 847
 
848 848
 
849
-    /**
850
-     * @param string $addon_name
851
-     * @return void
852
-     * @throws EE_Error
853
-     */
854
-    private static function _register_capabilities($addon_name)
855
-    {
856
-        if (! empty(self::$_settings[ $addon_name ]['capabilities'])) {
857
-            EE_Register_Capabilities::register(
858
-                $addon_name,
859
-                array(
860
-                    'capabilities'    => self::$_settings[ $addon_name ]['capabilities'],
861
-                    'capability_maps' => self::$_settings[ $addon_name ]['capability_maps'],
862
-                )
863
-            );
864
-        }
865
-    }
849
+	/**
850
+	 * @param string $addon_name
851
+	 * @return void
852
+	 * @throws EE_Error
853
+	 */
854
+	private static function _register_capabilities($addon_name)
855
+	{
856
+		if (! empty(self::$_settings[ $addon_name ]['capabilities'])) {
857
+			EE_Register_Capabilities::register(
858
+				$addon_name,
859
+				array(
860
+					'capabilities'    => self::$_settings[ $addon_name ]['capabilities'],
861
+					'capability_maps' => self::$_settings[ $addon_name ]['capability_maps'],
862
+				)
863
+			);
864
+		}
865
+	}
866 866
 
867 867
 
868
-    /**
869
-     * @param string $addon_name
870
-     * @return void
871
-     * @throws EE_Error
872
-     */
873
-    private static function _register_message_types($addon_name)
874
-    {
875
-        if (! empty(self::$_settings[ $addon_name ]['message_types'])) {
876
-            add_action(
877
-                'EE_Brewing_Regular___messages_caf',
878
-                array('EE_Register_Addon', 'register_message_types')
879
-            );
880
-        }
881
-    }
868
+	/**
869
+	 * @param string $addon_name
870
+	 * @return void
871
+	 * @throws EE_Error
872
+	 */
873
+	private static function _register_message_types($addon_name)
874
+	{
875
+		if (! empty(self::$_settings[ $addon_name ]['message_types'])) {
876
+			add_action(
877
+				'EE_Brewing_Regular___messages_caf',
878
+				array('EE_Register_Addon', 'register_message_types')
879
+			);
880
+		}
881
+	}
882 882
 
883 883
 
884
-    /**
885
-     * @param string $addon_name
886
-     * @return void
887
-     * @throws EE_Error
888
-     */
889
-    private static function _register_custom_post_types($addon_name)
890
-    {
891
-        if (
892
-            ! empty(self::$_settings[ $addon_name ]['custom_post_types'])
893
-            || ! empty(self::$_settings[ $addon_name ]['custom_taxonomies'])
894
-        ) {
895
-            EE_Register_CPT::register(
896
-                $addon_name,
897
-                array(
898
-                    'cpts'          => self::$_settings[ $addon_name ]['custom_post_types'],
899
-                    'cts'           => self::$_settings[ $addon_name ]['custom_taxonomies'],
900
-                    'default_terms' => self::$_settings[ $addon_name ]['default_terms'],
901
-                )
902
-            );
903
-        }
904
-    }
884
+	/**
885
+	 * @param string $addon_name
886
+	 * @return void
887
+	 * @throws EE_Error
888
+	 */
889
+	private static function _register_custom_post_types($addon_name)
890
+	{
891
+		if (
892
+			! empty(self::$_settings[ $addon_name ]['custom_post_types'])
893
+			|| ! empty(self::$_settings[ $addon_name ]['custom_taxonomies'])
894
+		) {
895
+			EE_Register_CPT::register(
896
+				$addon_name,
897
+				array(
898
+					'cpts'          => self::$_settings[ $addon_name ]['custom_post_types'],
899
+					'cts'           => self::$_settings[ $addon_name ]['custom_taxonomies'],
900
+					'default_terms' => self::$_settings[ $addon_name ]['default_terms'],
901
+				)
902
+			);
903
+		}
904
+	}
905 905
 
906 906
 
907
-    /**
908
-     * @param string $addon_name
909
-     * @return void
910
-     * @throws InvalidArgumentException
911
-     * @throws InvalidInterfaceException
912
-     * @throws InvalidDataTypeException
913
-     * @throws DomainException
914
-     * @throws EE_Error
915
-     */
916
-    private static function _register_payment_methods($addon_name)
917
-    {
918
-        if (! empty(self::$_settings[ $addon_name ]['payment_method_paths'])) {
919
-            EE_Register_Payment_Method::register(
920
-                $addon_name,
921
-                array('payment_method_paths' => self::$_settings[ $addon_name ]['payment_method_paths'])
922
-            );
923
-        }
924
-    }
907
+	/**
908
+	 * @param string $addon_name
909
+	 * @return void
910
+	 * @throws InvalidArgumentException
911
+	 * @throws InvalidInterfaceException
912
+	 * @throws InvalidDataTypeException
913
+	 * @throws DomainException
914
+	 * @throws EE_Error
915
+	 */
916
+	private static function _register_payment_methods($addon_name)
917
+	{
918
+		if (! empty(self::$_settings[ $addon_name ]['payment_method_paths'])) {
919
+			EE_Register_Payment_Method::register(
920
+				$addon_name,
921
+				array('payment_method_paths' => self::$_settings[ $addon_name ]['payment_method_paths'])
922
+			);
923
+		}
924
+	}
925 925
 
926 926
 
927
-    /**
928
-     * Loads and instantiates the EE_Addon class and adds it onto the registry
929
-     *
930
-     * @param string $addon_name
931
-     * @return EE_Addon
932
-     * @throws InvalidArgumentException
933
-     * @throws InvalidInterfaceException
934
-     * @throws InvalidDataTypeException
935
-     * @throws ReflectionException
936
-     * @throws EE_Error
937
-     */
938
-    private static function _load_and_init_addon_class($addon_name)
939
-    {
940
-        $addon = EE_Registry::instance()->load_addon(
941
-            dirname(self::$_settings[ $addon_name ]['main_file_path']),
942
-            self::$_settings[ $addon_name ]['class_name']
943
-        );
944
-        $addon->set_name($addon_name);
945
-        $addon->set_plugin_slug(self::$_settings[ $addon_name ]['plugin_slug']);
946
-        $addon->set_plugin_basename(self::$_settings[ $addon_name ]['plugin_basename']);
947
-        $addon->set_main_plugin_file(self::$_settings[ $addon_name ]['main_file_path']);
948
-        $addon->set_plugin_action_slug(self::$_settings[ $addon_name ]['plugin_action_slug']);
949
-        $addon->set_plugins_page_row(self::$_settings[ $addon_name ]['plugins_page_row']);
950
-        $addon->set_version(self::$_settings[ $addon_name ]['version']);
951
-        $addon->set_min_core_version(self::_effective_version(self::$_settings[ $addon_name ]['min_core_version']));
952
-        $addon->set_config_section(self::$_settings[ $addon_name ]['config_section']);
953
-        $addon->set_config_class(self::$_settings[ $addon_name ]['config_class']);
954
-        $addon->set_config_name(self::$_settings[ $addon_name ]['config_name']);
955
-        //unfortunately this can't be hooked in upon construction, because we don't have
956
-        //the plugin mainfile's path upon construction.
957
-        register_deactivation_hook($addon->get_main_plugin_file(), array($addon, 'deactivation'));
958
-        // call any additional admin_callback functions during load_admin_controller hook
959
-        if (! empty(self::$_settings[ $addon_name ]['admin_callback'])) {
960
-            add_action(
961
-                'AHEE__EE_System__load_controllers__load_admin_controllers',
962
-                array($addon, self::$_settings[ $addon_name ]['admin_callback'])
963
-            );
964
-        }
965
-        return $addon;
966
-    }
927
+	/**
928
+	 * Loads and instantiates the EE_Addon class and adds it onto the registry
929
+	 *
930
+	 * @param string $addon_name
931
+	 * @return EE_Addon
932
+	 * @throws InvalidArgumentException
933
+	 * @throws InvalidInterfaceException
934
+	 * @throws InvalidDataTypeException
935
+	 * @throws ReflectionException
936
+	 * @throws EE_Error
937
+	 */
938
+	private static function _load_and_init_addon_class($addon_name)
939
+	{
940
+		$addon = EE_Registry::instance()->load_addon(
941
+			dirname(self::$_settings[ $addon_name ]['main_file_path']),
942
+			self::$_settings[ $addon_name ]['class_name']
943
+		);
944
+		$addon->set_name($addon_name);
945
+		$addon->set_plugin_slug(self::$_settings[ $addon_name ]['plugin_slug']);
946
+		$addon->set_plugin_basename(self::$_settings[ $addon_name ]['plugin_basename']);
947
+		$addon->set_main_plugin_file(self::$_settings[ $addon_name ]['main_file_path']);
948
+		$addon->set_plugin_action_slug(self::$_settings[ $addon_name ]['plugin_action_slug']);
949
+		$addon->set_plugins_page_row(self::$_settings[ $addon_name ]['plugins_page_row']);
950
+		$addon->set_version(self::$_settings[ $addon_name ]['version']);
951
+		$addon->set_min_core_version(self::_effective_version(self::$_settings[ $addon_name ]['min_core_version']));
952
+		$addon->set_config_section(self::$_settings[ $addon_name ]['config_section']);
953
+		$addon->set_config_class(self::$_settings[ $addon_name ]['config_class']);
954
+		$addon->set_config_name(self::$_settings[ $addon_name ]['config_name']);
955
+		//unfortunately this can't be hooked in upon construction, because we don't have
956
+		//the plugin mainfile's path upon construction.
957
+		register_deactivation_hook($addon->get_main_plugin_file(), array($addon, 'deactivation'));
958
+		// call any additional admin_callback functions during load_admin_controller hook
959
+		if (! empty(self::$_settings[ $addon_name ]['admin_callback'])) {
960
+			add_action(
961
+				'AHEE__EE_System__load_controllers__load_admin_controllers',
962
+				array($addon, self::$_settings[ $addon_name ]['admin_callback'])
963
+			);
964
+		}
965
+		return $addon;
966
+	}
967 967
 
968 968
 
969
-    /**
970
-     *    load_pue_update - Update notifications
971
-     *
972
-     * @return void
973
-     * @throws InvalidArgumentException
974
-     * @throws InvalidDataTypeException
975
-     * @throws InvalidInterfaceException
976
-     */
977
-    public static function load_pue_update()
978
-    {
979
-        // load PUE client
980
-        require_once EE_THIRD_PARTY . 'pue' . DS . 'pue-client.php';
981
-        // cycle thru settings
982
-        foreach (self::$_settings as $settings) {
983
-            if (! empty($settings['pue_options'])) {
984
-                // initiate the class and start the plugin update engine!
985
-                new PluginUpdateEngineChecker(
986
-                // host file URL
987
-                    'https://eventespresso.com',
988
-                    // plugin slug(s)
989
-                    array(
990
-                        'premium'    => array('p' => $settings['pue_options']['pue_plugin_slug']),
991
-                        'prerelease' => array('beta' => $settings['pue_options']['pue_plugin_slug'] . '-pr'),
992
-                    ),
993
-                    // options
994
-                    array(
995
-                        'apikey'            => EE_Registry::instance()->NET_CFG->core->site_license_key,
996
-                        'lang_domain'       => 'event_espresso',
997
-                        'checkPeriod'       => $settings['pue_options']['checkPeriod'],
998
-                        'option_key'        => 'site_license_key',
999
-                        'options_page_slug' => 'event_espresso',
1000
-                        'plugin_basename'   => $settings['pue_options']['plugin_basename'],
1001
-                        // if use_wp_update is TRUE it means you want FREE versions of the plugin to be updated from WP
1002
-                        'use_wp_update'     => $settings['pue_options']['use_wp_update'],
1003
-                    )
1004
-                );
1005
-            }
1006
-        }
1007
-    }
969
+	/**
970
+	 *    load_pue_update - Update notifications
971
+	 *
972
+	 * @return void
973
+	 * @throws InvalidArgumentException
974
+	 * @throws InvalidDataTypeException
975
+	 * @throws InvalidInterfaceException
976
+	 */
977
+	public static function load_pue_update()
978
+	{
979
+		// load PUE client
980
+		require_once EE_THIRD_PARTY . 'pue' . DS . 'pue-client.php';
981
+		// cycle thru settings
982
+		foreach (self::$_settings as $settings) {
983
+			if (! empty($settings['pue_options'])) {
984
+				// initiate the class and start the plugin update engine!
985
+				new PluginUpdateEngineChecker(
986
+				// host file URL
987
+					'https://eventespresso.com',
988
+					// plugin slug(s)
989
+					array(
990
+						'premium'    => array('p' => $settings['pue_options']['pue_plugin_slug']),
991
+						'prerelease' => array('beta' => $settings['pue_options']['pue_plugin_slug'] . '-pr'),
992
+					),
993
+					// options
994
+					array(
995
+						'apikey'            => EE_Registry::instance()->NET_CFG->core->site_license_key,
996
+						'lang_domain'       => 'event_espresso',
997
+						'checkPeriod'       => $settings['pue_options']['checkPeriod'],
998
+						'option_key'        => 'site_license_key',
999
+						'options_page_slug' => 'event_espresso',
1000
+						'plugin_basename'   => $settings['pue_options']['plugin_basename'],
1001
+						// if use_wp_update is TRUE it means you want FREE versions of the plugin to be updated from WP
1002
+						'use_wp_update'     => $settings['pue_options']['use_wp_update'],
1003
+					)
1004
+				);
1005
+			}
1006
+		}
1007
+	}
1008 1008
 
1009 1009
 
1010
-    /**
1011
-     * Callback for EE_Brewing_Regular__messages_caf hook used to register message types.
1012
-     *
1013
-     * @since 4.4.0
1014
-     * @return void
1015
-     * @throws EE_Error
1016
-     */
1017
-    public static function register_message_types()
1018
-    {
1019
-        foreach (self::$_settings as $addon_name => $settings) {
1020
-            if (! empty($settings['message_types'])) {
1021
-                foreach ((array) $settings['message_types'] as $message_type => $message_type_settings) {
1022
-                    EE_Register_Message_Type::register($message_type, $message_type_settings);
1023
-                }
1024
-            }
1025
-        }
1026
-    }
1010
+	/**
1011
+	 * Callback for EE_Brewing_Regular__messages_caf hook used to register message types.
1012
+	 *
1013
+	 * @since 4.4.0
1014
+	 * @return void
1015
+	 * @throws EE_Error
1016
+	 */
1017
+	public static function register_message_types()
1018
+	{
1019
+		foreach (self::$_settings as $addon_name => $settings) {
1020
+			if (! empty($settings['message_types'])) {
1021
+				foreach ((array) $settings['message_types'] as $message_type => $message_type_settings) {
1022
+					EE_Register_Message_Type::register($message_type, $message_type_settings);
1023
+				}
1024
+			}
1025
+		}
1026
+	}
1027 1027
 
1028 1028
 
1029
-    /**
1030
-     * This deregisters an addon that was previously registered with a specific addon_name.
1031
-     *
1032
-     * @since    4.3.0
1033
-     * @param string $addon_name the name for the addon that was previously registered
1034
-     * @throws DomainException
1035
-     * @throws EE_Error
1036
-     * @throws InvalidArgumentException
1037
-     * @throws InvalidDataTypeException
1038
-     * @throws InvalidInterfaceException
1039
-     */
1040
-    public static function deregister($addon_name = null)
1041
-    {
1042
-        if (isset(self::$_settings[ $addon_name ]['class_name'])) {
1043
-            do_action('AHEE__EE_Register_Addon__deregister__before', $addon_name);
1044
-            $class_name = self::$_settings[ $addon_name ]['class_name'];
1045
-            if (! empty(self::$_settings[ $addon_name ]['dms_paths'])) {
1046
-                // setup DMS
1047
-                EE_Register_Data_Migration_Scripts::deregister($addon_name);
1048
-            }
1049
-            if (! empty(self::$_settings[ $addon_name ]['admin_path'])) {
1050
-                // register admin page
1051
-                EE_Register_Admin_Page::deregister($addon_name);
1052
-            }
1053
-            if (! empty(self::$_settings[ $addon_name ]['module_paths'])) {
1054
-                // add to list of modules to be registered
1055
-                EE_Register_Module::deregister($addon_name);
1056
-            }
1057
-            if (! empty(self::$_settings[ $addon_name ]['shortcode_paths'])
1058
-                || ! empty(self::$_settings[ $addon_name ]['shortcode_fqcns'])
1059
-            ) {
1060
-                // add to list of shortcodes to be registered
1061
-                EE_Register_Shortcode::deregister($addon_name);
1062
-            }
1063
-            if (! empty(self::$_settings[ $addon_name ]['config_class'])) {
1064
-                // if config_class present let's register config.
1065
-                EE_Register_Config::deregister(self::$_settings[ $addon_name ]['config_class']);
1066
-            }
1067
-            if (! empty(self::$_settings[ $addon_name ]['widget_paths'])) {
1068
-                // add to list of widgets to be registered
1069
-                EE_Register_Widget::deregister($addon_name);
1070
-            }
1071
-            if (! empty(self::$_settings[ $addon_name ]['model_paths'])
1072
-                || ! empty(self::$_settings[ $addon_name ]['class_paths'])
1073
-            ) {
1074
-                // add to list of shortcodes to be registered
1075
-                EE_Register_Model::deregister($addon_name);
1076
-            }
1077
-            if (! empty(self::$_settings[ $addon_name ]['model_extension_paths'])
1078
-                || ! empty(self::$_settings[ $addon_name ]['class_extension_paths'])
1079
-            ) {
1080
-                // add to list of shortcodes to be registered
1081
-                EE_Register_Model_Extensions::deregister($addon_name);
1082
-            }
1083
-            if (! empty(self::$_settings[ $addon_name ]['message_types'])) {
1084
-                foreach (
1085
-                    (array) self::$_settings[ $addon_name ]['message_types'] as $message_type =>
1086
-                    $message_type_settings
1087
-                ) {
1088
-                    EE_Register_Message_Type::deregister($message_type);
1089
-                }
1090
-            }
1091
-            //deregister capabilities for addon
1092
-            if (
1093
-                ! empty(self::$_settings[ $addon_name ]['capabilities'])
1094
-                || ! empty(self::$_settings[ $addon_name ]['capability_maps'])
1095
-            ) {
1096
-                EE_Register_Capabilities::deregister($addon_name);
1097
-            }
1098
-            //deregister custom_post_types for addon
1099
-            if (! empty(self::$_settings[ $addon_name ]['custom_post_types'])) {
1100
-                EE_Register_CPT::deregister($addon_name);
1101
-            }
1102
-            if (! empty(self::$_settings[ $addon_name ]['payment_method_paths'])) {
1103
-                EE_Register_Payment_Method::deregister($addon_name);
1104
-            }
1105
-            $addon = EE_Registry::instance()->getAddon($class_name);
1106
-            if ($addon instanceof EE_Addon) {
1107
-                remove_action(
1108
-                    'deactivate_' . $addon->get_main_plugin_file_basename(),
1109
-                    array($addon, 'deactivation')
1110
-                );
1111
-                remove_action(
1112
-                    'AHEE__EE_System__perform_activations_upgrades_and_migrations',
1113
-                    array($addon, 'initialize_db_if_no_migrations_required')
1114
-                );
1115
-                //remove `after_registration` call
1116
-                remove_action(
1117
-                    'AHEE__EE_System__load_espresso_addons__complete',
1118
-                    array($addon, 'after_registration'),
1119
-                    999
1120
-                );
1121
-            }
1122
-            EE_Registry::instance()->removeAddon($class_name);
1123
-            unset(self::$_settings[ $addon_name ]);
1124
-            do_action('AHEE__EE_Register_Addon__deregister__after', $addon_name);
1125
-        }
1126
-    }
1029
+	/**
1030
+	 * This deregisters an addon that was previously registered with a specific addon_name.
1031
+	 *
1032
+	 * @since    4.3.0
1033
+	 * @param string $addon_name the name for the addon that was previously registered
1034
+	 * @throws DomainException
1035
+	 * @throws EE_Error
1036
+	 * @throws InvalidArgumentException
1037
+	 * @throws InvalidDataTypeException
1038
+	 * @throws InvalidInterfaceException
1039
+	 */
1040
+	public static function deregister($addon_name = null)
1041
+	{
1042
+		if (isset(self::$_settings[ $addon_name ]['class_name'])) {
1043
+			do_action('AHEE__EE_Register_Addon__deregister__before', $addon_name);
1044
+			$class_name = self::$_settings[ $addon_name ]['class_name'];
1045
+			if (! empty(self::$_settings[ $addon_name ]['dms_paths'])) {
1046
+				// setup DMS
1047
+				EE_Register_Data_Migration_Scripts::deregister($addon_name);
1048
+			}
1049
+			if (! empty(self::$_settings[ $addon_name ]['admin_path'])) {
1050
+				// register admin page
1051
+				EE_Register_Admin_Page::deregister($addon_name);
1052
+			}
1053
+			if (! empty(self::$_settings[ $addon_name ]['module_paths'])) {
1054
+				// add to list of modules to be registered
1055
+				EE_Register_Module::deregister($addon_name);
1056
+			}
1057
+			if (! empty(self::$_settings[ $addon_name ]['shortcode_paths'])
1058
+				|| ! empty(self::$_settings[ $addon_name ]['shortcode_fqcns'])
1059
+			) {
1060
+				// add to list of shortcodes to be registered
1061
+				EE_Register_Shortcode::deregister($addon_name);
1062
+			}
1063
+			if (! empty(self::$_settings[ $addon_name ]['config_class'])) {
1064
+				// if config_class present let's register config.
1065
+				EE_Register_Config::deregister(self::$_settings[ $addon_name ]['config_class']);
1066
+			}
1067
+			if (! empty(self::$_settings[ $addon_name ]['widget_paths'])) {
1068
+				// add to list of widgets to be registered
1069
+				EE_Register_Widget::deregister($addon_name);
1070
+			}
1071
+			if (! empty(self::$_settings[ $addon_name ]['model_paths'])
1072
+				|| ! empty(self::$_settings[ $addon_name ]['class_paths'])
1073
+			) {
1074
+				// add to list of shortcodes to be registered
1075
+				EE_Register_Model::deregister($addon_name);
1076
+			}
1077
+			if (! empty(self::$_settings[ $addon_name ]['model_extension_paths'])
1078
+				|| ! empty(self::$_settings[ $addon_name ]['class_extension_paths'])
1079
+			) {
1080
+				// add to list of shortcodes to be registered
1081
+				EE_Register_Model_Extensions::deregister($addon_name);
1082
+			}
1083
+			if (! empty(self::$_settings[ $addon_name ]['message_types'])) {
1084
+				foreach (
1085
+					(array) self::$_settings[ $addon_name ]['message_types'] as $message_type =>
1086
+					$message_type_settings
1087
+				) {
1088
+					EE_Register_Message_Type::deregister($message_type);
1089
+				}
1090
+			}
1091
+			//deregister capabilities for addon
1092
+			if (
1093
+				! empty(self::$_settings[ $addon_name ]['capabilities'])
1094
+				|| ! empty(self::$_settings[ $addon_name ]['capability_maps'])
1095
+			) {
1096
+				EE_Register_Capabilities::deregister($addon_name);
1097
+			}
1098
+			//deregister custom_post_types for addon
1099
+			if (! empty(self::$_settings[ $addon_name ]['custom_post_types'])) {
1100
+				EE_Register_CPT::deregister($addon_name);
1101
+			}
1102
+			if (! empty(self::$_settings[ $addon_name ]['payment_method_paths'])) {
1103
+				EE_Register_Payment_Method::deregister($addon_name);
1104
+			}
1105
+			$addon = EE_Registry::instance()->getAddon($class_name);
1106
+			if ($addon instanceof EE_Addon) {
1107
+				remove_action(
1108
+					'deactivate_' . $addon->get_main_plugin_file_basename(),
1109
+					array($addon, 'deactivation')
1110
+				);
1111
+				remove_action(
1112
+					'AHEE__EE_System__perform_activations_upgrades_and_migrations',
1113
+					array($addon, 'initialize_db_if_no_migrations_required')
1114
+				);
1115
+				//remove `after_registration` call
1116
+				remove_action(
1117
+					'AHEE__EE_System__load_espresso_addons__complete',
1118
+					array($addon, 'after_registration'),
1119
+					999
1120
+				);
1121
+			}
1122
+			EE_Registry::instance()->removeAddon($class_name);
1123
+			unset(self::$_settings[ $addon_name ]);
1124
+			do_action('AHEE__EE_Register_Addon__deregister__after', $addon_name);
1125
+		}
1126
+	}
1127 1127
 
1128 1128
 
1129 1129
 }
Please login to merge, or discard this patch.
Spacing   +102 added lines, -102 removed lines patch added patch discarded remove patch
@@ -69,15 +69,15 @@  discard block
 block discarded – undo
69 69
         // offsets:    0 . 1 . 2 . 3 . 4
70 70
         $version_parts = explode('.', $min_core_version);
71 71
         //check they specified the micro version (after 2nd period)
72
-        if (! isset($version_parts[2])) {
72
+        if ( ! isset($version_parts[2])) {
73 73
             $version_parts[2] = '0';
74 74
         }
75 75
         //if they didn't specify the 'p', or 'rc' part. Just assume the lowest possible
76 76
         //soon we can assume that's 'rc', but this current version is 'alpha'
77
-        if (! isset($version_parts[3])) {
77
+        if ( ! isset($version_parts[3])) {
78 78
             $version_parts[3] = 'dev';
79 79
         }
80
-        if (! isset($version_parts[4])) {
80
+        if ( ! isset($version_parts[4])) {
81 81
             $version_parts[4] = '000';
82 82
         }
83 83
         return implode('.', $version_parts);
@@ -245,7 +245,7 @@  discard block
 block discarded – undo
245 245
         // setup PUE
246 246
         EE_Register_Addon::_parse_pue_options($addon_name, $class_name, $setup_args);
247 247
         // does this addon work with this version of core or WordPress ?
248
-        if (! EE_Register_Addon::_addon_is_compatible($addon_name, $addon_settings)) {
248
+        if ( ! EE_Register_Addon::_addon_is_compatible($addon_name, $addon_settings)) {
249 249
             return;
250 250
         }
251 251
         // register namespaces
@@ -303,7 +303,7 @@  discard block
 block discarded – undo
303 303
                 )
304 304
             );
305 305
         }
306
-        if (! isset($setup_args['main_file_path']) || empty($setup_args['main_file_path'])) {
306
+        if ( ! isset($setup_args['main_file_path']) || empty($setup_args['main_file_path'])) {
307 307
             throw new EE_Error(
308 308
                 sprintf(
309 309
                     __(
@@ -315,7 +315,7 @@  discard block
 block discarded – undo
315 315
             );
316 316
         }
317 317
         // check that addon has not already been registered with that name
318
-        if (isset(self::$_settings[ $addon_name ]) && ! did_action('activate_plugin')) {
318
+        if (isset(self::$_settings[$addon_name]) && ! did_action('activate_plugin')) {
319 319
             throw new EE_Error(
320 320
                 sprintf(
321 321
                     __(
@@ -347,7 +347,7 @@  discard block
 block discarded – undo
347 347
         // check if classname is fully  qualified or is a legacy classname already prefixed with 'EE_'
348 348
         return strpos($class_name, '\\') || strpos($class_name, 'EE_') === 0
349 349
             ? $class_name
350
-            : 'EE_' . $class_name;
350
+            : 'EE_'.$class_name;
351 351
     }
352 352
 
353 353
 
@@ -502,9 +502,9 @@  discard block
 block discarded – undo
502 502
         $incompatibility_message = '';
503 503
         //check whether this addon version is compatible with EE core
504 504
         if (
505
-            isset(EE_Register_Addon::$_incompatible_addons[ $addon_name ])
505
+            isset(EE_Register_Addon::$_incompatible_addons[$addon_name])
506 506
             && ! self::_meets_min_core_version_requirement(
507
-                EE_Register_Addon::$_incompatible_addons[ $addon_name ],
507
+                EE_Register_Addon::$_incompatible_addons[$addon_name],
508 508
                 $addon_settings['version']
509 509
             )
510 510
         ) {
@@ -514,7 +514,7 @@  discard block
 block discarded – undo
514 514
                 ),
515 515
                 $addon_name,
516 516
                 '<br />',
517
-                EE_Register_Addon::$_incompatible_addons[ $addon_name ],
517
+                EE_Register_Addon::$_incompatible_addons[$addon_name],
518 518
                 '<span style="font-weight: bold; color: #D54E21;">',
519 519
                 '</span><br />'
520 520
             );
@@ -546,7 +546,7 @@  discard block
 block discarded – undo
546 546
                 '</span><br />'
547 547
             );
548 548
         }
549
-        if (! empty($incompatibility_message)) {
549
+        if ( ! empty($incompatibility_message)) {
550 550
             // remove 'activate' from the REQUEST
551 551
             // so WP doesn't erroneously tell the user the plugin activated fine when it didn't
552 552
             unset($_GET['activate'], $_REQUEST['activate']);
@@ -574,11 +574,11 @@  discard block
 block discarded – undo
574 574
      */
575 575
     private static function _parse_pue_options($addon_name, $class_name, array $setup_args)
576 576
     {
577
-        if (! empty($setup_args['pue_options'])) {
578
-            self::$_settings[ $addon_name ]['pue_options'] = array(
577
+        if ( ! empty($setup_args['pue_options'])) {
578
+            self::$_settings[$addon_name]['pue_options'] = array(
579 579
                 'pue_plugin_slug' => isset($setup_args['pue_options']['pue_plugin_slug'])
580 580
                     ? (string) $setup_args['pue_options']['pue_plugin_slug']
581
-                    : 'espresso_' . strtolower($class_name),
581
+                    : 'espresso_'.strtolower($class_name),
582 582
                 'plugin_basename' => isset($setup_args['pue_options']['plugin_basename'])
583 583
                     ? (string) $setup_args['pue_options']['plugin_basename']
584 584
                     : plugin_basename($setup_args['main_file_path']),
@@ -638,12 +638,12 @@  discard block
 block discarded – undo
638 638
             //(as the newly-activated addon wasn't around the first time addons were registered).
639 639
             //Note: the presence of pue_options in the addon registration options will initialize the $_settings
640 640
             //property for the add-on, but the add-on is only partially initialized.  Hence, the additional check.
641
-            if (! isset(self::$_settings[ $addon_name ])
642
-                || (isset(self::$_settings[ $addon_name ])
643
-                    && ! isset(self::$_settings[ $addon_name ]['class_name'])
641
+            if ( ! isset(self::$_settings[$addon_name])
642
+                || (isset(self::$_settings[$addon_name])
643
+                    && ! isset(self::$_settings[$addon_name]['class_name'])
644 644
                 )
645 645
             ) {
646
-                self::$_settings[ $addon_name ] = $addon_settings;
646
+                self::$_settings[$addon_name] = $addon_settings;
647 647
                 $addon                          = self::_load_and_init_addon_class($addon_name);
648 648
                 $addon->set_activation_indicator_option();
649 649
                 // dont bother setting up the rest of the addon.
@@ -669,10 +669,10 @@  discard block
 block discarded – undo
669 669
             );
670 670
         }
671 671
         // make sure addon settings are set correctly without overwriting anything existing
672
-        if (isset(self::$_settings[ $addon_name ])) {
673
-            self::$_settings[ $addon_name ] += $addon_settings;
672
+        if (isset(self::$_settings[$addon_name])) {
673
+            self::$_settings[$addon_name] += $addon_settings;
674 674
         } else {
675
-            self::$_settings[ $addon_name ] = $addon_settings;
675
+            self::$_settings[$addon_name] = $addon_settings;
676 676
         }
677 677
         return false;
678 678
     }
@@ -685,13 +685,13 @@  discard block
 block discarded – undo
685 685
      */
686 686
     private static function _setup_autoloaders($addon_name)
687 687
     {
688
-        if (! empty(self::$_settings[ $addon_name ]['autoloader_paths'])) {
688
+        if ( ! empty(self::$_settings[$addon_name]['autoloader_paths'])) {
689 689
             // setup autoloader for single file
690
-            EEH_Autoloader::instance()->register_autoloader(self::$_settings[ $addon_name ]['autoloader_paths']);
690
+            EEH_Autoloader::instance()->register_autoloader(self::$_settings[$addon_name]['autoloader_paths']);
691 691
         }
692 692
         // setup autoloaders for folders
693
-        if (! empty(self::$_settings[ $addon_name ]['autoloader_folders'])) {
694
-            foreach ((array) self::$_settings[ $addon_name ]['autoloader_folders'] as $autoloader_folder) {
693
+        if ( ! empty(self::$_settings[$addon_name]['autoloader_folders'])) {
694
+            foreach ((array) self::$_settings[$addon_name]['autoloader_folders'] as $autoloader_folder) {
695 695
                 EEH_Autoloader::register_autoloaders_for_each_file_in_folder($autoloader_folder);
696 696
             }
697 697
         }
@@ -709,27 +709,27 @@  discard block
 block discarded – undo
709 709
     {
710 710
         // register new models
711 711
         if (
712
-            ! empty(self::$_settings[ $addon_name ]['model_paths'])
713
-            || ! empty(self::$_settings[ $addon_name ]['class_paths'])
712
+            ! empty(self::$_settings[$addon_name]['model_paths'])
713
+            || ! empty(self::$_settings[$addon_name]['class_paths'])
714 714
         ) {
715 715
             EE_Register_Model::register(
716 716
                 $addon_name,
717 717
                 array(
718
-                    'model_paths' => self::$_settings[ $addon_name ]['model_paths'],
719
-                    'class_paths' => self::$_settings[ $addon_name ]['class_paths'],
718
+                    'model_paths' => self::$_settings[$addon_name]['model_paths'],
719
+                    'class_paths' => self::$_settings[$addon_name]['class_paths'],
720 720
                 )
721 721
             );
722 722
         }
723 723
         // register model extensions
724 724
         if (
725
-            ! empty(self::$_settings[ $addon_name ]['model_extension_paths'])
726
-            || ! empty(self::$_settings[ $addon_name ]['class_extension_paths'])
725
+            ! empty(self::$_settings[$addon_name]['model_extension_paths'])
726
+            || ! empty(self::$_settings[$addon_name]['class_extension_paths'])
727 727
         ) {
728 728
             EE_Register_Model_Extensions::register(
729 729
                 $addon_name,
730 730
                 array(
731
-                    'model_extension_paths' => self::$_settings[ $addon_name ]['model_extension_paths'],
732
-                    'class_extension_paths' => self::$_settings[ $addon_name ]['class_extension_paths'],
731
+                    'model_extension_paths' => self::$_settings[$addon_name]['model_extension_paths'],
732
+                    'class_extension_paths' => self::$_settings[$addon_name]['class_extension_paths'],
733 733
                 )
734 734
             );
735 735
         }
@@ -744,10 +744,10 @@  discard block
 block discarded – undo
744 744
     private static function _register_data_migration_scripts($addon_name)
745 745
     {
746 746
         // setup DMS
747
-        if (! empty(self::$_settings[ $addon_name ]['dms_paths'])) {
747
+        if ( ! empty(self::$_settings[$addon_name]['dms_paths'])) {
748 748
             EE_Register_Data_Migration_Scripts::register(
749 749
                 $addon_name,
750
-                array('dms_paths' => self::$_settings[ $addon_name ]['dms_paths'])
750
+                array('dms_paths' => self::$_settings[$addon_name]['dms_paths'])
751 751
             );
752 752
         }
753 753
     }
@@ -761,12 +761,12 @@  discard block
 block discarded – undo
761 761
     private static function _register_config($addon_name)
762 762
     {
763 763
         // if config_class is present let's register config.
764
-        if (! empty(self::$_settings[ $addon_name ]['config_class'])) {
764
+        if ( ! empty(self::$_settings[$addon_name]['config_class'])) {
765 765
             EE_Register_Config::register(
766
-                self::$_settings[ $addon_name ]['config_class'],
766
+                self::$_settings[$addon_name]['config_class'],
767 767
                 array(
768
-                    'config_section' => self::$_settings[ $addon_name ]['config_section'],
769
-                    'config_name'    => self::$_settings[ $addon_name ]['config_name'],
768
+                    'config_section' => self::$_settings[$addon_name]['config_section'],
769
+                    'config_name'    => self::$_settings[$addon_name]['config_name'],
770 770
                 )
771 771
             );
772 772
         }
@@ -780,10 +780,10 @@  discard block
 block discarded – undo
780 780
      */
781 781
     private static function _register_admin_pages($addon_name)
782 782
     {
783
-        if (! empty(self::$_settings[ $addon_name ]['admin_path'])) {
783
+        if ( ! empty(self::$_settings[$addon_name]['admin_path'])) {
784 784
             EE_Register_Admin_Page::register(
785 785
                 $addon_name,
786
-                array('page_path' => self::$_settings[ $addon_name ]['admin_path'])
786
+                array('page_path' => self::$_settings[$addon_name]['admin_path'])
787 787
             );
788 788
         }
789 789
     }
@@ -796,10 +796,10 @@  discard block
 block discarded – undo
796 796
      */
797 797
     private static function _register_modules($addon_name)
798 798
     {
799
-        if (! empty(self::$_settings[ $addon_name ]['module_paths'])) {
799
+        if ( ! empty(self::$_settings[$addon_name]['module_paths'])) {
800 800
             EE_Register_Module::register(
801 801
                 $addon_name,
802
-                array('module_paths' => self::$_settings[ $addon_name ]['module_paths'])
802
+                array('module_paths' => self::$_settings[$addon_name]['module_paths'])
803 803
             );
804 804
         }
805 805
     }
@@ -812,17 +812,17 @@  discard block
 block discarded – undo
812 812
      */
813 813
     private static function _register_shortcodes($addon_name)
814 814
     {
815
-        if (! empty(self::$_settings[ $addon_name ]['shortcode_paths'])
816
-            || ! empty(self::$_settings[ $addon_name ]['shortcode_fqcns'])
815
+        if ( ! empty(self::$_settings[$addon_name]['shortcode_paths'])
816
+            || ! empty(self::$_settings[$addon_name]['shortcode_fqcns'])
817 817
         ) {
818 818
             EE_Register_Shortcode::register(
819 819
                 $addon_name,
820 820
                 array(
821
-                    'shortcode_paths' => isset(self::$_settings[ $addon_name ]['shortcode_paths'])
822
-                        ? self::$_settings[ $addon_name ]['shortcode_paths']
821
+                    'shortcode_paths' => isset(self::$_settings[$addon_name]['shortcode_paths'])
822
+                        ? self::$_settings[$addon_name]['shortcode_paths']
823 823
                         : array(),
824
-                    'shortcode_fqcns' => isset(self::$_settings[ $addon_name ]['shortcode_fqcns'])
825
-                        ? self::$_settings[ $addon_name ]['shortcode_fqcns']
824
+                    'shortcode_fqcns' => isset(self::$_settings[$addon_name]['shortcode_fqcns'])
825
+                        ? self::$_settings[$addon_name]['shortcode_fqcns']
826 826
                         : array(),
827 827
                 )
828 828
             );
@@ -837,10 +837,10 @@  discard block
 block discarded – undo
837 837
      */
838 838
     private static function _register_widgets($addon_name)
839 839
     {
840
-        if (! empty(self::$_settings[ $addon_name ]['widget_paths'])) {
840
+        if ( ! empty(self::$_settings[$addon_name]['widget_paths'])) {
841 841
             EE_Register_Widget::register(
842 842
                 $addon_name,
843
-                array('widget_paths' => self::$_settings[ $addon_name ]['widget_paths'])
843
+                array('widget_paths' => self::$_settings[$addon_name]['widget_paths'])
844 844
             );
845 845
         }
846 846
     }
@@ -853,12 +853,12 @@  discard block
 block discarded – undo
853 853
      */
854 854
     private static function _register_capabilities($addon_name)
855 855
     {
856
-        if (! empty(self::$_settings[ $addon_name ]['capabilities'])) {
856
+        if ( ! empty(self::$_settings[$addon_name]['capabilities'])) {
857 857
             EE_Register_Capabilities::register(
858 858
                 $addon_name,
859 859
                 array(
860
-                    'capabilities'    => self::$_settings[ $addon_name ]['capabilities'],
861
-                    'capability_maps' => self::$_settings[ $addon_name ]['capability_maps'],
860
+                    'capabilities'    => self::$_settings[$addon_name]['capabilities'],
861
+                    'capability_maps' => self::$_settings[$addon_name]['capability_maps'],
862 862
                 )
863 863
             );
864 864
         }
@@ -872,7 +872,7 @@  discard block
 block discarded – undo
872 872
      */
873 873
     private static function _register_message_types($addon_name)
874 874
     {
875
-        if (! empty(self::$_settings[ $addon_name ]['message_types'])) {
875
+        if ( ! empty(self::$_settings[$addon_name]['message_types'])) {
876 876
             add_action(
877 877
                 'EE_Brewing_Regular___messages_caf',
878 878
                 array('EE_Register_Addon', 'register_message_types')
@@ -889,15 +889,15 @@  discard block
 block discarded – undo
889 889
     private static function _register_custom_post_types($addon_name)
890 890
     {
891 891
         if (
892
-            ! empty(self::$_settings[ $addon_name ]['custom_post_types'])
893
-            || ! empty(self::$_settings[ $addon_name ]['custom_taxonomies'])
892
+            ! empty(self::$_settings[$addon_name]['custom_post_types'])
893
+            || ! empty(self::$_settings[$addon_name]['custom_taxonomies'])
894 894
         ) {
895 895
             EE_Register_CPT::register(
896 896
                 $addon_name,
897 897
                 array(
898
-                    'cpts'          => self::$_settings[ $addon_name ]['custom_post_types'],
899
-                    'cts'           => self::$_settings[ $addon_name ]['custom_taxonomies'],
900
-                    'default_terms' => self::$_settings[ $addon_name ]['default_terms'],
898
+                    'cpts'          => self::$_settings[$addon_name]['custom_post_types'],
899
+                    'cts'           => self::$_settings[$addon_name]['custom_taxonomies'],
900
+                    'default_terms' => self::$_settings[$addon_name]['default_terms'],
901 901
                 )
902 902
             );
903 903
         }
@@ -915,10 +915,10 @@  discard block
 block discarded – undo
915 915
      */
916 916
     private static function _register_payment_methods($addon_name)
917 917
     {
918
-        if (! empty(self::$_settings[ $addon_name ]['payment_method_paths'])) {
918
+        if ( ! empty(self::$_settings[$addon_name]['payment_method_paths'])) {
919 919
             EE_Register_Payment_Method::register(
920 920
                 $addon_name,
921
-                array('payment_method_paths' => self::$_settings[ $addon_name ]['payment_method_paths'])
921
+                array('payment_method_paths' => self::$_settings[$addon_name]['payment_method_paths'])
922 922
             );
923 923
         }
924 924
     }
@@ -938,28 +938,28 @@  discard block
 block discarded – undo
938 938
     private static function _load_and_init_addon_class($addon_name)
939 939
     {
940 940
         $addon = EE_Registry::instance()->load_addon(
941
-            dirname(self::$_settings[ $addon_name ]['main_file_path']),
942
-            self::$_settings[ $addon_name ]['class_name']
941
+            dirname(self::$_settings[$addon_name]['main_file_path']),
942
+            self::$_settings[$addon_name]['class_name']
943 943
         );
944 944
         $addon->set_name($addon_name);
945
-        $addon->set_plugin_slug(self::$_settings[ $addon_name ]['plugin_slug']);
946
-        $addon->set_plugin_basename(self::$_settings[ $addon_name ]['plugin_basename']);
947
-        $addon->set_main_plugin_file(self::$_settings[ $addon_name ]['main_file_path']);
948
-        $addon->set_plugin_action_slug(self::$_settings[ $addon_name ]['plugin_action_slug']);
949
-        $addon->set_plugins_page_row(self::$_settings[ $addon_name ]['plugins_page_row']);
950
-        $addon->set_version(self::$_settings[ $addon_name ]['version']);
951
-        $addon->set_min_core_version(self::_effective_version(self::$_settings[ $addon_name ]['min_core_version']));
952
-        $addon->set_config_section(self::$_settings[ $addon_name ]['config_section']);
953
-        $addon->set_config_class(self::$_settings[ $addon_name ]['config_class']);
954
-        $addon->set_config_name(self::$_settings[ $addon_name ]['config_name']);
945
+        $addon->set_plugin_slug(self::$_settings[$addon_name]['plugin_slug']);
946
+        $addon->set_plugin_basename(self::$_settings[$addon_name]['plugin_basename']);
947
+        $addon->set_main_plugin_file(self::$_settings[$addon_name]['main_file_path']);
948
+        $addon->set_plugin_action_slug(self::$_settings[$addon_name]['plugin_action_slug']);
949
+        $addon->set_plugins_page_row(self::$_settings[$addon_name]['plugins_page_row']);
950
+        $addon->set_version(self::$_settings[$addon_name]['version']);
951
+        $addon->set_min_core_version(self::_effective_version(self::$_settings[$addon_name]['min_core_version']));
952
+        $addon->set_config_section(self::$_settings[$addon_name]['config_section']);
953
+        $addon->set_config_class(self::$_settings[$addon_name]['config_class']);
954
+        $addon->set_config_name(self::$_settings[$addon_name]['config_name']);
955 955
         //unfortunately this can't be hooked in upon construction, because we don't have
956 956
         //the plugin mainfile's path upon construction.
957 957
         register_deactivation_hook($addon->get_main_plugin_file(), array($addon, 'deactivation'));
958 958
         // call any additional admin_callback functions during load_admin_controller hook
959
-        if (! empty(self::$_settings[ $addon_name ]['admin_callback'])) {
959
+        if ( ! empty(self::$_settings[$addon_name]['admin_callback'])) {
960 960
             add_action(
961 961
                 'AHEE__EE_System__load_controllers__load_admin_controllers',
962
-                array($addon, self::$_settings[ $addon_name ]['admin_callback'])
962
+                array($addon, self::$_settings[$addon_name]['admin_callback'])
963 963
             );
964 964
         }
965 965
         return $addon;
@@ -977,10 +977,10 @@  discard block
 block discarded – undo
977 977
     public static function load_pue_update()
978 978
     {
979 979
         // load PUE client
980
-        require_once EE_THIRD_PARTY . 'pue' . DS . 'pue-client.php';
980
+        require_once EE_THIRD_PARTY.'pue'.DS.'pue-client.php';
981 981
         // cycle thru settings
982 982
         foreach (self::$_settings as $settings) {
983
-            if (! empty($settings['pue_options'])) {
983
+            if ( ! empty($settings['pue_options'])) {
984 984
                 // initiate the class and start the plugin update engine!
985 985
                 new PluginUpdateEngineChecker(
986 986
                 // host file URL
@@ -988,7 +988,7 @@  discard block
 block discarded – undo
988 988
                     // plugin slug(s)
989 989
                     array(
990 990
                         'premium'    => array('p' => $settings['pue_options']['pue_plugin_slug']),
991
-                        'prerelease' => array('beta' => $settings['pue_options']['pue_plugin_slug'] . '-pr'),
991
+                        'prerelease' => array('beta' => $settings['pue_options']['pue_plugin_slug'].'-pr'),
992 992
                     ),
993 993
                     // options
994 994
                     array(
@@ -1017,7 +1017,7 @@  discard block
 block discarded – undo
1017 1017
     public static function register_message_types()
1018 1018
     {
1019 1019
         foreach (self::$_settings as $addon_name => $settings) {
1020
-            if (! empty($settings['message_types'])) {
1020
+            if ( ! empty($settings['message_types'])) {
1021 1021
                 foreach ((array) $settings['message_types'] as $message_type => $message_type_settings) {
1022 1022
                     EE_Register_Message_Type::register($message_type, $message_type_settings);
1023 1023
                 }
@@ -1039,50 +1039,50 @@  discard block
 block discarded – undo
1039 1039
      */
1040 1040
     public static function deregister($addon_name = null)
1041 1041
     {
1042
-        if (isset(self::$_settings[ $addon_name ]['class_name'])) {
1042
+        if (isset(self::$_settings[$addon_name]['class_name'])) {
1043 1043
             do_action('AHEE__EE_Register_Addon__deregister__before', $addon_name);
1044
-            $class_name = self::$_settings[ $addon_name ]['class_name'];
1045
-            if (! empty(self::$_settings[ $addon_name ]['dms_paths'])) {
1044
+            $class_name = self::$_settings[$addon_name]['class_name'];
1045
+            if ( ! empty(self::$_settings[$addon_name]['dms_paths'])) {
1046 1046
                 // setup DMS
1047 1047
                 EE_Register_Data_Migration_Scripts::deregister($addon_name);
1048 1048
             }
1049
-            if (! empty(self::$_settings[ $addon_name ]['admin_path'])) {
1049
+            if ( ! empty(self::$_settings[$addon_name]['admin_path'])) {
1050 1050
                 // register admin page
1051 1051
                 EE_Register_Admin_Page::deregister($addon_name);
1052 1052
             }
1053
-            if (! empty(self::$_settings[ $addon_name ]['module_paths'])) {
1053
+            if ( ! empty(self::$_settings[$addon_name]['module_paths'])) {
1054 1054
                 // add to list of modules to be registered
1055 1055
                 EE_Register_Module::deregister($addon_name);
1056 1056
             }
1057
-            if (! empty(self::$_settings[ $addon_name ]['shortcode_paths'])
1058
-                || ! empty(self::$_settings[ $addon_name ]['shortcode_fqcns'])
1057
+            if ( ! empty(self::$_settings[$addon_name]['shortcode_paths'])
1058
+                || ! empty(self::$_settings[$addon_name]['shortcode_fqcns'])
1059 1059
             ) {
1060 1060
                 // add to list of shortcodes to be registered
1061 1061
                 EE_Register_Shortcode::deregister($addon_name);
1062 1062
             }
1063
-            if (! empty(self::$_settings[ $addon_name ]['config_class'])) {
1063
+            if ( ! empty(self::$_settings[$addon_name]['config_class'])) {
1064 1064
                 // if config_class present let's register config.
1065
-                EE_Register_Config::deregister(self::$_settings[ $addon_name ]['config_class']);
1065
+                EE_Register_Config::deregister(self::$_settings[$addon_name]['config_class']);
1066 1066
             }
1067
-            if (! empty(self::$_settings[ $addon_name ]['widget_paths'])) {
1067
+            if ( ! empty(self::$_settings[$addon_name]['widget_paths'])) {
1068 1068
                 // add to list of widgets to be registered
1069 1069
                 EE_Register_Widget::deregister($addon_name);
1070 1070
             }
1071
-            if (! empty(self::$_settings[ $addon_name ]['model_paths'])
1072
-                || ! empty(self::$_settings[ $addon_name ]['class_paths'])
1071
+            if ( ! empty(self::$_settings[$addon_name]['model_paths'])
1072
+                || ! empty(self::$_settings[$addon_name]['class_paths'])
1073 1073
             ) {
1074 1074
                 // add to list of shortcodes to be registered
1075 1075
                 EE_Register_Model::deregister($addon_name);
1076 1076
             }
1077
-            if (! empty(self::$_settings[ $addon_name ]['model_extension_paths'])
1078
-                || ! empty(self::$_settings[ $addon_name ]['class_extension_paths'])
1077
+            if ( ! empty(self::$_settings[$addon_name]['model_extension_paths'])
1078
+                || ! empty(self::$_settings[$addon_name]['class_extension_paths'])
1079 1079
             ) {
1080 1080
                 // add to list of shortcodes to be registered
1081 1081
                 EE_Register_Model_Extensions::deregister($addon_name);
1082 1082
             }
1083
-            if (! empty(self::$_settings[ $addon_name ]['message_types'])) {
1083
+            if ( ! empty(self::$_settings[$addon_name]['message_types'])) {
1084 1084
                 foreach (
1085
-                    (array) self::$_settings[ $addon_name ]['message_types'] as $message_type =>
1085
+                    (array) self::$_settings[$addon_name]['message_types'] as $message_type =>
1086 1086
                     $message_type_settings
1087 1087
                 ) {
1088 1088
                     EE_Register_Message_Type::deregister($message_type);
@@ -1090,22 +1090,22 @@  discard block
 block discarded – undo
1090 1090
             }
1091 1091
             //deregister capabilities for addon
1092 1092
             if (
1093
-                ! empty(self::$_settings[ $addon_name ]['capabilities'])
1094
-                || ! empty(self::$_settings[ $addon_name ]['capability_maps'])
1093
+                ! empty(self::$_settings[$addon_name]['capabilities'])
1094
+                || ! empty(self::$_settings[$addon_name]['capability_maps'])
1095 1095
             ) {
1096 1096
                 EE_Register_Capabilities::deregister($addon_name);
1097 1097
             }
1098 1098
             //deregister custom_post_types for addon
1099
-            if (! empty(self::$_settings[ $addon_name ]['custom_post_types'])) {
1099
+            if ( ! empty(self::$_settings[$addon_name]['custom_post_types'])) {
1100 1100
                 EE_Register_CPT::deregister($addon_name);
1101 1101
             }
1102
-            if (! empty(self::$_settings[ $addon_name ]['payment_method_paths'])) {
1102
+            if ( ! empty(self::$_settings[$addon_name]['payment_method_paths'])) {
1103 1103
                 EE_Register_Payment_Method::deregister($addon_name);
1104 1104
             }
1105 1105
             $addon = EE_Registry::instance()->getAddon($class_name);
1106 1106
             if ($addon instanceof EE_Addon) {
1107 1107
                 remove_action(
1108
-                    'deactivate_' . $addon->get_main_plugin_file_basename(),
1108
+                    'deactivate_'.$addon->get_main_plugin_file_basename(),
1109 1109
                     array($addon, 'deactivation')
1110 1110
                 );
1111 1111
                 remove_action(
@@ -1120,7 +1120,7 @@  discard block
 block discarded – undo
1120 1120
                 );
1121 1121
             }
1122 1122
             EE_Registry::instance()->removeAddon($class_name);
1123
-            unset(self::$_settings[ $addon_name ]);
1123
+            unset(self::$_settings[$addon_name]);
1124 1124
             do_action('AHEE__EE_Register_Addon__deregister__after', $addon_name);
1125 1125
         }
1126 1126
     }
Please login to merge, or discard this patch.
core/EE_Registry.core.php 1 patch
Indentation   +1578 added lines, -1578 removed lines patch added patch discarded remove patch
@@ -22,1584 +22,1584 @@
 block discarded – undo
22 22
 class EE_Registry implements ResettableInterface
23 23
 {
24 24
 
25
-    /**
26
-     * @var EE_Registry $_instance
27
-     */
28
-    private static $_instance;
29
-
30
-    /**
31
-     * @var EE_Dependency_Map $_dependency_map
32
-     */
33
-    protected $_dependency_map;
34
-
35
-    /**
36
-     * @var array $_class_abbreviations
37
-     */
38
-    protected $_class_abbreviations = array();
39
-
40
-    /**
41
-     * @var CommandBusInterface $BUS
42
-     */
43
-    public $BUS;
44
-
45
-    /**
46
-     * @var EE_Cart $CART
47
-     */
48
-    public $CART;
49
-
50
-    /**
51
-     * @var EE_Config $CFG
52
-     */
53
-    public $CFG;
54
-
55
-    /**
56
-     * @var EE_Network_Config $NET_CFG
57
-     */
58
-    public $NET_CFG;
59
-
60
-    /**
61
-     * StdClass object for storing library classes in
62
-     *
63
-     * @var StdClass $LIB
64
-     */
65
-    public $LIB;
66
-
67
-    /**
68
-     * @var EE_Request_Handler $REQ
69
-     */
70
-    public $REQ;
71
-
72
-    /**
73
-     * @var EE_Session $SSN
74
-     */
75
-    public $SSN;
76
-
77
-    /**
78
-     * @since 4.5.0
79
-     * @var EE_Capabilities $CAP
80
-     */
81
-    public $CAP;
82
-
83
-    /**
84
-     * @since 4.9.0
85
-     * @var EE_Message_Resource_Manager $MRM
86
-     */
87
-    public $MRM;
88
-
89
-
90
-    /**
91
-     * @var Registry $AssetsRegistry
92
-     */
93
-    public $AssetsRegistry;
94
-
95
-    /**
96
-     * StdClass object for holding addons which have registered themselves to work with EE core
97
-     *
98
-     * @var EE_Addon[] $addons
99
-     */
100
-    public $addons;
101
-
102
-    /**
103
-     * keys are 'short names' (eg Event), values are class names (eg 'EEM_Event')
104
-     *
105
-     * @var EEM_Base[] $models
106
-     */
107
-    public $models = array();
108
-
109
-    /**
110
-     * @var EED_Module[] $modules
111
-     */
112
-    public $modules;
113
-
114
-    /**
115
-     * @var EES_Shortcode[] $shortcodes
116
-     */
117
-    public $shortcodes;
118
-
119
-    /**
120
-     * @var WP_Widget[] $widgets
121
-     */
122
-    public $widgets;
123
-
124
-    /**
125
-     * this is an array of all implemented model names (i.e. not the parent abstract models, or models
126
-     * which don't actually fetch items from the DB in the normal way (ie, are not children of EEM_Base)).
127
-     * Keys are model "short names" (eg "Event") as used in model relations, and values are
128
-     * classnames (eg "EEM_Event")
129
-     *
130
-     * @var array $non_abstract_db_models
131
-     */
132
-    public $non_abstract_db_models = array();
133
-
134
-
135
-    /**
136
-     * internationalization for JS strings
137
-     *    usage:   EE_Registry::i18n_js_strings['string_key'] = esc_html__( 'string to translate.', 'event_espresso' );
138
-     *    in js file:  var translatedString = eei18n.string_key;
139
-     *
140
-     * @var array $i18n_js_strings
141
-     */
142
-    public static $i18n_js_strings = array();
143
-
144
-
145
-    /**
146
-     * $main_file - path to espresso.php
147
-     *
148
-     * @var array $main_file
149
-     */
150
-    public $main_file;
151
-
152
-    /**
153
-     * array of ReflectionClass objects where the key is the class name
154
-     *
155
-     * @var ReflectionClass[] $_reflectors
156
-     */
157
-    public $_reflectors;
158
-
159
-    /**
160
-     * boolean flag to indicate whether or not to load/save dependencies from/to the cache
161
-     *
162
-     * @var boolean $_cache_on
163
-     */
164
-    protected $_cache_on = true;
165
-
166
-
167
-
168
-    /**
169
-     * @singleton method used to instantiate class object
170
-     * @param  EE_Dependency_Map $dependency_map
171
-     * @return EE_Registry instance
172
-     * @throws InvalidArgumentException
173
-     * @throws InvalidInterfaceException
174
-     * @throws InvalidDataTypeException
175
-     */
176
-    public static function instance(EE_Dependency_Map $dependency_map = null)
177
-    {
178
-        // check if class object is instantiated
179
-        if (! self::$_instance instanceof EE_Registry) {
180
-            self::$_instance = new self($dependency_map);
181
-        }
182
-        return self::$_instance;
183
-    }
184
-
185
-
186
-
187
-    /**
188
-     * protected constructor to prevent direct creation
189
-     *
190
-     * @Constructor
191
-     * @param  EE_Dependency_Map $dependency_map
192
-     * @throws InvalidDataTypeException
193
-     * @throws InvalidInterfaceException
194
-     * @throws InvalidArgumentException
195
-     */
196
-    protected function __construct(EE_Dependency_Map $dependency_map)
197
-    {
198
-        $this->_dependency_map = $dependency_map;
199
-        $this->LIB = new stdClass();
200
-        $this->addons = new stdClass();
201
-        $this->modules = new stdClass();
202
-        $this->shortcodes = new stdClass();
203
-        $this->widgets = new stdClass();
204
-        add_action('EE_Load_Espresso_Core__handle_request__initialize_core_loading', array($this, 'initialize'));
205
-    }
206
-
207
-
208
-
209
-    /**
210
-     * initialize
211
-     *
212
-     * @throws EE_Error
213
-     * @throws ReflectionException
214
-     */
215
-    public function initialize()
216
-    {
217
-        $this->_class_abbreviations = apply_filters(
218
-            'FHEE__EE_Registry____construct___class_abbreviations',
219
-            array(
220
-                'EE_Config'                                       => 'CFG',
221
-                'EE_Session'                                      => 'SSN',
222
-                'EE_Capabilities'                                 => 'CAP',
223
-                'EE_Cart'                                         => 'CART',
224
-                'EE_Network_Config'                               => 'NET_CFG',
225
-                'EE_Request_Handler'                              => 'REQ',
226
-                'EE_Message_Resource_Manager'                     => 'MRM',
227
-                'EventEspresso\core\services\commands\CommandBus' => 'BUS',
228
-                'EventEspresso\core\services\assets\Registry'     => 'AssetsRegistry',
229
-            )
230
-        );
231
-        $this->load_core('Base', array(), true);
232
-        // add our request and response objects to the cache
233
-        $request_loader = $this->_dependency_map->class_loader('EE_Request');
234
-        $this->_set_cached_class(
235
-            $request_loader(),
236
-            'EE_Request'
237
-        );
238
-        $response_loader = $this->_dependency_map->class_loader('EE_Response');
239
-        $this->_set_cached_class(
240
-            $response_loader(),
241
-            'EE_Response'
242
-        );
243
-        add_action('AHEE__EE_System__set_hooks_for_core', array($this, 'init'));
244
-    }
245
-
246
-
247
-
248
-    /**
249
-     * @return void
250
-     */
251
-    public function init()
252
-    {
253
-        // Get current page protocol
254
-        $protocol = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
255
-        // Output admin-ajax.php URL with same protocol as current page
256
-        self::$i18n_js_strings['ajax_url'] = admin_url('admin-ajax.php', $protocol);
257
-        self::$i18n_js_strings['wp_debug'] = defined('WP_DEBUG') ? WP_DEBUG : false;
258
-    }
259
-
260
-
261
-
262
-    /**
263
-     * localize_i18n_js_strings
264
-     *
265
-     * @return string
266
-     */
267
-    public static function localize_i18n_js_strings()
268
-    {
269
-        $i18n_js_strings = (array)self::$i18n_js_strings;
270
-        foreach ($i18n_js_strings as $key => $value) {
271
-            if (is_scalar($value)) {
272
-                $i18n_js_strings[$key] = html_entity_decode((string)$value, ENT_QUOTES, 'UTF-8');
273
-            }
274
-        }
275
-        return '/* <![CDATA[ */ var eei18n = ' . wp_json_encode($i18n_js_strings) . '; /* ]]> */';
276
-    }
277
-
278
-
279
-
280
-    /**
281
-     * @param mixed string | EED_Module $module
282
-     * @throws EE_Error
283
-     * @throws ReflectionException
284
-     */
285
-    public function add_module($module)
286
-    {
287
-        if ($module instanceof EED_Module) {
288
-            $module_class = get_class($module);
289
-            $this->modules->{$module_class} = $module;
290
-        } else {
291
-            if ( ! class_exists('EE_Module_Request_Router', false)) {
292
-                $this->load_core('Module_Request_Router');
293
-            }
294
-            EE_Module_Request_Router::module_factory($module);
295
-        }
296
-    }
297
-
298
-
299
-
300
-    /**
301
-     * @param string $module_name
302
-     * @return mixed EED_Module | NULL
303
-     */
304
-    public function get_module($module_name = '')
305
-    {
306
-        return isset($this->modules->{$module_name})
307
-            ? $this->modules->{$module_name}
308
-            : null;
309
-    }
310
-
311
-
312
-
313
-    /**
314
-     * loads core classes - must be singletons
315
-     *
316
-     * @param string $class_name - simple class name ie: session
317
-     * @param mixed  $arguments
318
-     * @param bool   $load_only
319
-     * @return mixed
320
-     * @throws EE_Error
321
-     * @throws ReflectionException
322
-     */
323
-    public function load_core($class_name, $arguments = array(), $load_only = false)
324
-    {
325
-        $core_paths = apply_filters(
326
-            'FHEE__EE_Registry__load_core__core_paths',
327
-            array(
328
-                EE_CORE,
329
-                EE_ADMIN,
330
-                EE_CPTS,
331
-                EE_CORE . 'data_migration_scripts' . DS,
332
-                EE_CORE . 'capabilities' . DS,
333
-                EE_CORE . 'request_stack' . DS,
334
-                EE_CORE . 'middleware' . DS,
335
-            )
336
-        );
337
-        // retrieve instantiated class
338
-        return $this->_load(
339
-            $core_paths,
340
-            'EE_',
341
-            $class_name,
342
-            'core',
343
-            $arguments,
344
-            false,
345
-            true,
346
-            $load_only
347
-        );
348
-    }
349
-
350
-
351
-
352
-    /**
353
-     * loads service classes
354
-     *
355
-     * @param string $class_name - simple class name ie: session
356
-     * @param mixed  $arguments
357
-     * @param bool   $load_only
358
-     * @return mixed
359
-     * @throws EE_Error
360
-     * @throws ReflectionException
361
-     */
362
-    public function load_service($class_name, $arguments = array(), $load_only = false)
363
-    {
364
-        $service_paths = apply_filters(
365
-            'FHEE__EE_Registry__load_service__service_paths',
366
-            array(
367
-                EE_CORE . 'services' . DS,
368
-            )
369
-        );
370
-        // retrieve instantiated class
371
-        return $this->_load(
372
-            $service_paths,
373
-            'EE_',
374
-            $class_name,
375
-            'class',
376
-            $arguments,
377
-            false,
378
-            true,
379
-            $load_only
380
-        );
381
-    }
382
-
383
-
384
-
385
-    /**
386
-     * loads data_migration_scripts
387
-     *
388
-     * @param string $class_name - class name for the DMS ie: EE_DMS_Core_4_2_0
389
-     * @param mixed  $arguments
390
-     * @return EE_Data_Migration_Script_Base|mixed
391
-     * @throws EE_Error
392
-     * @throws ReflectionException
393
-     */
394
-    public function load_dms($class_name, $arguments = array())
395
-    {
396
-        // retrieve instantiated class
397
-        return $this->_load(
398
-            EE_Data_Migration_Manager::instance()->get_data_migration_script_folders(),
399
-            'EE_DMS_',
400
-            $class_name,
401
-            'dms',
402
-            $arguments,
403
-            false,
404
-            false
405
-        );
406
-    }
407
-
408
-
409
-
410
-    /**
411
-     * loads object creating classes - must be singletons
412
-     *
413
-     * @param string $class_name - simple class name ie: attendee
414
-     * @param mixed  $arguments  - an array of arguments to pass to the class
415
-     * @param bool   $from_db    - some classes are instantiated from the db and thus call a different method to
416
-     *                           instantiate
417
-     * @param bool   $cache      if you don't want the class to be stored in the internal cache (non-persistent) then
418
-     *                           set this to FALSE (ie. when instantiating model objects from client in a loop)
419
-     * @param bool   $load_only  whether or not to just load the file and NOT instantiate, or load AND instantiate
420
-     *                           (default)
421
-     * @return EE_Base_Class | bool
422
-     * @throws EE_Error
423
-     * @throws ReflectionException
424
-     */
425
-    public function load_class($class_name, $arguments = array(), $from_db = false, $cache = true, $load_only = false)
426
-    {
427
-        $paths = apply_filters(
428
-            'FHEE__EE_Registry__load_class__paths', array(
429
-            EE_CORE,
430
-            EE_CLASSES,
431
-            EE_BUSINESS,
432
-        )
433
-        );
434
-        // retrieve instantiated class
435
-        return $this->_load(
436
-            $paths,
437
-            'EE_',
438
-            $class_name,
439
-            'class',
440
-            $arguments,
441
-            $from_db,
442
-            $cache,
443
-            $load_only
444
-        );
445
-    }
446
-
447
-
448
-
449
-    /**
450
-     * loads helper classes - must be singletons
451
-     *
452
-     * @param string $class_name - simple class name ie: price
453
-     * @param mixed  $arguments
454
-     * @param bool   $load_only
455
-     * @return EEH_Base | bool
456
-     * @throws EE_Error
457
-     * @throws ReflectionException
458
-     */
459
-    public function load_helper($class_name, $arguments = array(), $load_only = true)
460
-    {
461
-        // todo: add doing_it_wrong() in a few versions after all addons have had calls to this method removed
462
-        $helper_paths = apply_filters('FHEE__EE_Registry__load_helper__helper_paths', array(EE_HELPERS));
463
-        // retrieve instantiated class
464
-        return $this->_load(
465
-            $helper_paths,
466
-            'EEH_',
467
-            $class_name,
468
-            'helper',
469
-            $arguments,
470
-            false,
471
-            true,
472
-            $load_only
473
-        );
474
-    }
475
-
476
-
477
-
478
-    /**
479
-     * loads core classes - must be singletons
480
-     *
481
-     * @param string $class_name - simple class name ie: session
482
-     * @param mixed  $arguments
483
-     * @param bool   $load_only
484
-     * @param bool   $cache      whether to cache the object or not.
485
-     * @return mixed
486
-     * @throws EE_Error
487
-     * @throws ReflectionException
488
-     */
489
-    public function load_lib($class_name, $arguments = array(), $load_only = false, $cache = true)
490
-    {
491
-        $paths = array(
492
-            EE_LIBRARIES,
493
-            EE_LIBRARIES . 'messages' . DS,
494
-            EE_LIBRARIES . 'shortcodes' . DS,
495
-            EE_LIBRARIES . 'qtips' . DS,
496
-            EE_LIBRARIES . 'payment_methods' . DS,
497
-        );
498
-        // retrieve instantiated class
499
-        return $this->_load(
500
-            $paths,
501
-            'EE_',
502
-            $class_name,
503
-            'lib',
504
-            $arguments,
505
-            false,
506
-            $cache,
507
-            $load_only
508
-        );
509
-    }
510
-
511
-
512
-
513
-    /**
514
-     * loads model classes - must be singletons
515
-     *
516
-     * @param string $class_name - simple class name ie: price
517
-     * @param mixed  $arguments
518
-     * @param bool   $load_only
519
-     * @return EEM_Base | bool
520
-     * @throws EE_Error
521
-     * @throws ReflectionException
522
-     */
523
-    public function load_model($class_name, $arguments = array(), $load_only = false)
524
-    {
525
-        $paths = apply_filters(
526
-            'FHEE__EE_Registry__load_model__paths', array(
527
-            EE_MODELS,
528
-            EE_CORE,
529
-        )
530
-        );
531
-        // retrieve instantiated class
532
-        return $this->_load(
533
-            $paths,
534
-            'EEM_',
535
-            $class_name,
536
-            'model',
537
-            $arguments,
538
-            false,
539
-            true,
540
-            $load_only
541
-        );
542
-    }
543
-
544
-
545
-
546
-    /**
547
-     * loads model classes - must be singletons
548
-     *
549
-     * @param string $class_name - simple class name ie: price
550
-     * @param mixed  $arguments
551
-     * @param bool   $load_only
552
-     * @return mixed | bool
553
-     * @throws EE_Error
554
-     * @throws ReflectionException
555
-     */
556
-    public function load_model_class($class_name, $arguments = array(), $load_only = true)
557
-    {
558
-        $paths = array(
559
-            EE_MODELS . 'fields' . DS,
560
-            EE_MODELS . 'helpers' . DS,
561
-            EE_MODELS . 'relations' . DS,
562
-            EE_MODELS . 'strategies' . DS,
563
-        );
564
-        // retrieve instantiated class
565
-        return $this->_load(
566
-            $paths,
567
-            'EE_',
568
-            $class_name,
569
-            '',
570
-            $arguments,
571
-            false,
572
-            true,
573
-            $load_only
574
-        );
575
-    }
576
-
577
-
578
-
579
-    /**
580
-     * Determines if $model_name is the name of an actual EE model.
581
-     *
582
-     * @param string $model_name like Event, Attendee, Question_Group_Question, etc.
583
-     * @return boolean
584
-     */
585
-    public function is_model_name($model_name)
586
-    {
587
-        return isset($this->models[$model_name]);
588
-    }
589
-
590
-
591
-
592
-    /**
593
-     * generic class loader
594
-     *
595
-     * @param string $path_to_file - directory path to file location, not including filename
596
-     * @param string $file_name    - file name  ie:  my_file.php, including extension
597
-     * @param string $type         - file type - core? class? helper? model?
598
-     * @param mixed  $arguments
599
-     * @param bool   $load_only
600
-     * @return mixed
601
-     * @throws EE_Error
602
-     * @throws ReflectionException
603
-     */
604
-    public function load_file($path_to_file, $file_name, $type = '', $arguments = array(), $load_only = true)
605
-    {
606
-        // retrieve instantiated class
607
-        return $this->_load(
608
-            $path_to_file,
609
-            '',
610
-            $file_name,
611
-            $type,
612
-            $arguments,
613
-            false,
614
-            true,
615
-            $load_only
616
-        );
617
-    }
618
-
619
-
620
-
621
-    /**
622
-     * @param string $path_to_file - directory path to file location, not including filename
623
-     * @param string $class_name   - full class name  ie:  My_Class
624
-     * @param string $type         - file type - core? class? helper? model?
625
-     * @param mixed  $arguments
626
-     * @param bool   $load_only
627
-     * @return bool|EE_Addon|object
628
-     * @throws EE_Error
629
-     * @throws ReflectionException
630
-     */
631
-    public function load_addon($path_to_file, $class_name, $type = 'class', $arguments = array(), $load_only = false)
632
-    {
633
-        // retrieve instantiated class
634
-        return $this->_load(
635
-            $path_to_file,
636
-            'addon',
637
-            $class_name,
638
-            $type,
639
-            $arguments,
640
-            false,
641
-            true,
642
-            $load_only
643
-        );
644
-    }
645
-
646
-
647
-
648
-    /**
649
-     * instantiates, caches, and automatically resolves dependencies
650
-     * for classes that use a Fully Qualified Class Name.
651
-     * if the class is not capable of being loaded using PSR-4 autoloading,
652
-     * then you need to use one of the existing load_*() methods
653
-     * which can resolve the classname and filepath from the passed arguments
654
-     *
655
-     * @param bool|string $class_name   Fully Qualified Class Name
656
-     * @param array       $arguments    an argument, or array of arguments to pass to the class upon instantiation
657
-     * @param bool        $cache        whether to cache the instantiated object for reuse
658
-     * @param bool        $from_db      some classes are instantiated from the db
659
-     *                                  and thus call a different method to instantiate
660
-     * @param bool        $load_only    if true, will only load the file, but will NOT instantiate an object
661
-     * @param bool|string $addon        if true, will cache the object in the EE_Registry->$addons array
662
-     * @return bool|null|mixed          null = failure to load or instantiate class object.
663
-     *                                  object = class loaded and instantiated successfully.
664
-     *                                  bool = fail or success when $load_only is true
665
-     * @throws EE_Error
666
-     * @throws ReflectionException
667
-     */
668
-    public function create(
669
-        $class_name = false,
670
-        $arguments = array(),
671
-        $cache = false,
672
-        $from_db = false,
673
-        $load_only = false,
674
-        $addon = false
675
-    ) {
676
-        $class_name = ltrim($class_name, '\\');
677
-        $class_name = $this->_dependency_map->get_alias($class_name);
678
-        $class_exists = $this->loadOrVerifyClassExists($class_name, $arguments);
679
-        // if a non-FQCN was passed, then verifyClassExists() might return an object
680
-        // or it could return null if the class just could not be found anywhere
681
-        if ($class_exists instanceof $class_name || $class_exists === null){
682
-            // either way, return the results
683
-            return $class_exists;
684
-        }
685
-        $class_name = $class_exists;
686
-        // if we're only loading the class and it already exists, then let's just return true immediately
687
-        if ($load_only) {
688
-            return true;
689
-        }
690
-        $addon = $addon
691
-            ? 'addon'
692
-            : '';
693
-        // $this->_cache_on is toggled during the recursive loading that can occur with dependency injection
694
-        // $cache is controlled by individual calls to separate Registry loader methods like load_class()
695
-        // $load_only is also controlled by individual calls to separate Registry loader methods like load_file()
696
-        if ($this->_cache_on && $cache && ! $load_only) {
697
-            // return object if it's already cached
698
-            $cached_class = $this->_get_cached_class($class_name, $addon);
699
-            if ($cached_class !== null) {
700
-                return $cached_class;
701
-            }
702
-        }
703
-        // obtain the loader method from the dependency map
704
-        $loader = $this->_dependency_map->class_loader($class_name);
705
-        // instantiate the requested object
706
-        if ($loader instanceof Closure) {
707
-            $class_obj = $loader($arguments);
708
-        } else if ($loader && method_exists($this, $loader)) {
709
-            $class_obj = $this->{$loader}($class_name, $arguments);
710
-        } else {
711
-            $class_obj = $this->_create_object($class_name, $arguments, $addon, $from_db);
712
-        }
713
-        if (($this->_cache_on && $cache) || $this->get_class_abbreviation($class_name, '')) {
714
-            // save it for later... kinda like gum  { : $
715
-            $this->_set_cached_class($class_obj, $class_name, $addon, $from_db);
716
-        }
717
-        $this->_cache_on = true;
718
-        return $class_obj;
719
-    }
720
-
721
-
722
-
723
-    /**
724
-     * Recursively checks that a class exists and potentially attempts to load classes with non-FQCNs
725
-     *
726
-     * @param string $class_name
727
-     * @param array  $arguments
728
-     * @param int    $attempt
729
-     * @return mixed
730
-     */
731
-    private function loadOrVerifyClassExists($class_name, array $arguments, $attempt = 1) {
732
-        if (is_object($class_name) || class_exists($class_name)) {
733
-            return $class_name;
734
-        }
735
-        switch ($attempt) {
736
-            case 1:
737
-                // if it's a FQCN then maybe the class is registered with a preceding \
738
-                $class_name = strpos($class_name, '\\') !== false
739
-                    ? '\\' . ltrim($class_name, '\\')
740
-                    : $class_name;
741
-                break;
742
-            case 2:
743
-                //
744
-                $loader = $this->_dependency_map->class_loader($class_name);
745
-                if ($loader && method_exists($this, $loader)) {
746
-                    return $this->{$loader}($class_name, $arguments);
747
-                }
748
-                break;
749
-            case 3:
750
-            default;
751
-                return null;
752
-        }
753
-        $attempt++;
754
-        return $this->loadOrVerifyClassExists($class_name, $arguments, $attempt);
755
-    }
756
-
757
-
758
-
759
-    /**
760
-     * instantiates, caches, and injects dependencies for classes
761
-     *
762
-     * @param array       $file_paths   an array of paths to folders to look in
763
-     * @param string      $class_prefix EE  or EEM or... ???
764
-     * @param bool|string $class_name   $class name
765
-     * @param string      $type         file type - core? class? helper? model?
766
-     * @param mixed       $arguments    an argument or array of arguments to pass to the class upon instantiation
767
-     * @param bool        $from_db      some classes are instantiated from the db
768
-     *                                  and thus call a different method to instantiate
769
-     * @param bool        $cache        whether to cache the instantiated object for reuse
770
-     * @param bool        $load_only    if true, will only load the file, but will NOT instantiate an object
771
-     * @return bool|null|object null = failure to load or instantiate class object.
772
-     *                                  object = class loaded and instantiated successfully.
773
-     *                                  bool = fail or success when $load_only is true
774
-     * @throws EE_Error
775
-     * @throws ReflectionException
776
-     */
777
-    protected function _load(
778
-        $file_paths = array(),
779
-        $class_prefix = 'EE_',
780
-        $class_name = false,
781
-        $type = 'class',
782
-        $arguments = array(),
783
-        $from_db = false,
784
-        $cache = true,
785
-        $load_only = false
786
-    ) {
787
-        $class_name = ltrim($class_name, '\\');
788
-        // strip php file extension
789
-        $class_name = str_replace('.php', '', trim($class_name));
790
-        // does the class have a prefix ?
791
-        if (! empty($class_prefix) && $class_prefix !== 'addon') {
792
-            // make sure $class_prefix is uppercase
793
-            $class_prefix = strtoupper(trim($class_prefix));
794
-            // add class prefix ONCE!!!
795
-            $class_name = $class_prefix . str_replace($class_prefix, '', $class_name);
796
-        }
797
-        $class_name = $this->_dependency_map->get_alias($class_name);
798
-        $class_exists = class_exists($class_name, false);
799
-        // if we're only loading the class and it already exists, then let's just return true immediately
800
-        if ($load_only && $class_exists) {
801
-            return true;
802
-        }
803
-        // $this->_cache_on is toggled during the recursive loading that can occur with dependency injection
804
-        // $cache is controlled by individual calls to separate Registry loader methods like load_class()
805
-        // $load_only is also controlled by individual calls to separate Registry loader methods like load_file()
806
-        if ($this->_cache_on && $cache && ! $load_only) {
807
-            // return object if it's already cached
808
-            $cached_class = $this->_get_cached_class($class_name, $class_prefix);
809
-            if ($cached_class !== null) {
810
-                return $cached_class;
811
-            }
812
-        }
813
-        // if the class doesn't already exist.. then we need to try and find the file and load it
814
-        if (! $class_exists) {
815
-            // get full path to file
816
-            $path = $this->_resolve_path($class_name, $type, $file_paths);
817
-            // load the file
818
-            $loaded = $this->_require_file($path, $class_name, $type, $file_paths);
819
-            // if loading failed, or we are only loading a file but NOT instantiating an object
820
-            if (! $loaded || $load_only) {
821
-                // return boolean if only loading, or null if an object was expected
822
-                return $load_only
823
-                    ? $loaded
824
-                    : null;
825
-            }
826
-        }
827
-        // instantiate the requested object
828
-        $class_obj = $this->_create_object($class_name, $arguments, $type, $from_db);
829
-        if ($this->_cache_on && $cache) {
830
-            // save it for later... kinda like gum  { : $
831
-            $this->_set_cached_class($class_obj, $class_name, $class_prefix, $from_db);
832
-        }
833
-        $this->_cache_on = true;
834
-        return $class_obj;
835
-    }
836
-
837
-
838
-
839
-    /**
840
-     * @param string $class_name
841
-     * @param string $default have to specify something, but not anything that will conflict
842
-     * @return mixed|string
843
-     */
844
-    protected function get_class_abbreviation($class_name, $default = 'FANCY_BATMAN_PANTS')
845
-    {
846
-        return isset($this->_class_abbreviations[$class_name])
847
-            ? $this->_class_abbreviations[$class_name]
848
-            : $default;
849
-    }
850
-
851
-    /**
852
-     * attempts to find a cached version of the requested class
853
-     * by looking in the following places:
854
-     *        $this->{$class_abbreviation}            ie:    $this->CART
855
-     *        $this->{$class_name}                        ie:    $this->Some_Class
856
-     *        $this->LIB->{$class_name}                ie:    $this->LIB->Some_Class
857
-     *        $this->addon->{$class_name}    ie:    $this->addon->Some_Addon_Class
858
-     *
859
-     * @param string $class_name
860
-     * @param string $class_prefix
861
-     * @return mixed
862
-     */
863
-    protected function _get_cached_class($class_name, $class_prefix = '')
864
-    {
865
-        if ($class_name === 'EE_Registry') {
866
-            return $this;
867
-        }
868
-        $class_abbreviation = $this->get_class_abbreviation($class_name);
869
-        $class_name = str_replace('\\', '_', $class_name);
870
-        // check if class has already been loaded, and return it if it has been
871
-        if (isset($this->{$class_abbreviation})) {
872
-            return $this->{$class_abbreviation};
873
-        }
874
-        if (isset ($this->{$class_name})) {
875
-            return $this->{$class_name};
876
-        }
877
-        if (isset ($this->LIB->{$class_name})) {
878
-            return $this->LIB->{$class_name};
879
-        }
880
-        if ($class_prefix === 'addon' && isset ($this->addons->{$class_name})) {
881
-            return $this->addons->{$class_name};
882
-        }
883
-        return null;
884
-    }
885
-
886
-
887
-
888
-    /**
889
-     * removes a cached version of the requested class
890
-     *
891
-     * @param string  $class_name
892
-     * @param boolean $addon
893
-     * @return boolean
894
-     */
895
-    public function clear_cached_class($class_name, $addon = false)
896
-    {
897
-        $class_abbreviation = $this->get_class_abbreviation($class_name);
898
-        $class_name = str_replace('\\', '_', $class_name);
899
-        // check if class has already been loaded, and return it if it has been
900
-        if (isset($this->{$class_abbreviation})) {
901
-            $this->{$class_abbreviation} = null;
902
-            return true;
903
-        }
904
-        if (isset($this->{$class_name})) {
905
-            $this->{$class_name} = null;
906
-            return true;
907
-        }
908
-        if (isset($this->LIB->{$class_name})) {
909
-            unset($this->LIB->{$class_name});
910
-            return true;
911
-        }
912
-        if ($addon && isset($this->addons->{$class_name})) {
913
-            unset($this->addons->{$class_name});
914
-            return true;
915
-        }
916
-        return false;
917
-    }
918
-
919
-
920
-
921
-    /**
922
-     * attempts to find a full valid filepath for the requested class.
923
-     * loops thru each of the base paths in the $file_paths array and appends : "{classname} . {file type} . php"
924
-     * then returns that path if the target file has been found and is readable
925
-     *
926
-     * @param string $class_name
927
-     * @param string $type
928
-     * @param array  $file_paths
929
-     * @return string | bool
930
-     */
931
-    protected function _resolve_path($class_name, $type = '', $file_paths = array())
932
-    {
933
-        // make sure $file_paths is an array
934
-        $file_paths = is_array($file_paths)
935
-            ? $file_paths
936
-            : array($file_paths);
937
-        // cycle thru paths
938
-        foreach ($file_paths as $key => $file_path) {
939
-            // convert all separators to proper DS, if no filepath, then use EE_CLASSES
940
-            $file_path = $file_path
941
-                ? str_replace(array('/', '\\'), DS, $file_path)
942
-                : EE_CLASSES;
943
-            // prep file type
944
-            $type = ! empty($type)
945
-                ? trim($type, '.') . '.'
946
-                : '';
947
-            // build full file path
948
-            $file_paths[$key] = rtrim($file_path, DS) . DS . $class_name . '.' . $type . 'php';
949
-            //does the file exist and can be read ?
950
-            if (is_readable($file_paths[$key])) {
951
-                return $file_paths[$key];
952
-            }
953
-        }
954
-        return false;
955
-    }
956
-
957
-
958
-
959
-    /**
960
-     * basically just performs a require_once()
961
-     * but with some error handling
962
-     *
963
-     * @param  string $path
964
-     * @param  string $class_name
965
-     * @param  string $type
966
-     * @param  array  $file_paths
967
-     * @return bool
968
-     * @throws EE_Error
969
-     * @throws ReflectionException
970
-     */
971
-    protected function _require_file($path, $class_name, $type = '', $file_paths = array())
972
-    {
973
-        $this->resolve_legacy_class_parent($class_name);
974
-        // don't give up! you gotta...
975
-        try {
976
-            //does the file exist and can it be read ?
977
-            if (! $path) {
978
-                // just in case the file has already been autoloaded,
979
-                // but discrepancies in the naming schema are preventing it from
980
-                // being loaded via one of the EE_Registry::load_*() methods,
981
-                // then let's try one last hail mary before throwing an exception
982
-                // and call class_exists() again, but with autoloading turned ON
983
-                if(class_exists($class_name)) {
984
-                    return true;
985
-                }
986
-                // so sorry, can't find the file
987
-                throw new EE_Error (
988
-                    sprintf(
989
-                        esc_html__(
990
-                            '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',
991
-                            'event_espresso'
992
-                        ),
993
-                        trim($type, '.'),
994
-                        $class_name,
995
-                        '<br />' . implode(',<br />', $file_paths)
996
-                    )
997
-                );
998
-            }
999
-            // get the file
1000
-            require_once($path);
1001
-            // if the class isn't already declared somewhere
1002
-            if (class_exists($class_name, false) === false) {
1003
-                // so sorry, not a class
1004
-                throw new EE_Error(
1005
-                    sprintf(
1006
-                        esc_html__('The %s file %s does not appear to contain the %s Class.', 'event_espresso'),
1007
-                        $type,
1008
-                        $path,
1009
-                        $class_name
1010
-                    )
1011
-                );
1012
-            }
1013
-        } catch (EE_Error $e) {
1014
-            $e->get_error();
1015
-            return false;
1016
-        }
1017
-        return true;
1018
-    }
1019
-
1020
-
1021
-
1022
-    /**
1023
-     * Some of our legacy classes that extended a parent class would simply use a require() statement
1024
-     * before their class declaration in order to ensure that the parent class was loaded.
1025
-     * This is not ideal, but it's nearly impossible to determine the parent class of a non-namespaced class,
1026
-     * without triggering a fatal error because the parent class has yet to be loaded and therefore doesn't exist.
1027
-     *
1028
-     * @param string $class_name
1029
-     */
1030
-    protected function resolve_legacy_class_parent($class_name = '')
1031
-    {
1032
-        try {
1033
-            $legacy_parent_class_map = array(
1034
-                'EE_Payment_Processor' => 'core/business/EE_Processor_Base.class.php'
1035
-            );
1036
-            if(isset($legacy_parent_class_map[$class_name])) {
1037
-                require_once EE_PLUGIN_DIR_PATH . $legacy_parent_class_map[$class_name];
1038
-            }
1039
-        } catch (Exception $exception) {
1040
-        }
1041
-    }
1042
-
1043
-
1044
-
1045
-    /**
1046
-     * _create_object
1047
-     * Attempts to instantiate the requested class via any of the
1048
-     * commonly used instantiation methods employed throughout EE.
1049
-     * The priority for instantiation is as follows:
1050
-     *        - abstract classes or any class flagged as "load only" (no instantiation occurs)
1051
-     *        - model objects via their 'new_instance_from_db' method
1052
-     *        - model objects via their 'new_instance' method
1053
-     *        - "singleton" classes" via their 'instance' method
1054
-     *    - standard instantiable classes via their __constructor
1055
-     * Prior to instantiation, if the classname exists in the dependency_map,
1056
-     * then the constructor for the requested class will be examined to determine
1057
-     * if any dependencies exist, and if they can be injected.
1058
-     * If so, then those classes will be added to the array of arguments passed to the constructor
1059
-     *
1060
-     * @param string $class_name
1061
-     * @param array  $arguments
1062
-     * @param string $type
1063
-     * @param bool   $from_db
1064
-     * @return null|object
1065
-     * @throws EE_Error
1066
-     * @throws ReflectionException
1067
-     */
1068
-    protected function _create_object($class_name, $arguments = array(), $type = '', $from_db = false)
1069
-    {
1070
-        // create reflection
1071
-        $reflector = $this->get_ReflectionClass($class_name);
1072
-        // make sure arguments are an array
1073
-        $arguments = is_array($arguments)
1074
-            ? $arguments
1075
-            : array($arguments);
1076
-        // and if arguments array is numerically and sequentially indexed, then we want it to remain as is,
1077
-        // else wrap it in an additional array so that it doesn't get split into multiple parameters
1078
-        $arguments = $this->_array_is_numerically_and_sequentially_indexed($arguments)
1079
-            ? $arguments
1080
-            : array($arguments);
1081
-        // attempt to inject dependencies ?
1082
-        if ($this->_dependency_map->has($class_name)) {
1083
-            $arguments = $this->_resolve_dependencies($reflector, $class_name, $arguments);
1084
-        }
1085
-        // instantiate the class if possible
1086
-        if ($reflector->isAbstract()) {
1087
-            // nothing to instantiate, loading file was enough
1088
-            // does not throw an exception so $instantiation_mode is unused
1089
-            // $instantiation_mode = "1) no constructor abstract class";
1090
-            return true;
1091
-        }
1092
-        if (empty($arguments) && $reflector->getConstructor() === null && $reflector->isInstantiable()) {
1093
-            // no constructor = static methods only... nothing to instantiate, loading file was enough
1094
-            // $instantiation_mode = "2) no constructor but instantiable";
1095
-            return $reflector->newInstance();
1096
-        }
1097
-        if ($from_db && method_exists($class_name, 'new_instance_from_db')) {
1098
-            // $instantiation_mode = "3) new_instance_from_db()";
1099
-            return call_user_func_array(array($class_name, 'new_instance_from_db'), $arguments);
1100
-        }
1101
-        if (method_exists($class_name, 'new_instance')) {
1102
-            // $instantiation_mode = "4) new_instance()";
1103
-            return call_user_func_array(array($class_name, 'new_instance'), $arguments);
1104
-        }
1105
-        if (method_exists($class_name, 'instance')) {
1106
-            // $instantiation_mode = "5) instance()";
1107
-            return call_user_func_array(array($class_name, 'instance'), $arguments);
1108
-        }
1109
-        if ($reflector->isInstantiable()) {
1110
-            // $instantiation_mode = "6) constructor";
1111
-            return $reflector->newInstanceArgs($arguments);
1112
-        }
1113
-        // heh ? something's not right !
1114
-        throw new EE_Error(
1115
-            sprintf(
1116
-                __('The %s file %s could not be instantiated.', 'event_espresso'),
1117
-                $type,
1118
-                $class_name
1119
-            )
1120
-        );
1121
-    }
1122
-
1123
-
1124
-
1125
-    /**
1126
-     * @see http://stackoverflow.com/questions/173400/how-to-check-if-php-array-is-associative-or-sequential
1127
-     * @param array $array
1128
-     * @return bool
1129
-     */
1130
-    protected function _array_is_numerically_and_sequentially_indexed(array $array)
1131
-    {
1132
-        return ! empty($array)
1133
-            ? array_keys($array) === range(0, count($array) - 1)
1134
-            : true;
1135
-    }
1136
-
1137
-
1138
-
1139
-    /**
1140
-     * getReflectionClass
1141
-     * checks if a ReflectionClass object has already been generated for a class
1142
-     * and returns that instead of creating a new one
1143
-     *
1144
-     * @param string $class_name
1145
-     * @return ReflectionClass
1146
-     * @throws ReflectionException
1147
-     */
1148
-    public function get_ReflectionClass($class_name)
1149
-    {
1150
-        if (
1151
-            ! isset($this->_reflectors[$class_name])
1152
-            || ! $this->_reflectors[$class_name] instanceof ReflectionClass
1153
-        ) {
1154
-            $this->_reflectors[$class_name] = new ReflectionClass($class_name);
1155
-        }
1156
-        return $this->_reflectors[$class_name];
1157
-    }
1158
-
1159
-
1160
-
1161
-    /**
1162
-     * _resolve_dependencies
1163
-     * examines the constructor for the requested class to determine
1164
-     * if any dependencies exist, and if they can be injected.
1165
-     * If so, then those classes will be added to the array of arguments passed to the constructor
1166
-     * PLZ NOTE: this is achieved by type hinting the constructor params
1167
-     * For example:
1168
-     *        if attempting to load a class "Foo" with the following constructor:
1169
-     *        __construct( Bar $bar_class, Fighter $grohl_class )
1170
-     *        then $bar_class and $grohl_class will be added to the $arguments array,
1171
-     *        but only IF they are NOT already present in the incoming arguments array,
1172
-     *        and the correct classes can be loaded
1173
-     *
1174
-     * @param ReflectionClass $reflector
1175
-     * @param string          $class_name
1176
-     * @param array           $arguments
1177
-     * @return array
1178
-     * @throws EE_Error
1179
-     * @throws ReflectionException
1180
-     */
1181
-    protected function _resolve_dependencies(ReflectionClass $reflector, $class_name, $arguments = array())
1182
-    {
1183
-        // let's examine the constructor
1184
-        $constructor = $reflector->getConstructor();
1185
-        // whu? huh? nothing?
1186
-        if (! $constructor) {
1187
-            return $arguments;
1188
-        }
1189
-        // get constructor parameters
1190
-        $params = $constructor->getParameters();
1191
-        // and the keys for the incoming arguments array so that we can compare existing arguments with what is expected
1192
-        $argument_keys = array_keys($arguments);
1193
-        // now loop thru all of the constructors expected parameters
1194
-        foreach ($params as $index => $param) {
1195
-            // is this a dependency for a specific class ?
1196
-            $param_class = $param->getClass()
1197
-                ? $param->getClass()->name
1198
-                : null;
1199
-            // BUT WAIT !!! This class may be an alias for something else (or getting replaced at runtime)
1200
-            $param_class = $this->_dependency_map->has_alias($param_class, $class_name)
1201
-                ? $this->_dependency_map->get_alias($param_class, $class_name)
1202
-                : $param_class;
1203
-            if (
1204
-                // param is not even a class
1205
-                $param_class === null
1206
-                // and something already exists in the incoming arguments for this param
1207
-                && array_key_exists($index, $argument_keys)
1208
-                && array_key_exists($argument_keys[$index], $arguments)
1209
-            ) {
1210
-                // so let's skip this argument and move on to the next
1211
-                continue;
1212
-            }
1213
-            if (
1214
-                // parameter is type hinted as a class, exists as an incoming argument, AND it's the correct class
1215
-                $param_class !== null
1216
-                && isset($argument_keys[$index], $arguments[$argument_keys[$index]])
1217
-                && $arguments[$argument_keys[$index]] instanceof $param_class
1218
-            ) {
1219
-                // skip this argument and move on to the next
1220
-                continue;
1221
-            }
1222
-            if (
1223
-                // parameter is type hinted as a class, and should be injected
1224
-                $param_class !== null
1225
-                && $this->_dependency_map->has_dependency_for_class($class_name, $param_class)
1226
-            ) {
1227
-                $arguments = $this->_resolve_dependency(
1228
-                    $class_name,
1229
-                    $param_class,
1230
-                    $arguments,
1231
-                    $index,
1232
-                    $argument_keys
1233
-                );
1234
-            } else {
1235
-                try {
1236
-                    $arguments[$index] = $param->isDefaultValueAvailable()
1237
-                        ? $param->getDefaultValue()
1238
-                        : null;
1239
-                } catch (ReflectionException $e) {
1240
-                    throw new ReflectionException(
1241
-                        sprintf(
1242
-                            esc_html__('%1$s for parameter "$%2$s on classname "%3$s"', 'event_espresso'),
1243
-                            $e->getMessage(),
1244
-                            $param->getName(),
1245
-                            $class_name
1246
-                        )
1247
-                    );
1248
-                }
1249
-            }
1250
-        }
1251
-        return $arguments;
1252
-    }
1253
-
1254
-
1255
-
1256
-    /**
1257
-     * @param string $class_name
1258
-     * @param string $param_class
1259
-     * @param array  $arguments
1260
-     * @param mixed  $index
1261
-     * @param array  $argument_keys
1262
-     * @return array
1263
-     * @throws EE_Error
1264
-     * @throws ReflectionException
1265
-     * @throws InvalidArgumentException
1266
-     * @throws InvalidInterfaceException
1267
-     * @throws InvalidDataTypeException
1268
-     */
1269
-    protected function _resolve_dependency($class_name, $param_class, $arguments, $index, array $argument_keys)
1270
-    {
1271
-        $dependency = null;
1272
-        // should dependency be loaded from cache ?
1273
-        $cache_on = $this->_dependency_map->loading_strategy_for_class_dependency(
1274
-            $class_name,
1275
-            $param_class
1276
-        );
1277
-        $cache_on = $cache_on !== EE_Dependency_Map::load_new_object;
1278
-        // we might have a dependency...
1279
-        // let's MAYBE try and find it in our cache if that's what's been requested
1280
-        $cached_class = $cache_on
1281
-            ? $this->_get_cached_class($param_class)
1282
-            : null;
1283
-        // and grab it if it exists
1284
-        if ($cached_class instanceof $param_class) {
1285
-            $dependency = $cached_class;
1286
-        } else if ($param_class !== $class_name) {
1287
-            // obtain the loader method from the dependency map
1288
-            $loader = $this->_dependency_map->class_loader($param_class);
1289
-            // is loader a custom closure ?
1290
-            if ($loader instanceof Closure) {
1291
-                $dependency = $loader($arguments);
1292
-            } else {
1293
-                // set the cache on property for the recursive loading call
1294
-                $this->_cache_on = $cache_on;
1295
-                // if not, then let's try and load it via the registry
1296
-                if ($loader && method_exists($this, $loader)) {
1297
-                    $dependency = $this->{$loader}($param_class);
1298
-                } else {
1299
-                    $dependency = LoaderFactory::getLoader()->load(
1300
-                        $param_class,
1301
-                        array(),
1302
-                        $cache_on
1303
-                    );
1304
-                }
1305
-            }
1306
-        }
1307
-        // did we successfully find the correct dependency ?
1308
-        if ($dependency instanceof $param_class) {
1309
-            // then let's inject it into the incoming array of arguments at the correct location
1310
-            $arguments[$index] = $dependency;
1311
-        }
1312
-        return $arguments;
1313
-    }
1314
-
1315
-
1316
-
1317
-    /**
1318
-     * _set_cached_class
1319
-     * attempts to cache the instantiated class locally
1320
-     * in one of the following places, in the following order:
1321
-     *        $this->{class_abbreviation}   ie:    $this->CART
1322
-     *        $this->{$class_name}          ie:    $this->Some_Class
1323
-     *        $this->addon->{$$class_name}    ie:    $this->addon->Some_Addon_Class
1324
-     *        $this->LIB->{$class_name}     ie:    $this->LIB->Some_Class
1325
-     *
1326
-     * @param object $class_obj
1327
-     * @param string $class_name
1328
-     * @param string $class_prefix
1329
-     * @param bool   $from_db
1330
-     * @return void
1331
-     */
1332
-    protected function _set_cached_class($class_obj, $class_name, $class_prefix = '', $from_db = false)
1333
-    {
1334
-        if ($class_name === 'EE_Registry' || empty($class_obj)) {
1335
-            return;
1336
-        }
1337
-        // return newly instantiated class
1338
-        $class_abbreviation = $this->get_class_abbreviation($class_name, '');
1339
-        if ($class_abbreviation) {
1340
-            $this->{$class_abbreviation} = $class_obj;
1341
-            return;
1342
-        }
1343
-        $class_name = str_replace('\\', '_', $class_name);
1344
-        if (property_exists($this, $class_name)) {
1345
-            $this->{$class_name} = $class_obj;
1346
-            return;
1347
-        }
1348
-        if ($class_prefix === 'addon') {
1349
-            $this->addons->{$class_name} = $class_obj;
1350
-            return;
1351
-        }
1352
-        if (! $from_db) {
1353
-            $this->LIB->{$class_name} = $class_obj;
1354
-        }
1355
-    }
1356
-
1357
-
1358
-
1359
-    /**
1360
-     * call any loader that's been registered in the EE_Dependency_Map::$_class_loaders array
1361
-     *
1362
-     * @param string $classname PLEASE NOTE: the class name needs to match what's registered
1363
-     *                          in the EE_Dependency_Map::$_class_loaders array,
1364
-     *                          including the class prefix, ie: "EE_", "EEM_", "EEH_", etc
1365
-     * @param array  $arguments
1366
-     * @return object
1367
-     */
1368
-    public static function factory($classname, $arguments = array())
1369
-    {
1370
-        $loader = self::instance()->_dependency_map->class_loader($classname);
1371
-        if ($loader instanceof Closure) {
1372
-            return $loader($arguments);
1373
-        }
1374
-        if (method_exists(self::instance(), $loader)) {
1375
-            return self::instance()->{$loader}($classname, $arguments);
1376
-        }
1377
-        return null;
1378
-    }
1379
-
1380
-
1381
-
1382
-    /**
1383
-     * Gets the addon by its class name
1384
-     *
1385
-     * @param string $class_name
1386
-     * @return EE_Addon
1387
-     */
1388
-    public function getAddon($class_name)
1389
-    {
1390
-        $class_name = str_replace('\\', '_', $class_name);
1391
-        return $this->addons->{$class_name};
1392
-    }
1393
-
1394
-
1395
-    /**
1396
-     * removes the addon from the internal cache
1397
-     *
1398
-     * @param string $class_name
1399
-     * @return void
1400
-     */
1401
-    public function removeAddon($class_name)
1402
-    {
1403
-        $class_name = str_replace('\\', '_', $class_name);
1404
-        unset($this->addons->{$class_name});
1405
-    }
1406
-
1407
-
1408
-
1409
-    /**
1410
-     * Gets the addon by its name/slug (not classname. For that, just
1411
-     * use the get_addon() method above
1412
-     *
1413
-     * @param string $name
1414
-     * @return EE_Addon
1415
-     */
1416
-    public function get_addon_by_name($name)
1417
-    {
1418
-        foreach ($this->addons as $addon) {
1419
-            if ($addon->name() === $name) {
1420
-                return $addon;
1421
-            }
1422
-        }
1423
-        return null;
1424
-    }
1425
-
1426
-
1427
-
1428
-    /**
1429
-     * Gets an array of all the registered addons, where the keys are their names.
1430
-     * (ie, what each returns for their name() function)
1431
-     * They're already available on EE_Registry::instance()->addons as properties,
1432
-     * where each property's name is the addon's classname,
1433
-     * So if you just want to get the addon by classname,
1434
-     * OR use the get_addon() method above.
1435
-     * PLEASE  NOTE:
1436
-     * addons with Fully Qualified Class Names
1437
-     * have had the namespace separators converted to underscores,
1438
-     * so a classname like Fully\Qualified\ClassName
1439
-     * would have been converted to Fully_Qualified_ClassName
1440
-     *
1441
-     * @return EE_Addon[] where the KEYS are the addon's name()
1442
-     */
1443
-    public function get_addons_by_name()
1444
-    {
1445
-        $addons = array();
1446
-        foreach ($this->addons as $addon) {
1447
-            $addons[$addon->name()] = $addon;
1448
-        }
1449
-        return $addons;
1450
-    }
1451
-
1452
-
1453
-    /**
1454
-     * Resets the specified model's instance AND makes sure EE_Registry doesn't keep
1455
-     * a stale copy of it around
1456
-     *
1457
-     * @param string $model_name
1458
-     * @return \EEM_Base
1459
-     * @throws \EE_Error
1460
-     */
1461
-    public function reset_model($model_name)
1462
-    {
1463
-        $model_class_name = strpos($model_name, 'EEM_') !== 0
1464
-            ? "EEM_{$model_name}"
1465
-            : $model_name;
1466
-        if (! isset($this->LIB->{$model_class_name}) || ! $this->LIB->{$model_class_name} instanceof EEM_Base) {
1467
-            return null;
1468
-        }
1469
-        //get that model reset it and make sure we nuke the old reference to it
1470
-        if ($this->LIB->{$model_class_name} instanceof $model_class_name
1471
-            && is_callable(
1472
-                array($model_class_name, 'reset')
1473
-            )) {
1474
-            $this->LIB->{$model_class_name} = $this->LIB->{$model_class_name}->reset();
1475
-        } else {
1476
-            throw new EE_Error(sprintf(esc_html__('Model %s does not have a method "reset"', 'event_espresso'), $model_name));
1477
-        }
1478
-        return $this->LIB->{$model_class_name};
1479
-    }
1480
-
1481
-
1482
-
1483
-    /**
1484
-     * Resets the registry.
1485
-     * The criteria for what gets reset is based on what can be shared between sites on the same request when
1486
-     * switch_to_blog is used in a multisite install.  Here is a list of things that are NOT reset.
1487
-     * - $_dependency_map
1488
-     * - $_class_abbreviations
1489
-     * - $NET_CFG (EE_Network_Config): The config is shared network wide so no need to reset.
1490
-     * - $REQ:  Still on the same request so no need to change.
1491
-     * - $CAP: There is no site specific state in the EE_Capability class.
1492
-     * - $SSN: Although ideally, the session should not be shared between site switches, we can't reset it because only
1493
-     * one Session can be active in a single request.  Resetting could resolve in "headers already sent" errors.
1494
-     * - $addons:  In multisite, the state of the addons is something controlled via hooks etc in a normal request.  So
1495
-     *             for now, we won't reset the addons because it could break calls to an add-ons class/methods in the
1496
-     *             switch or on the restore.
1497
-     * - $modules
1498
-     * - $shortcodes
1499
-     * - $widgets
1500
-     *
1501
-     * @param boolean $hard             [deprecated]
1502
-     * @param boolean $reinstantiate    whether to create new instances of EE_Registry's singletons too,
1503
-     *                                  or just reset without re-instantiating (handy to set to FALSE if you're not
1504
-     *                                  sure if you CAN currently reinstantiate the singletons at the moment)
1505
-     * @param   bool  $reset_models     Defaults to true.  When false, then the models are not reset.  This is so
1506
-     *                                  client
1507
-     *                                  code instead can just change the model context to a different blog id if
1508
-     *                                  necessary
1509
-     * @return EE_Registry
1510
-     * @throws EE_Error
1511
-     * @throws ReflectionException
1512
-     */
1513
-    public static function reset($hard = false, $reinstantiate = true, $reset_models = true)
1514
-    {
1515
-        $instance = self::instance();
1516
-        $instance->_cache_on = true;
1517
-        // reset some "special" classes
1518
-        EEH_Activation::reset();
1519
-        $hard = apply_filters( 'FHEE__EE_Registry__reset__hard', $hard);
1520
-        $instance->CFG = EE_Config::reset($hard, $reinstantiate);
1521
-        $instance->CART = null;
1522
-        $instance->MRM = null;
1523
-        $instance->AssetsRegistry = $instance->create('EventEspresso\core\services\assets\Registry');
1524
-        //messages reset
1525
-        EED_Messages::reset();
1526
-        //handle of objects cached on LIB
1527
-        foreach (array('LIB', 'modules') as $cache) {
1528
-            foreach ($instance->{$cache} as $class_name => $class) {
1529
-                if (self::_reset_and_unset_object($class, $reset_models)) {
1530
-                    unset($instance->{$cache}->{$class_name});
1531
-                }
1532
-            }
1533
-        }
1534
-        return $instance;
1535
-    }
1536
-
1537
-
1538
-
1539
-    /**
1540
-     * if passed object implements ResettableInterface, then call it's reset() method
1541
-     * if passed object implements InterminableInterface, then return false,
1542
-     * to indicate that it should NOT be cleared from the Registry cache
1543
-     *
1544
-     * @param      $object
1545
-     * @param bool $reset_models
1546
-     * @return bool returns true if cached object should be unset
1547
-     */
1548
-    private static function _reset_and_unset_object($object, $reset_models)
1549
-    {
1550
-        if (! is_object($object)) {
1551
-            // don't unset anything that's not an object
1552
-            return false;
1553
-        }
1554
-        if ($object instanceof EED_Module) {
1555
-            $object::reset();
1556
-            // don't unset modules
1557
-            return false;
1558
-        }
1559
-        if ($object instanceof ResettableInterface) {
1560
-            if ($object instanceof EEM_Base) {
1561
-                if ($reset_models) {
1562
-                    $object->reset();
1563
-                    return true;
1564
-                }
1565
-                return false;
1566
-            }
1567
-            $object->reset();
1568
-            return true;
1569
-        }
1570
-        if (! $object instanceof InterminableInterface) {
1571
-            return true;
1572
-        }
1573
-        return false;
1574
-    }
1575
-
1576
-
1577
-
1578
-    /**
1579
-     * Gets all the custom post type models defined
1580
-     *
1581
-     * @return array keys are model "short names" (Eg "Event") and keys are classnames (eg "EEM_Event")
1582
-     */
1583
-    public function cpt_models()
1584
-    {
1585
-        $cpt_models = array();
1586
-        foreach ($this->non_abstract_db_models as $short_name => $classname) {
1587
-            if (is_subclass_of($classname, 'EEM_CPT_Base')) {
1588
-                $cpt_models[$short_name] = $classname;
1589
-            }
1590
-        }
1591
-        return $cpt_models;
1592
-    }
1593
-
1594
-
1595
-
1596
-    /**
1597
-     * @return \EE_Config
1598
-     */
1599
-    public static function CFG()
1600
-    {
1601
-        return self::instance()->CFG;
1602
-    }
25
+	/**
26
+	 * @var EE_Registry $_instance
27
+	 */
28
+	private static $_instance;
29
+
30
+	/**
31
+	 * @var EE_Dependency_Map $_dependency_map
32
+	 */
33
+	protected $_dependency_map;
34
+
35
+	/**
36
+	 * @var array $_class_abbreviations
37
+	 */
38
+	protected $_class_abbreviations = array();
39
+
40
+	/**
41
+	 * @var CommandBusInterface $BUS
42
+	 */
43
+	public $BUS;
44
+
45
+	/**
46
+	 * @var EE_Cart $CART
47
+	 */
48
+	public $CART;
49
+
50
+	/**
51
+	 * @var EE_Config $CFG
52
+	 */
53
+	public $CFG;
54
+
55
+	/**
56
+	 * @var EE_Network_Config $NET_CFG
57
+	 */
58
+	public $NET_CFG;
59
+
60
+	/**
61
+	 * StdClass object for storing library classes in
62
+	 *
63
+	 * @var StdClass $LIB
64
+	 */
65
+	public $LIB;
66
+
67
+	/**
68
+	 * @var EE_Request_Handler $REQ
69
+	 */
70
+	public $REQ;
71
+
72
+	/**
73
+	 * @var EE_Session $SSN
74
+	 */
75
+	public $SSN;
76
+
77
+	/**
78
+	 * @since 4.5.0
79
+	 * @var EE_Capabilities $CAP
80
+	 */
81
+	public $CAP;
82
+
83
+	/**
84
+	 * @since 4.9.0
85
+	 * @var EE_Message_Resource_Manager $MRM
86
+	 */
87
+	public $MRM;
88
+
89
+
90
+	/**
91
+	 * @var Registry $AssetsRegistry
92
+	 */
93
+	public $AssetsRegistry;
94
+
95
+	/**
96
+	 * StdClass object for holding addons which have registered themselves to work with EE core
97
+	 *
98
+	 * @var EE_Addon[] $addons
99
+	 */
100
+	public $addons;
101
+
102
+	/**
103
+	 * keys are 'short names' (eg Event), values are class names (eg 'EEM_Event')
104
+	 *
105
+	 * @var EEM_Base[] $models
106
+	 */
107
+	public $models = array();
108
+
109
+	/**
110
+	 * @var EED_Module[] $modules
111
+	 */
112
+	public $modules;
113
+
114
+	/**
115
+	 * @var EES_Shortcode[] $shortcodes
116
+	 */
117
+	public $shortcodes;
118
+
119
+	/**
120
+	 * @var WP_Widget[] $widgets
121
+	 */
122
+	public $widgets;
123
+
124
+	/**
125
+	 * this is an array of all implemented model names (i.e. not the parent abstract models, or models
126
+	 * which don't actually fetch items from the DB in the normal way (ie, are not children of EEM_Base)).
127
+	 * Keys are model "short names" (eg "Event") as used in model relations, and values are
128
+	 * classnames (eg "EEM_Event")
129
+	 *
130
+	 * @var array $non_abstract_db_models
131
+	 */
132
+	public $non_abstract_db_models = array();
133
+
134
+
135
+	/**
136
+	 * internationalization for JS strings
137
+	 *    usage:   EE_Registry::i18n_js_strings['string_key'] = esc_html__( 'string to translate.', 'event_espresso' );
138
+	 *    in js file:  var translatedString = eei18n.string_key;
139
+	 *
140
+	 * @var array $i18n_js_strings
141
+	 */
142
+	public static $i18n_js_strings = array();
143
+
144
+
145
+	/**
146
+	 * $main_file - path to espresso.php
147
+	 *
148
+	 * @var array $main_file
149
+	 */
150
+	public $main_file;
151
+
152
+	/**
153
+	 * array of ReflectionClass objects where the key is the class name
154
+	 *
155
+	 * @var ReflectionClass[] $_reflectors
156
+	 */
157
+	public $_reflectors;
158
+
159
+	/**
160
+	 * boolean flag to indicate whether or not to load/save dependencies from/to the cache
161
+	 *
162
+	 * @var boolean $_cache_on
163
+	 */
164
+	protected $_cache_on = true;
165
+
166
+
167
+
168
+	/**
169
+	 * @singleton method used to instantiate class object
170
+	 * @param  EE_Dependency_Map $dependency_map
171
+	 * @return EE_Registry instance
172
+	 * @throws InvalidArgumentException
173
+	 * @throws InvalidInterfaceException
174
+	 * @throws InvalidDataTypeException
175
+	 */
176
+	public static function instance(EE_Dependency_Map $dependency_map = null)
177
+	{
178
+		// check if class object is instantiated
179
+		if (! self::$_instance instanceof EE_Registry) {
180
+			self::$_instance = new self($dependency_map);
181
+		}
182
+		return self::$_instance;
183
+	}
184
+
185
+
186
+
187
+	/**
188
+	 * protected constructor to prevent direct creation
189
+	 *
190
+	 * @Constructor
191
+	 * @param  EE_Dependency_Map $dependency_map
192
+	 * @throws InvalidDataTypeException
193
+	 * @throws InvalidInterfaceException
194
+	 * @throws InvalidArgumentException
195
+	 */
196
+	protected function __construct(EE_Dependency_Map $dependency_map)
197
+	{
198
+		$this->_dependency_map = $dependency_map;
199
+		$this->LIB = new stdClass();
200
+		$this->addons = new stdClass();
201
+		$this->modules = new stdClass();
202
+		$this->shortcodes = new stdClass();
203
+		$this->widgets = new stdClass();
204
+		add_action('EE_Load_Espresso_Core__handle_request__initialize_core_loading', array($this, 'initialize'));
205
+	}
206
+
207
+
208
+
209
+	/**
210
+	 * initialize
211
+	 *
212
+	 * @throws EE_Error
213
+	 * @throws ReflectionException
214
+	 */
215
+	public function initialize()
216
+	{
217
+		$this->_class_abbreviations = apply_filters(
218
+			'FHEE__EE_Registry____construct___class_abbreviations',
219
+			array(
220
+				'EE_Config'                                       => 'CFG',
221
+				'EE_Session'                                      => 'SSN',
222
+				'EE_Capabilities'                                 => 'CAP',
223
+				'EE_Cart'                                         => 'CART',
224
+				'EE_Network_Config'                               => 'NET_CFG',
225
+				'EE_Request_Handler'                              => 'REQ',
226
+				'EE_Message_Resource_Manager'                     => 'MRM',
227
+				'EventEspresso\core\services\commands\CommandBus' => 'BUS',
228
+				'EventEspresso\core\services\assets\Registry'     => 'AssetsRegistry',
229
+			)
230
+		);
231
+		$this->load_core('Base', array(), true);
232
+		// add our request and response objects to the cache
233
+		$request_loader = $this->_dependency_map->class_loader('EE_Request');
234
+		$this->_set_cached_class(
235
+			$request_loader(),
236
+			'EE_Request'
237
+		);
238
+		$response_loader = $this->_dependency_map->class_loader('EE_Response');
239
+		$this->_set_cached_class(
240
+			$response_loader(),
241
+			'EE_Response'
242
+		);
243
+		add_action('AHEE__EE_System__set_hooks_for_core', array($this, 'init'));
244
+	}
245
+
246
+
247
+
248
+	/**
249
+	 * @return void
250
+	 */
251
+	public function init()
252
+	{
253
+		// Get current page protocol
254
+		$protocol = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
255
+		// Output admin-ajax.php URL with same protocol as current page
256
+		self::$i18n_js_strings['ajax_url'] = admin_url('admin-ajax.php', $protocol);
257
+		self::$i18n_js_strings['wp_debug'] = defined('WP_DEBUG') ? WP_DEBUG : false;
258
+	}
259
+
260
+
261
+
262
+	/**
263
+	 * localize_i18n_js_strings
264
+	 *
265
+	 * @return string
266
+	 */
267
+	public static function localize_i18n_js_strings()
268
+	{
269
+		$i18n_js_strings = (array)self::$i18n_js_strings;
270
+		foreach ($i18n_js_strings as $key => $value) {
271
+			if (is_scalar($value)) {
272
+				$i18n_js_strings[$key] = html_entity_decode((string)$value, ENT_QUOTES, 'UTF-8');
273
+			}
274
+		}
275
+		return '/* <![CDATA[ */ var eei18n = ' . wp_json_encode($i18n_js_strings) . '; /* ]]> */';
276
+	}
277
+
278
+
279
+
280
+	/**
281
+	 * @param mixed string | EED_Module $module
282
+	 * @throws EE_Error
283
+	 * @throws ReflectionException
284
+	 */
285
+	public function add_module($module)
286
+	{
287
+		if ($module instanceof EED_Module) {
288
+			$module_class = get_class($module);
289
+			$this->modules->{$module_class} = $module;
290
+		} else {
291
+			if ( ! class_exists('EE_Module_Request_Router', false)) {
292
+				$this->load_core('Module_Request_Router');
293
+			}
294
+			EE_Module_Request_Router::module_factory($module);
295
+		}
296
+	}
297
+
298
+
299
+
300
+	/**
301
+	 * @param string $module_name
302
+	 * @return mixed EED_Module | NULL
303
+	 */
304
+	public function get_module($module_name = '')
305
+	{
306
+		return isset($this->modules->{$module_name})
307
+			? $this->modules->{$module_name}
308
+			: null;
309
+	}
310
+
311
+
312
+
313
+	/**
314
+	 * loads core classes - must be singletons
315
+	 *
316
+	 * @param string $class_name - simple class name ie: session
317
+	 * @param mixed  $arguments
318
+	 * @param bool   $load_only
319
+	 * @return mixed
320
+	 * @throws EE_Error
321
+	 * @throws ReflectionException
322
+	 */
323
+	public function load_core($class_name, $arguments = array(), $load_only = false)
324
+	{
325
+		$core_paths = apply_filters(
326
+			'FHEE__EE_Registry__load_core__core_paths',
327
+			array(
328
+				EE_CORE,
329
+				EE_ADMIN,
330
+				EE_CPTS,
331
+				EE_CORE . 'data_migration_scripts' . DS,
332
+				EE_CORE . 'capabilities' . DS,
333
+				EE_CORE . 'request_stack' . DS,
334
+				EE_CORE . 'middleware' . DS,
335
+			)
336
+		);
337
+		// retrieve instantiated class
338
+		return $this->_load(
339
+			$core_paths,
340
+			'EE_',
341
+			$class_name,
342
+			'core',
343
+			$arguments,
344
+			false,
345
+			true,
346
+			$load_only
347
+		);
348
+	}
349
+
350
+
351
+
352
+	/**
353
+	 * loads service classes
354
+	 *
355
+	 * @param string $class_name - simple class name ie: session
356
+	 * @param mixed  $arguments
357
+	 * @param bool   $load_only
358
+	 * @return mixed
359
+	 * @throws EE_Error
360
+	 * @throws ReflectionException
361
+	 */
362
+	public function load_service($class_name, $arguments = array(), $load_only = false)
363
+	{
364
+		$service_paths = apply_filters(
365
+			'FHEE__EE_Registry__load_service__service_paths',
366
+			array(
367
+				EE_CORE . 'services' . DS,
368
+			)
369
+		);
370
+		// retrieve instantiated class
371
+		return $this->_load(
372
+			$service_paths,
373
+			'EE_',
374
+			$class_name,
375
+			'class',
376
+			$arguments,
377
+			false,
378
+			true,
379
+			$load_only
380
+		);
381
+	}
382
+
383
+
384
+
385
+	/**
386
+	 * loads data_migration_scripts
387
+	 *
388
+	 * @param string $class_name - class name for the DMS ie: EE_DMS_Core_4_2_0
389
+	 * @param mixed  $arguments
390
+	 * @return EE_Data_Migration_Script_Base|mixed
391
+	 * @throws EE_Error
392
+	 * @throws ReflectionException
393
+	 */
394
+	public function load_dms($class_name, $arguments = array())
395
+	{
396
+		// retrieve instantiated class
397
+		return $this->_load(
398
+			EE_Data_Migration_Manager::instance()->get_data_migration_script_folders(),
399
+			'EE_DMS_',
400
+			$class_name,
401
+			'dms',
402
+			$arguments,
403
+			false,
404
+			false
405
+		);
406
+	}
407
+
408
+
409
+
410
+	/**
411
+	 * loads object creating classes - must be singletons
412
+	 *
413
+	 * @param string $class_name - simple class name ie: attendee
414
+	 * @param mixed  $arguments  - an array of arguments to pass to the class
415
+	 * @param bool   $from_db    - some classes are instantiated from the db and thus call a different method to
416
+	 *                           instantiate
417
+	 * @param bool   $cache      if you don't want the class to be stored in the internal cache (non-persistent) then
418
+	 *                           set this to FALSE (ie. when instantiating model objects from client in a loop)
419
+	 * @param bool   $load_only  whether or not to just load the file and NOT instantiate, or load AND instantiate
420
+	 *                           (default)
421
+	 * @return EE_Base_Class | bool
422
+	 * @throws EE_Error
423
+	 * @throws ReflectionException
424
+	 */
425
+	public function load_class($class_name, $arguments = array(), $from_db = false, $cache = true, $load_only = false)
426
+	{
427
+		$paths = apply_filters(
428
+			'FHEE__EE_Registry__load_class__paths', array(
429
+			EE_CORE,
430
+			EE_CLASSES,
431
+			EE_BUSINESS,
432
+		)
433
+		);
434
+		// retrieve instantiated class
435
+		return $this->_load(
436
+			$paths,
437
+			'EE_',
438
+			$class_name,
439
+			'class',
440
+			$arguments,
441
+			$from_db,
442
+			$cache,
443
+			$load_only
444
+		);
445
+	}
446
+
447
+
448
+
449
+	/**
450
+	 * loads helper classes - must be singletons
451
+	 *
452
+	 * @param string $class_name - simple class name ie: price
453
+	 * @param mixed  $arguments
454
+	 * @param bool   $load_only
455
+	 * @return EEH_Base | bool
456
+	 * @throws EE_Error
457
+	 * @throws ReflectionException
458
+	 */
459
+	public function load_helper($class_name, $arguments = array(), $load_only = true)
460
+	{
461
+		// todo: add doing_it_wrong() in a few versions after all addons have had calls to this method removed
462
+		$helper_paths = apply_filters('FHEE__EE_Registry__load_helper__helper_paths', array(EE_HELPERS));
463
+		// retrieve instantiated class
464
+		return $this->_load(
465
+			$helper_paths,
466
+			'EEH_',
467
+			$class_name,
468
+			'helper',
469
+			$arguments,
470
+			false,
471
+			true,
472
+			$load_only
473
+		);
474
+	}
475
+
476
+
477
+
478
+	/**
479
+	 * loads core classes - must be singletons
480
+	 *
481
+	 * @param string $class_name - simple class name ie: session
482
+	 * @param mixed  $arguments
483
+	 * @param bool   $load_only
484
+	 * @param bool   $cache      whether to cache the object or not.
485
+	 * @return mixed
486
+	 * @throws EE_Error
487
+	 * @throws ReflectionException
488
+	 */
489
+	public function load_lib($class_name, $arguments = array(), $load_only = false, $cache = true)
490
+	{
491
+		$paths = array(
492
+			EE_LIBRARIES,
493
+			EE_LIBRARIES . 'messages' . DS,
494
+			EE_LIBRARIES . 'shortcodes' . DS,
495
+			EE_LIBRARIES . 'qtips' . DS,
496
+			EE_LIBRARIES . 'payment_methods' . DS,
497
+		);
498
+		// retrieve instantiated class
499
+		return $this->_load(
500
+			$paths,
501
+			'EE_',
502
+			$class_name,
503
+			'lib',
504
+			$arguments,
505
+			false,
506
+			$cache,
507
+			$load_only
508
+		);
509
+	}
510
+
511
+
512
+
513
+	/**
514
+	 * loads model classes - must be singletons
515
+	 *
516
+	 * @param string $class_name - simple class name ie: price
517
+	 * @param mixed  $arguments
518
+	 * @param bool   $load_only
519
+	 * @return EEM_Base | bool
520
+	 * @throws EE_Error
521
+	 * @throws ReflectionException
522
+	 */
523
+	public function load_model($class_name, $arguments = array(), $load_only = false)
524
+	{
525
+		$paths = apply_filters(
526
+			'FHEE__EE_Registry__load_model__paths', array(
527
+			EE_MODELS,
528
+			EE_CORE,
529
+		)
530
+		);
531
+		// retrieve instantiated class
532
+		return $this->_load(
533
+			$paths,
534
+			'EEM_',
535
+			$class_name,
536
+			'model',
537
+			$arguments,
538
+			false,
539
+			true,
540
+			$load_only
541
+		);
542
+	}
543
+
544
+
545
+
546
+	/**
547
+	 * loads model classes - must be singletons
548
+	 *
549
+	 * @param string $class_name - simple class name ie: price
550
+	 * @param mixed  $arguments
551
+	 * @param bool   $load_only
552
+	 * @return mixed | bool
553
+	 * @throws EE_Error
554
+	 * @throws ReflectionException
555
+	 */
556
+	public function load_model_class($class_name, $arguments = array(), $load_only = true)
557
+	{
558
+		$paths = array(
559
+			EE_MODELS . 'fields' . DS,
560
+			EE_MODELS . 'helpers' . DS,
561
+			EE_MODELS . 'relations' . DS,
562
+			EE_MODELS . 'strategies' . DS,
563
+		);
564
+		// retrieve instantiated class
565
+		return $this->_load(
566
+			$paths,
567
+			'EE_',
568
+			$class_name,
569
+			'',
570
+			$arguments,
571
+			false,
572
+			true,
573
+			$load_only
574
+		);
575
+	}
576
+
577
+
578
+
579
+	/**
580
+	 * Determines if $model_name is the name of an actual EE model.
581
+	 *
582
+	 * @param string $model_name like Event, Attendee, Question_Group_Question, etc.
583
+	 * @return boolean
584
+	 */
585
+	public function is_model_name($model_name)
586
+	{
587
+		return isset($this->models[$model_name]);
588
+	}
589
+
590
+
591
+
592
+	/**
593
+	 * generic class loader
594
+	 *
595
+	 * @param string $path_to_file - directory path to file location, not including filename
596
+	 * @param string $file_name    - file name  ie:  my_file.php, including extension
597
+	 * @param string $type         - file type - core? class? helper? model?
598
+	 * @param mixed  $arguments
599
+	 * @param bool   $load_only
600
+	 * @return mixed
601
+	 * @throws EE_Error
602
+	 * @throws ReflectionException
603
+	 */
604
+	public function load_file($path_to_file, $file_name, $type = '', $arguments = array(), $load_only = true)
605
+	{
606
+		// retrieve instantiated class
607
+		return $this->_load(
608
+			$path_to_file,
609
+			'',
610
+			$file_name,
611
+			$type,
612
+			$arguments,
613
+			false,
614
+			true,
615
+			$load_only
616
+		);
617
+	}
618
+
619
+
620
+
621
+	/**
622
+	 * @param string $path_to_file - directory path to file location, not including filename
623
+	 * @param string $class_name   - full class name  ie:  My_Class
624
+	 * @param string $type         - file type - core? class? helper? model?
625
+	 * @param mixed  $arguments
626
+	 * @param bool   $load_only
627
+	 * @return bool|EE_Addon|object
628
+	 * @throws EE_Error
629
+	 * @throws ReflectionException
630
+	 */
631
+	public function load_addon($path_to_file, $class_name, $type = 'class', $arguments = array(), $load_only = false)
632
+	{
633
+		// retrieve instantiated class
634
+		return $this->_load(
635
+			$path_to_file,
636
+			'addon',
637
+			$class_name,
638
+			$type,
639
+			$arguments,
640
+			false,
641
+			true,
642
+			$load_only
643
+		);
644
+	}
645
+
646
+
647
+
648
+	/**
649
+	 * instantiates, caches, and automatically resolves dependencies
650
+	 * for classes that use a Fully Qualified Class Name.
651
+	 * if the class is not capable of being loaded using PSR-4 autoloading,
652
+	 * then you need to use one of the existing load_*() methods
653
+	 * which can resolve the classname and filepath from the passed arguments
654
+	 *
655
+	 * @param bool|string $class_name   Fully Qualified Class Name
656
+	 * @param array       $arguments    an argument, or array of arguments to pass to the class upon instantiation
657
+	 * @param bool        $cache        whether to cache the instantiated object for reuse
658
+	 * @param bool        $from_db      some classes are instantiated from the db
659
+	 *                                  and thus call a different method to instantiate
660
+	 * @param bool        $load_only    if true, will only load the file, but will NOT instantiate an object
661
+	 * @param bool|string $addon        if true, will cache the object in the EE_Registry->$addons array
662
+	 * @return bool|null|mixed          null = failure to load or instantiate class object.
663
+	 *                                  object = class loaded and instantiated successfully.
664
+	 *                                  bool = fail or success when $load_only is true
665
+	 * @throws EE_Error
666
+	 * @throws ReflectionException
667
+	 */
668
+	public function create(
669
+		$class_name = false,
670
+		$arguments = array(),
671
+		$cache = false,
672
+		$from_db = false,
673
+		$load_only = false,
674
+		$addon = false
675
+	) {
676
+		$class_name = ltrim($class_name, '\\');
677
+		$class_name = $this->_dependency_map->get_alias($class_name);
678
+		$class_exists = $this->loadOrVerifyClassExists($class_name, $arguments);
679
+		// if a non-FQCN was passed, then verifyClassExists() might return an object
680
+		// or it could return null if the class just could not be found anywhere
681
+		if ($class_exists instanceof $class_name || $class_exists === null){
682
+			// either way, return the results
683
+			return $class_exists;
684
+		}
685
+		$class_name = $class_exists;
686
+		// if we're only loading the class and it already exists, then let's just return true immediately
687
+		if ($load_only) {
688
+			return true;
689
+		}
690
+		$addon = $addon
691
+			? 'addon'
692
+			: '';
693
+		// $this->_cache_on is toggled during the recursive loading that can occur with dependency injection
694
+		// $cache is controlled by individual calls to separate Registry loader methods like load_class()
695
+		// $load_only is also controlled by individual calls to separate Registry loader methods like load_file()
696
+		if ($this->_cache_on && $cache && ! $load_only) {
697
+			// return object if it's already cached
698
+			$cached_class = $this->_get_cached_class($class_name, $addon);
699
+			if ($cached_class !== null) {
700
+				return $cached_class;
701
+			}
702
+		}
703
+		// obtain the loader method from the dependency map
704
+		$loader = $this->_dependency_map->class_loader($class_name);
705
+		// instantiate the requested object
706
+		if ($loader instanceof Closure) {
707
+			$class_obj = $loader($arguments);
708
+		} else if ($loader && method_exists($this, $loader)) {
709
+			$class_obj = $this->{$loader}($class_name, $arguments);
710
+		} else {
711
+			$class_obj = $this->_create_object($class_name, $arguments, $addon, $from_db);
712
+		}
713
+		if (($this->_cache_on && $cache) || $this->get_class_abbreviation($class_name, '')) {
714
+			// save it for later... kinda like gum  { : $
715
+			$this->_set_cached_class($class_obj, $class_name, $addon, $from_db);
716
+		}
717
+		$this->_cache_on = true;
718
+		return $class_obj;
719
+	}
720
+
721
+
722
+
723
+	/**
724
+	 * Recursively checks that a class exists and potentially attempts to load classes with non-FQCNs
725
+	 *
726
+	 * @param string $class_name
727
+	 * @param array  $arguments
728
+	 * @param int    $attempt
729
+	 * @return mixed
730
+	 */
731
+	private function loadOrVerifyClassExists($class_name, array $arguments, $attempt = 1) {
732
+		if (is_object($class_name) || class_exists($class_name)) {
733
+			return $class_name;
734
+		}
735
+		switch ($attempt) {
736
+			case 1:
737
+				// if it's a FQCN then maybe the class is registered with a preceding \
738
+				$class_name = strpos($class_name, '\\') !== false
739
+					? '\\' . ltrim($class_name, '\\')
740
+					: $class_name;
741
+				break;
742
+			case 2:
743
+				//
744
+				$loader = $this->_dependency_map->class_loader($class_name);
745
+				if ($loader && method_exists($this, $loader)) {
746
+					return $this->{$loader}($class_name, $arguments);
747
+				}
748
+				break;
749
+			case 3:
750
+			default;
751
+				return null;
752
+		}
753
+		$attempt++;
754
+		return $this->loadOrVerifyClassExists($class_name, $arguments, $attempt);
755
+	}
756
+
757
+
758
+
759
+	/**
760
+	 * instantiates, caches, and injects dependencies for classes
761
+	 *
762
+	 * @param array       $file_paths   an array of paths to folders to look in
763
+	 * @param string      $class_prefix EE  or EEM or... ???
764
+	 * @param bool|string $class_name   $class name
765
+	 * @param string      $type         file type - core? class? helper? model?
766
+	 * @param mixed       $arguments    an argument or array of arguments to pass to the class upon instantiation
767
+	 * @param bool        $from_db      some classes are instantiated from the db
768
+	 *                                  and thus call a different method to instantiate
769
+	 * @param bool        $cache        whether to cache the instantiated object for reuse
770
+	 * @param bool        $load_only    if true, will only load the file, but will NOT instantiate an object
771
+	 * @return bool|null|object null = failure to load or instantiate class object.
772
+	 *                                  object = class loaded and instantiated successfully.
773
+	 *                                  bool = fail or success when $load_only is true
774
+	 * @throws EE_Error
775
+	 * @throws ReflectionException
776
+	 */
777
+	protected function _load(
778
+		$file_paths = array(),
779
+		$class_prefix = 'EE_',
780
+		$class_name = false,
781
+		$type = 'class',
782
+		$arguments = array(),
783
+		$from_db = false,
784
+		$cache = true,
785
+		$load_only = false
786
+	) {
787
+		$class_name = ltrim($class_name, '\\');
788
+		// strip php file extension
789
+		$class_name = str_replace('.php', '', trim($class_name));
790
+		// does the class have a prefix ?
791
+		if (! empty($class_prefix) && $class_prefix !== 'addon') {
792
+			// make sure $class_prefix is uppercase
793
+			$class_prefix = strtoupper(trim($class_prefix));
794
+			// add class prefix ONCE!!!
795
+			$class_name = $class_prefix . str_replace($class_prefix, '', $class_name);
796
+		}
797
+		$class_name = $this->_dependency_map->get_alias($class_name);
798
+		$class_exists = class_exists($class_name, false);
799
+		// if we're only loading the class and it already exists, then let's just return true immediately
800
+		if ($load_only && $class_exists) {
801
+			return true;
802
+		}
803
+		// $this->_cache_on is toggled during the recursive loading that can occur with dependency injection
804
+		// $cache is controlled by individual calls to separate Registry loader methods like load_class()
805
+		// $load_only is also controlled by individual calls to separate Registry loader methods like load_file()
806
+		if ($this->_cache_on && $cache && ! $load_only) {
807
+			// return object if it's already cached
808
+			$cached_class = $this->_get_cached_class($class_name, $class_prefix);
809
+			if ($cached_class !== null) {
810
+				return $cached_class;
811
+			}
812
+		}
813
+		// if the class doesn't already exist.. then we need to try and find the file and load it
814
+		if (! $class_exists) {
815
+			// get full path to file
816
+			$path = $this->_resolve_path($class_name, $type, $file_paths);
817
+			// load the file
818
+			$loaded = $this->_require_file($path, $class_name, $type, $file_paths);
819
+			// if loading failed, or we are only loading a file but NOT instantiating an object
820
+			if (! $loaded || $load_only) {
821
+				// return boolean if only loading, or null if an object was expected
822
+				return $load_only
823
+					? $loaded
824
+					: null;
825
+			}
826
+		}
827
+		// instantiate the requested object
828
+		$class_obj = $this->_create_object($class_name, $arguments, $type, $from_db);
829
+		if ($this->_cache_on && $cache) {
830
+			// save it for later... kinda like gum  { : $
831
+			$this->_set_cached_class($class_obj, $class_name, $class_prefix, $from_db);
832
+		}
833
+		$this->_cache_on = true;
834
+		return $class_obj;
835
+	}
836
+
837
+
838
+
839
+	/**
840
+	 * @param string $class_name
841
+	 * @param string $default have to specify something, but not anything that will conflict
842
+	 * @return mixed|string
843
+	 */
844
+	protected function get_class_abbreviation($class_name, $default = 'FANCY_BATMAN_PANTS')
845
+	{
846
+		return isset($this->_class_abbreviations[$class_name])
847
+			? $this->_class_abbreviations[$class_name]
848
+			: $default;
849
+	}
850
+
851
+	/**
852
+	 * attempts to find a cached version of the requested class
853
+	 * by looking in the following places:
854
+	 *        $this->{$class_abbreviation}            ie:    $this->CART
855
+	 *        $this->{$class_name}                        ie:    $this->Some_Class
856
+	 *        $this->LIB->{$class_name}                ie:    $this->LIB->Some_Class
857
+	 *        $this->addon->{$class_name}    ie:    $this->addon->Some_Addon_Class
858
+	 *
859
+	 * @param string $class_name
860
+	 * @param string $class_prefix
861
+	 * @return mixed
862
+	 */
863
+	protected function _get_cached_class($class_name, $class_prefix = '')
864
+	{
865
+		if ($class_name === 'EE_Registry') {
866
+			return $this;
867
+		}
868
+		$class_abbreviation = $this->get_class_abbreviation($class_name);
869
+		$class_name = str_replace('\\', '_', $class_name);
870
+		// check if class has already been loaded, and return it if it has been
871
+		if (isset($this->{$class_abbreviation})) {
872
+			return $this->{$class_abbreviation};
873
+		}
874
+		if (isset ($this->{$class_name})) {
875
+			return $this->{$class_name};
876
+		}
877
+		if (isset ($this->LIB->{$class_name})) {
878
+			return $this->LIB->{$class_name};
879
+		}
880
+		if ($class_prefix === 'addon' && isset ($this->addons->{$class_name})) {
881
+			return $this->addons->{$class_name};
882
+		}
883
+		return null;
884
+	}
885
+
886
+
887
+
888
+	/**
889
+	 * removes a cached version of the requested class
890
+	 *
891
+	 * @param string  $class_name
892
+	 * @param boolean $addon
893
+	 * @return boolean
894
+	 */
895
+	public function clear_cached_class($class_name, $addon = false)
896
+	{
897
+		$class_abbreviation = $this->get_class_abbreviation($class_name);
898
+		$class_name = str_replace('\\', '_', $class_name);
899
+		// check if class has already been loaded, and return it if it has been
900
+		if (isset($this->{$class_abbreviation})) {
901
+			$this->{$class_abbreviation} = null;
902
+			return true;
903
+		}
904
+		if (isset($this->{$class_name})) {
905
+			$this->{$class_name} = null;
906
+			return true;
907
+		}
908
+		if (isset($this->LIB->{$class_name})) {
909
+			unset($this->LIB->{$class_name});
910
+			return true;
911
+		}
912
+		if ($addon && isset($this->addons->{$class_name})) {
913
+			unset($this->addons->{$class_name});
914
+			return true;
915
+		}
916
+		return false;
917
+	}
918
+
919
+
920
+
921
+	/**
922
+	 * attempts to find a full valid filepath for the requested class.
923
+	 * loops thru each of the base paths in the $file_paths array and appends : "{classname} . {file type} . php"
924
+	 * then returns that path if the target file has been found and is readable
925
+	 *
926
+	 * @param string $class_name
927
+	 * @param string $type
928
+	 * @param array  $file_paths
929
+	 * @return string | bool
930
+	 */
931
+	protected function _resolve_path($class_name, $type = '', $file_paths = array())
932
+	{
933
+		// make sure $file_paths is an array
934
+		$file_paths = is_array($file_paths)
935
+			? $file_paths
936
+			: array($file_paths);
937
+		// cycle thru paths
938
+		foreach ($file_paths as $key => $file_path) {
939
+			// convert all separators to proper DS, if no filepath, then use EE_CLASSES
940
+			$file_path = $file_path
941
+				? str_replace(array('/', '\\'), DS, $file_path)
942
+				: EE_CLASSES;
943
+			// prep file type
944
+			$type = ! empty($type)
945
+				? trim($type, '.') . '.'
946
+				: '';
947
+			// build full file path
948
+			$file_paths[$key] = rtrim($file_path, DS) . DS . $class_name . '.' . $type . 'php';
949
+			//does the file exist and can be read ?
950
+			if (is_readable($file_paths[$key])) {
951
+				return $file_paths[$key];
952
+			}
953
+		}
954
+		return false;
955
+	}
956
+
957
+
958
+
959
+	/**
960
+	 * basically just performs a require_once()
961
+	 * but with some error handling
962
+	 *
963
+	 * @param  string $path
964
+	 * @param  string $class_name
965
+	 * @param  string $type
966
+	 * @param  array  $file_paths
967
+	 * @return bool
968
+	 * @throws EE_Error
969
+	 * @throws ReflectionException
970
+	 */
971
+	protected function _require_file($path, $class_name, $type = '', $file_paths = array())
972
+	{
973
+		$this->resolve_legacy_class_parent($class_name);
974
+		// don't give up! you gotta...
975
+		try {
976
+			//does the file exist and can it be read ?
977
+			if (! $path) {
978
+				// just in case the file has already been autoloaded,
979
+				// but discrepancies in the naming schema are preventing it from
980
+				// being loaded via one of the EE_Registry::load_*() methods,
981
+				// then let's try one last hail mary before throwing an exception
982
+				// and call class_exists() again, but with autoloading turned ON
983
+				if(class_exists($class_name)) {
984
+					return true;
985
+				}
986
+				// so sorry, can't find the file
987
+				throw new EE_Error (
988
+					sprintf(
989
+						esc_html__(
990
+							'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',
991
+							'event_espresso'
992
+						),
993
+						trim($type, '.'),
994
+						$class_name,
995
+						'<br />' . implode(',<br />', $file_paths)
996
+					)
997
+				);
998
+			}
999
+			// get the file
1000
+			require_once($path);
1001
+			// if the class isn't already declared somewhere
1002
+			if (class_exists($class_name, false) === false) {
1003
+				// so sorry, not a class
1004
+				throw new EE_Error(
1005
+					sprintf(
1006
+						esc_html__('The %s file %s does not appear to contain the %s Class.', 'event_espresso'),
1007
+						$type,
1008
+						$path,
1009
+						$class_name
1010
+					)
1011
+				);
1012
+			}
1013
+		} catch (EE_Error $e) {
1014
+			$e->get_error();
1015
+			return false;
1016
+		}
1017
+		return true;
1018
+	}
1019
+
1020
+
1021
+
1022
+	/**
1023
+	 * Some of our legacy classes that extended a parent class would simply use a require() statement
1024
+	 * before their class declaration in order to ensure that the parent class was loaded.
1025
+	 * This is not ideal, but it's nearly impossible to determine the parent class of a non-namespaced class,
1026
+	 * without triggering a fatal error because the parent class has yet to be loaded and therefore doesn't exist.
1027
+	 *
1028
+	 * @param string $class_name
1029
+	 */
1030
+	protected function resolve_legacy_class_parent($class_name = '')
1031
+	{
1032
+		try {
1033
+			$legacy_parent_class_map = array(
1034
+				'EE_Payment_Processor' => 'core/business/EE_Processor_Base.class.php'
1035
+			);
1036
+			if(isset($legacy_parent_class_map[$class_name])) {
1037
+				require_once EE_PLUGIN_DIR_PATH . $legacy_parent_class_map[$class_name];
1038
+			}
1039
+		} catch (Exception $exception) {
1040
+		}
1041
+	}
1042
+
1043
+
1044
+
1045
+	/**
1046
+	 * _create_object
1047
+	 * Attempts to instantiate the requested class via any of the
1048
+	 * commonly used instantiation methods employed throughout EE.
1049
+	 * The priority for instantiation is as follows:
1050
+	 *        - abstract classes or any class flagged as "load only" (no instantiation occurs)
1051
+	 *        - model objects via their 'new_instance_from_db' method
1052
+	 *        - model objects via their 'new_instance' method
1053
+	 *        - "singleton" classes" via their 'instance' method
1054
+	 *    - standard instantiable classes via their __constructor
1055
+	 * Prior to instantiation, if the classname exists in the dependency_map,
1056
+	 * then the constructor for the requested class will be examined to determine
1057
+	 * if any dependencies exist, and if they can be injected.
1058
+	 * If so, then those classes will be added to the array of arguments passed to the constructor
1059
+	 *
1060
+	 * @param string $class_name
1061
+	 * @param array  $arguments
1062
+	 * @param string $type
1063
+	 * @param bool   $from_db
1064
+	 * @return null|object
1065
+	 * @throws EE_Error
1066
+	 * @throws ReflectionException
1067
+	 */
1068
+	protected function _create_object($class_name, $arguments = array(), $type = '', $from_db = false)
1069
+	{
1070
+		// create reflection
1071
+		$reflector = $this->get_ReflectionClass($class_name);
1072
+		// make sure arguments are an array
1073
+		$arguments = is_array($arguments)
1074
+			? $arguments
1075
+			: array($arguments);
1076
+		// and if arguments array is numerically and sequentially indexed, then we want it to remain as is,
1077
+		// else wrap it in an additional array so that it doesn't get split into multiple parameters
1078
+		$arguments = $this->_array_is_numerically_and_sequentially_indexed($arguments)
1079
+			? $arguments
1080
+			: array($arguments);
1081
+		// attempt to inject dependencies ?
1082
+		if ($this->_dependency_map->has($class_name)) {
1083
+			$arguments = $this->_resolve_dependencies($reflector, $class_name, $arguments);
1084
+		}
1085
+		// instantiate the class if possible
1086
+		if ($reflector->isAbstract()) {
1087
+			// nothing to instantiate, loading file was enough
1088
+			// does not throw an exception so $instantiation_mode is unused
1089
+			// $instantiation_mode = "1) no constructor abstract class";
1090
+			return true;
1091
+		}
1092
+		if (empty($arguments) && $reflector->getConstructor() === null && $reflector->isInstantiable()) {
1093
+			// no constructor = static methods only... nothing to instantiate, loading file was enough
1094
+			// $instantiation_mode = "2) no constructor but instantiable";
1095
+			return $reflector->newInstance();
1096
+		}
1097
+		if ($from_db && method_exists($class_name, 'new_instance_from_db')) {
1098
+			// $instantiation_mode = "3) new_instance_from_db()";
1099
+			return call_user_func_array(array($class_name, 'new_instance_from_db'), $arguments);
1100
+		}
1101
+		if (method_exists($class_name, 'new_instance')) {
1102
+			// $instantiation_mode = "4) new_instance()";
1103
+			return call_user_func_array(array($class_name, 'new_instance'), $arguments);
1104
+		}
1105
+		if (method_exists($class_name, 'instance')) {
1106
+			// $instantiation_mode = "5) instance()";
1107
+			return call_user_func_array(array($class_name, 'instance'), $arguments);
1108
+		}
1109
+		if ($reflector->isInstantiable()) {
1110
+			// $instantiation_mode = "6) constructor";
1111
+			return $reflector->newInstanceArgs($arguments);
1112
+		}
1113
+		// heh ? something's not right !
1114
+		throw new EE_Error(
1115
+			sprintf(
1116
+				__('The %s file %s could not be instantiated.', 'event_espresso'),
1117
+				$type,
1118
+				$class_name
1119
+			)
1120
+		);
1121
+	}
1122
+
1123
+
1124
+
1125
+	/**
1126
+	 * @see http://stackoverflow.com/questions/173400/how-to-check-if-php-array-is-associative-or-sequential
1127
+	 * @param array $array
1128
+	 * @return bool
1129
+	 */
1130
+	protected function _array_is_numerically_and_sequentially_indexed(array $array)
1131
+	{
1132
+		return ! empty($array)
1133
+			? array_keys($array) === range(0, count($array) - 1)
1134
+			: true;
1135
+	}
1136
+
1137
+
1138
+
1139
+	/**
1140
+	 * getReflectionClass
1141
+	 * checks if a ReflectionClass object has already been generated for a class
1142
+	 * and returns that instead of creating a new one
1143
+	 *
1144
+	 * @param string $class_name
1145
+	 * @return ReflectionClass
1146
+	 * @throws ReflectionException
1147
+	 */
1148
+	public function get_ReflectionClass($class_name)
1149
+	{
1150
+		if (
1151
+			! isset($this->_reflectors[$class_name])
1152
+			|| ! $this->_reflectors[$class_name] instanceof ReflectionClass
1153
+		) {
1154
+			$this->_reflectors[$class_name] = new ReflectionClass($class_name);
1155
+		}
1156
+		return $this->_reflectors[$class_name];
1157
+	}
1158
+
1159
+
1160
+
1161
+	/**
1162
+	 * _resolve_dependencies
1163
+	 * examines the constructor for the requested class to determine
1164
+	 * if any dependencies exist, and if they can be injected.
1165
+	 * If so, then those classes will be added to the array of arguments passed to the constructor
1166
+	 * PLZ NOTE: this is achieved by type hinting the constructor params
1167
+	 * For example:
1168
+	 *        if attempting to load a class "Foo" with the following constructor:
1169
+	 *        __construct( Bar $bar_class, Fighter $grohl_class )
1170
+	 *        then $bar_class and $grohl_class will be added to the $arguments array,
1171
+	 *        but only IF they are NOT already present in the incoming arguments array,
1172
+	 *        and the correct classes can be loaded
1173
+	 *
1174
+	 * @param ReflectionClass $reflector
1175
+	 * @param string          $class_name
1176
+	 * @param array           $arguments
1177
+	 * @return array
1178
+	 * @throws EE_Error
1179
+	 * @throws ReflectionException
1180
+	 */
1181
+	protected function _resolve_dependencies(ReflectionClass $reflector, $class_name, $arguments = array())
1182
+	{
1183
+		// let's examine the constructor
1184
+		$constructor = $reflector->getConstructor();
1185
+		// whu? huh? nothing?
1186
+		if (! $constructor) {
1187
+			return $arguments;
1188
+		}
1189
+		// get constructor parameters
1190
+		$params = $constructor->getParameters();
1191
+		// and the keys for the incoming arguments array so that we can compare existing arguments with what is expected
1192
+		$argument_keys = array_keys($arguments);
1193
+		// now loop thru all of the constructors expected parameters
1194
+		foreach ($params as $index => $param) {
1195
+			// is this a dependency for a specific class ?
1196
+			$param_class = $param->getClass()
1197
+				? $param->getClass()->name
1198
+				: null;
1199
+			// BUT WAIT !!! This class may be an alias for something else (or getting replaced at runtime)
1200
+			$param_class = $this->_dependency_map->has_alias($param_class, $class_name)
1201
+				? $this->_dependency_map->get_alias($param_class, $class_name)
1202
+				: $param_class;
1203
+			if (
1204
+				// param is not even a class
1205
+				$param_class === null
1206
+				// and something already exists in the incoming arguments for this param
1207
+				&& array_key_exists($index, $argument_keys)
1208
+				&& array_key_exists($argument_keys[$index], $arguments)
1209
+			) {
1210
+				// so let's skip this argument and move on to the next
1211
+				continue;
1212
+			}
1213
+			if (
1214
+				// parameter is type hinted as a class, exists as an incoming argument, AND it's the correct class
1215
+				$param_class !== null
1216
+				&& isset($argument_keys[$index], $arguments[$argument_keys[$index]])
1217
+				&& $arguments[$argument_keys[$index]] instanceof $param_class
1218
+			) {
1219
+				// skip this argument and move on to the next
1220
+				continue;
1221
+			}
1222
+			if (
1223
+				// parameter is type hinted as a class, and should be injected
1224
+				$param_class !== null
1225
+				&& $this->_dependency_map->has_dependency_for_class($class_name, $param_class)
1226
+			) {
1227
+				$arguments = $this->_resolve_dependency(
1228
+					$class_name,
1229
+					$param_class,
1230
+					$arguments,
1231
+					$index,
1232
+					$argument_keys
1233
+				);
1234
+			} else {
1235
+				try {
1236
+					$arguments[$index] = $param->isDefaultValueAvailable()
1237
+						? $param->getDefaultValue()
1238
+						: null;
1239
+				} catch (ReflectionException $e) {
1240
+					throw new ReflectionException(
1241
+						sprintf(
1242
+							esc_html__('%1$s for parameter "$%2$s on classname "%3$s"', 'event_espresso'),
1243
+							$e->getMessage(),
1244
+							$param->getName(),
1245
+							$class_name
1246
+						)
1247
+					);
1248
+				}
1249
+			}
1250
+		}
1251
+		return $arguments;
1252
+	}
1253
+
1254
+
1255
+
1256
+	/**
1257
+	 * @param string $class_name
1258
+	 * @param string $param_class
1259
+	 * @param array  $arguments
1260
+	 * @param mixed  $index
1261
+	 * @param array  $argument_keys
1262
+	 * @return array
1263
+	 * @throws EE_Error
1264
+	 * @throws ReflectionException
1265
+	 * @throws InvalidArgumentException
1266
+	 * @throws InvalidInterfaceException
1267
+	 * @throws InvalidDataTypeException
1268
+	 */
1269
+	protected function _resolve_dependency($class_name, $param_class, $arguments, $index, array $argument_keys)
1270
+	{
1271
+		$dependency = null;
1272
+		// should dependency be loaded from cache ?
1273
+		$cache_on = $this->_dependency_map->loading_strategy_for_class_dependency(
1274
+			$class_name,
1275
+			$param_class
1276
+		);
1277
+		$cache_on = $cache_on !== EE_Dependency_Map::load_new_object;
1278
+		// we might have a dependency...
1279
+		// let's MAYBE try and find it in our cache if that's what's been requested
1280
+		$cached_class = $cache_on
1281
+			? $this->_get_cached_class($param_class)
1282
+			: null;
1283
+		// and grab it if it exists
1284
+		if ($cached_class instanceof $param_class) {
1285
+			$dependency = $cached_class;
1286
+		} else if ($param_class !== $class_name) {
1287
+			// obtain the loader method from the dependency map
1288
+			$loader = $this->_dependency_map->class_loader($param_class);
1289
+			// is loader a custom closure ?
1290
+			if ($loader instanceof Closure) {
1291
+				$dependency = $loader($arguments);
1292
+			} else {
1293
+				// set the cache on property for the recursive loading call
1294
+				$this->_cache_on = $cache_on;
1295
+				// if not, then let's try and load it via the registry
1296
+				if ($loader && method_exists($this, $loader)) {
1297
+					$dependency = $this->{$loader}($param_class);
1298
+				} else {
1299
+					$dependency = LoaderFactory::getLoader()->load(
1300
+						$param_class,
1301
+						array(),
1302
+						$cache_on
1303
+					);
1304
+				}
1305
+			}
1306
+		}
1307
+		// did we successfully find the correct dependency ?
1308
+		if ($dependency instanceof $param_class) {
1309
+			// then let's inject it into the incoming array of arguments at the correct location
1310
+			$arguments[$index] = $dependency;
1311
+		}
1312
+		return $arguments;
1313
+	}
1314
+
1315
+
1316
+
1317
+	/**
1318
+	 * _set_cached_class
1319
+	 * attempts to cache the instantiated class locally
1320
+	 * in one of the following places, in the following order:
1321
+	 *        $this->{class_abbreviation}   ie:    $this->CART
1322
+	 *        $this->{$class_name}          ie:    $this->Some_Class
1323
+	 *        $this->addon->{$$class_name}    ie:    $this->addon->Some_Addon_Class
1324
+	 *        $this->LIB->{$class_name}     ie:    $this->LIB->Some_Class
1325
+	 *
1326
+	 * @param object $class_obj
1327
+	 * @param string $class_name
1328
+	 * @param string $class_prefix
1329
+	 * @param bool   $from_db
1330
+	 * @return void
1331
+	 */
1332
+	protected function _set_cached_class($class_obj, $class_name, $class_prefix = '', $from_db = false)
1333
+	{
1334
+		if ($class_name === 'EE_Registry' || empty($class_obj)) {
1335
+			return;
1336
+		}
1337
+		// return newly instantiated class
1338
+		$class_abbreviation = $this->get_class_abbreviation($class_name, '');
1339
+		if ($class_abbreviation) {
1340
+			$this->{$class_abbreviation} = $class_obj;
1341
+			return;
1342
+		}
1343
+		$class_name = str_replace('\\', '_', $class_name);
1344
+		if (property_exists($this, $class_name)) {
1345
+			$this->{$class_name} = $class_obj;
1346
+			return;
1347
+		}
1348
+		if ($class_prefix === 'addon') {
1349
+			$this->addons->{$class_name} = $class_obj;
1350
+			return;
1351
+		}
1352
+		if (! $from_db) {
1353
+			$this->LIB->{$class_name} = $class_obj;
1354
+		}
1355
+	}
1356
+
1357
+
1358
+
1359
+	/**
1360
+	 * call any loader that's been registered in the EE_Dependency_Map::$_class_loaders array
1361
+	 *
1362
+	 * @param string $classname PLEASE NOTE: the class name needs to match what's registered
1363
+	 *                          in the EE_Dependency_Map::$_class_loaders array,
1364
+	 *                          including the class prefix, ie: "EE_", "EEM_", "EEH_", etc
1365
+	 * @param array  $arguments
1366
+	 * @return object
1367
+	 */
1368
+	public static function factory($classname, $arguments = array())
1369
+	{
1370
+		$loader = self::instance()->_dependency_map->class_loader($classname);
1371
+		if ($loader instanceof Closure) {
1372
+			return $loader($arguments);
1373
+		}
1374
+		if (method_exists(self::instance(), $loader)) {
1375
+			return self::instance()->{$loader}($classname, $arguments);
1376
+		}
1377
+		return null;
1378
+	}
1379
+
1380
+
1381
+
1382
+	/**
1383
+	 * Gets the addon by its class name
1384
+	 *
1385
+	 * @param string $class_name
1386
+	 * @return EE_Addon
1387
+	 */
1388
+	public function getAddon($class_name)
1389
+	{
1390
+		$class_name = str_replace('\\', '_', $class_name);
1391
+		return $this->addons->{$class_name};
1392
+	}
1393
+
1394
+
1395
+	/**
1396
+	 * removes the addon from the internal cache
1397
+	 *
1398
+	 * @param string $class_name
1399
+	 * @return void
1400
+	 */
1401
+	public function removeAddon($class_name)
1402
+	{
1403
+		$class_name = str_replace('\\', '_', $class_name);
1404
+		unset($this->addons->{$class_name});
1405
+	}
1406
+
1407
+
1408
+
1409
+	/**
1410
+	 * Gets the addon by its name/slug (not classname. For that, just
1411
+	 * use the get_addon() method above
1412
+	 *
1413
+	 * @param string $name
1414
+	 * @return EE_Addon
1415
+	 */
1416
+	public function get_addon_by_name($name)
1417
+	{
1418
+		foreach ($this->addons as $addon) {
1419
+			if ($addon->name() === $name) {
1420
+				return $addon;
1421
+			}
1422
+		}
1423
+		return null;
1424
+	}
1425
+
1426
+
1427
+
1428
+	/**
1429
+	 * Gets an array of all the registered addons, where the keys are their names.
1430
+	 * (ie, what each returns for their name() function)
1431
+	 * They're already available on EE_Registry::instance()->addons as properties,
1432
+	 * where each property's name is the addon's classname,
1433
+	 * So if you just want to get the addon by classname,
1434
+	 * OR use the get_addon() method above.
1435
+	 * PLEASE  NOTE:
1436
+	 * addons with Fully Qualified Class Names
1437
+	 * have had the namespace separators converted to underscores,
1438
+	 * so a classname like Fully\Qualified\ClassName
1439
+	 * would have been converted to Fully_Qualified_ClassName
1440
+	 *
1441
+	 * @return EE_Addon[] where the KEYS are the addon's name()
1442
+	 */
1443
+	public function get_addons_by_name()
1444
+	{
1445
+		$addons = array();
1446
+		foreach ($this->addons as $addon) {
1447
+			$addons[$addon->name()] = $addon;
1448
+		}
1449
+		return $addons;
1450
+	}
1451
+
1452
+
1453
+	/**
1454
+	 * Resets the specified model's instance AND makes sure EE_Registry doesn't keep
1455
+	 * a stale copy of it around
1456
+	 *
1457
+	 * @param string $model_name
1458
+	 * @return \EEM_Base
1459
+	 * @throws \EE_Error
1460
+	 */
1461
+	public function reset_model($model_name)
1462
+	{
1463
+		$model_class_name = strpos($model_name, 'EEM_') !== 0
1464
+			? "EEM_{$model_name}"
1465
+			: $model_name;
1466
+		if (! isset($this->LIB->{$model_class_name}) || ! $this->LIB->{$model_class_name} instanceof EEM_Base) {
1467
+			return null;
1468
+		}
1469
+		//get that model reset it and make sure we nuke the old reference to it
1470
+		if ($this->LIB->{$model_class_name} instanceof $model_class_name
1471
+			&& is_callable(
1472
+				array($model_class_name, 'reset')
1473
+			)) {
1474
+			$this->LIB->{$model_class_name} = $this->LIB->{$model_class_name}->reset();
1475
+		} else {
1476
+			throw new EE_Error(sprintf(esc_html__('Model %s does not have a method "reset"', 'event_espresso'), $model_name));
1477
+		}
1478
+		return $this->LIB->{$model_class_name};
1479
+	}
1480
+
1481
+
1482
+
1483
+	/**
1484
+	 * Resets the registry.
1485
+	 * The criteria for what gets reset is based on what can be shared between sites on the same request when
1486
+	 * switch_to_blog is used in a multisite install.  Here is a list of things that are NOT reset.
1487
+	 * - $_dependency_map
1488
+	 * - $_class_abbreviations
1489
+	 * - $NET_CFG (EE_Network_Config): The config is shared network wide so no need to reset.
1490
+	 * - $REQ:  Still on the same request so no need to change.
1491
+	 * - $CAP: There is no site specific state in the EE_Capability class.
1492
+	 * - $SSN: Although ideally, the session should not be shared between site switches, we can't reset it because only
1493
+	 * one Session can be active in a single request.  Resetting could resolve in "headers already sent" errors.
1494
+	 * - $addons:  In multisite, the state of the addons is something controlled via hooks etc in a normal request.  So
1495
+	 *             for now, we won't reset the addons because it could break calls to an add-ons class/methods in the
1496
+	 *             switch or on the restore.
1497
+	 * - $modules
1498
+	 * - $shortcodes
1499
+	 * - $widgets
1500
+	 *
1501
+	 * @param boolean $hard             [deprecated]
1502
+	 * @param boolean $reinstantiate    whether to create new instances of EE_Registry's singletons too,
1503
+	 *                                  or just reset without re-instantiating (handy to set to FALSE if you're not
1504
+	 *                                  sure if you CAN currently reinstantiate the singletons at the moment)
1505
+	 * @param   bool  $reset_models     Defaults to true.  When false, then the models are not reset.  This is so
1506
+	 *                                  client
1507
+	 *                                  code instead can just change the model context to a different blog id if
1508
+	 *                                  necessary
1509
+	 * @return EE_Registry
1510
+	 * @throws EE_Error
1511
+	 * @throws ReflectionException
1512
+	 */
1513
+	public static function reset($hard = false, $reinstantiate = true, $reset_models = true)
1514
+	{
1515
+		$instance = self::instance();
1516
+		$instance->_cache_on = true;
1517
+		// reset some "special" classes
1518
+		EEH_Activation::reset();
1519
+		$hard = apply_filters( 'FHEE__EE_Registry__reset__hard', $hard);
1520
+		$instance->CFG = EE_Config::reset($hard, $reinstantiate);
1521
+		$instance->CART = null;
1522
+		$instance->MRM = null;
1523
+		$instance->AssetsRegistry = $instance->create('EventEspresso\core\services\assets\Registry');
1524
+		//messages reset
1525
+		EED_Messages::reset();
1526
+		//handle of objects cached on LIB
1527
+		foreach (array('LIB', 'modules') as $cache) {
1528
+			foreach ($instance->{$cache} as $class_name => $class) {
1529
+				if (self::_reset_and_unset_object($class, $reset_models)) {
1530
+					unset($instance->{$cache}->{$class_name});
1531
+				}
1532
+			}
1533
+		}
1534
+		return $instance;
1535
+	}
1536
+
1537
+
1538
+
1539
+	/**
1540
+	 * if passed object implements ResettableInterface, then call it's reset() method
1541
+	 * if passed object implements InterminableInterface, then return false,
1542
+	 * to indicate that it should NOT be cleared from the Registry cache
1543
+	 *
1544
+	 * @param      $object
1545
+	 * @param bool $reset_models
1546
+	 * @return bool returns true if cached object should be unset
1547
+	 */
1548
+	private static function _reset_and_unset_object($object, $reset_models)
1549
+	{
1550
+		if (! is_object($object)) {
1551
+			// don't unset anything that's not an object
1552
+			return false;
1553
+		}
1554
+		if ($object instanceof EED_Module) {
1555
+			$object::reset();
1556
+			// don't unset modules
1557
+			return false;
1558
+		}
1559
+		if ($object instanceof ResettableInterface) {
1560
+			if ($object instanceof EEM_Base) {
1561
+				if ($reset_models) {
1562
+					$object->reset();
1563
+					return true;
1564
+				}
1565
+				return false;
1566
+			}
1567
+			$object->reset();
1568
+			return true;
1569
+		}
1570
+		if (! $object instanceof InterminableInterface) {
1571
+			return true;
1572
+		}
1573
+		return false;
1574
+	}
1575
+
1576
+
1577
+
1578
+	/**
1579
+	 * Gets all the custom post type models defined
1580
+	 *
1581
+	 * @return array keys are model "short names" (Eg "Event") and keys are classnames (eg "EEM_Event")
1582
+	 */
1583
+	public function cpt_models()
1584
+	{
1585
+		$cpt_models = array();
1586
+		foreach ($this->non_abstract_db_models as $short_name => $classname) {
1587
+			if (is_subclass_of($classname, 'EEM_CPT_Base')) {
1588
+				$cpt_models[$short_name] = $classname;
1589
+			}
1590
+		}
1591
+		return $cpt_models;
1592
+	}
1593
+
1594
+
1595
+
1596
+	/**
1597
+	 * @return \EE_Config
1598
+	 */
1599
+	public static function CFG()
1600
+	{
1601
+		return self::instance()->CFG;
1602
+	}
1603 1603
 
1604 1604
 
1605 1605
 }
Please login to merge, or discard this patch.
espresso.php 1 patch
Indentation   +192 added lines, -192 removed lines patch added patch discarded remove patch
@@ -38,217 +38,217 @@
 block discarded – undo
38 38
  * @since       4.0
39 39
  */
40 40
 if (function_exists('espresso_version')) {
41
-    if (! function_exists('espresso_duplicate_plugin_error')) {
42
-        /**
43
-         *    espresso_duplicate_plugin_error
44
-         *    displays if more than one version of EE is activated at the same time
45
-         */
46
-        function espresso_duplicate_plugin_error()
47
-        {
48
-            ?>
41
+	if (! function_exists('espresso_duplicate_plugin_error')) {
42
+		/**
43
+		 *    espresso_duplicate_plugin_error
44
+		 *    displays if more than one version of EE is activated at the same time
45
+		 */
46
+		function espresso_duplicate_plugin_error()
47
+		{
48
+			?>
49 49
             <div class="error">
50 50
                 <p>
51 51
                     <?php
52
-                    echo esc_html__(
53
-                        'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
-                        'event_espresso'
55
-                    ); ?>
52
+					echo esc_html__(
53
+						'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
+						'event_espresso'
55
+					); ?>
56 56
                 </p>
57 57
             </div>
58 58
             <?php
59
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
60
-        }
61
-    }
62
-    add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
59
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
60
+		}
61
+	}
62
+	add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
63 63
 
64 64
 } else {
65
-    define('EE_MIN_PHP_VER_REQUIRED', '5.3.9');
66
-    if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
67
-        /**
68
-         * espresso_minimum_php_version_error
69
-         *
70
-         * @return void
71
-         */
72
-        function espresso_minimum_php_version_error()
73
-        {
74
-            ?>
65
+	define('EE_MIN_PHP_VER_REQUIRED', '5.3.9');
66
+	if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
67
+		/**
68
+		 * espresso_minimum_php_version_error
69
+		 *
70
+		 * @return void
71
+		 */
72
+		function espresso_minimum_php_version_error()
73
+		{
74
+			?>
75 75
             <div class="error">
76 76
                 <p>
77 77
                     <?php
78
-                    printf(
79
-                        esc_html__(
80
-                            'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
81
-                            'event_espresso'
82
-                        ),
83
-                        EE_MIN_PHP_VER_REQUIRED,
84
-                        PHP_VERSION,
85
-                        '<br/>',
86
-                        '<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
87
-                    );
88
-                    ?>
78
+					printf(
79
+						esc_html__(
80
+							'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
81
+							'event_espresso'
82
+						),
83
+						EE_MIN_PHP_VER_REQUIRED,
84
+						PHP_VERSION,
85
+						'<br/>',
86
+						'<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
87
+					);
88
+					?>
89 89
                 </p>
90 90
             </div>
91 91
             <?php
92
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
93
-        }
92
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
93
+		}
94 94
 
95
-        add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
96
-    } else {
97
-        define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
98
-        /**
99
-         * espresso_version
100
-         * Returns the plugin version
101
-         *
102
-         * @return string
103
-         */
104
-        function espresso_version()
105
-        {
106
-            return apply_filters('FHEE__espresso__espresso_version', '4.9.51.rc.000');
107
-        }
95
+		add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
96
+	} else {
97
+		define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
98
+		/**
99
+		 * espresso_version
100
+		 * Returns the plugin version
101
+		 *
102
+		 * @return string
103
+		 */
104
+		function espresso_version()
105
+		{
106
+			return apply_filters('FHEE__espresso__espresso_version', '4.9.51.rc.000');
107
+		}
108 108
 
109
-        /**
110
-         * espresso_plugin_activation
111
-         * adds a wp-option to indicate that EE has been activated via the WP admin plugins page
112
-         */
113
-        function espresso_plugin_activation()
114
-        {
115
-            update_option('ee_espresso_activation', true);
116
-        }
109
+		/**
110
+		 * espresso_plugin_activation
111
+		 * adds a wp-option to indicate that EE has been activated via the WP admin plugins page
112
+		 */
113
+		function espresso_plugin_activation()
114
+		{
115
+			update_option('ee_espresso_activation', true);
116
+		}
117 117
 
118
-        register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
119
-        /**
120
-         *    espresso_load_error_handling
121
-         *    this function loads EE's class for handling exceptions and errors
122
-         */
123
-        function espresso_load_error_handling()
124
-        {
125
-            static $error_handling_loaded = false;
126
-            if ($error_handling_loaded) {
127
-                return;
128
-            }
129
-            // load debugging tools
130
-            if (WP_DEBUG === true && is_readable(EE_HELPERS . 'EEH_Debug_Tools.helper.php')) {
131
-                require_once   EE_HELPERS . 'EEH_Debug_Tools.helper.php';
132
-                \EEH_Debug_Tools::instance();
133
-            }
134
-            // load error handling
135
-            if (is_readable(EE_CORE . 'EE_Error.core.php')) {
136
-                require_once EE_CORE . 'EE_Error.core.php';
137
-            } else {
138
-                wp_die(esc_html__('The EE_Error core class could not be loaded.', 'event_espresso'));
139
-            }
140
-            $error_handling_loaded = true;
141
-        }
118
+		register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
119
+		/**
120
+		 *    espresso_load_error_handling
121
+		 *    this function loads EE's class for handling exceptions and errors
122
+		 */
123
+		function espresso_load_error_handling()
124
+		{
125
+			static $error_handling_loaded = false;
126
+			if ($error_handling_loaded) {
127
+				return;
128
+			}
129
+			// load debugging tools
130
+			if (WP_DEBUG === true && is_readable(EE_HELPERS . 'EEH_Debug_Tools.helper.php')) {
131
+				require_once   EE_HELPERS . 'EEH_Debug_Tools.helper.php';
132
+				\EEH_Debug_Tools::instance();
133
+			}
134
+			// load error handling
135
+			if (is_readable(EE_CORE . 'EE_Error.core.php')) {
136
+				require_once EE_CORE . 'EE_Error.core.php';
137
+			} else {
138
+				wp_die(esc_html__('The EE_Error core class could not be loaded.', 'event_espresso'));
139
+			}
140
+			$error_handling_loaded = true;
141
+		}
142 142
 
143
-        /**
144
-         *    espresso_load_required
145
-         *    given a class name and path, this function will load that file or throw an exception
146
-         *
147
-         * @param    string $classname
148
-         * @param    string $full_path_to_file
149
-         * @throws    EE_Error
150
-         */
151
-        function espresso_load_required($classname, $full_path_to_file)
152
-        {
153
-            if (is_readable($full_path_to_file)) {
154
-                require_once $full_path_to_file;
155
-            } else {
156
-                throw new \EE_Error (
157
-                    sprintf(
158
-                        esc_html__(
159
-                            'The %s class file could not be located or is not readable due to file permissions.',
160
-                            'event_espresso'
161
-                        ),
162
-                        $classname
163
-                    )
164
-                );
165
-            }
166
-        }
143
+		/**
144
+		 *    espresso_load_required
145
+		 *    given a class name and path, this function will load that file or throw an exception
146
+		 *
147
+		 * @param    string $classname
148
+		 * @param    string $full_path_to_file
149
+		 * @throws    EE_Error
150
+		 */
151
+		function espresso_load_required($classname, $full_path_to_file)
152
+		{
153
+			if (is_readable($full_path_to_file)) {
154
+				require_once $full_path_to_file;
155
+			} else {
156
+				throw new \EE_Error (
157
+					sprintf(
158
+						esc_html__(
159
+							'The %s class file could not be located or is not readable due to file permissions.',
160
+							'event_espresso'
161
+						),
162
+						$classname
163
+					)
164
+				);
165
+			}
166
+		}
167 167
 
168
-        /**
169
-         * @since 4.9.27
170
-         * @throws \EE_Error
171
-         * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
172
-         * @throws \EventEspresso\core\exceptions\InvalidEntityException
173
-         * @throws \EventEspresso\core\exceptions\InvalidIdentifierException
174
-         * @throws \EventEspresso\core\exceptions\InvalidClassException
175
-         * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
176
-         * @throws \EventEspresso\core\services\container\exceptions\ServiceExistsException
177
-         * @throws \EventEspresso\core\services\container\exceptions\ServiceNotFoundException
178
-         * @throws \OutOfBoundsException
179
-         */
180
-        function bootstrap_espresso()
181
-        {
182
-            require_once __DIR__ . '/core/espresso_definitions.php';
183
-            try {
184
-                espresso_load_error_handling();
185
-                espresso_load_required(
186
-                    'EEH_Base',
187
-                    EE_CORE . 'helpers' . DS . 'EEH_Base.helper.php'
188
-                );
189
-                espresso_load_required(
190
-                    'EEH_File',
191
-                    EE_CORE . 'interfaces' . DS . 'EEHI_File.interface.php'
192
-                );
193
-                espresso_load_required(
194
-                    'EEH_File',
195
-                    EE_CORE . 'helpers' . DS . 'EEH_File.helper.php'
196
-                );
197
-                espresso_load_required(
198
-                    'EEH_Array',
199
-                    EE_CORE . 'helpers' . DS . 'EEH_Array.helper.php'
200
-                );
201
-                // instantiate and configure PSR4 autoloader
202
-                espresso_load_required(
203
-                    'Psr4Autoloader',
204
-                    EE_CORE . 'Psr4Autoloader.php'
205
-                );
206
-                espresso_load_required(
207
-                    'EE_Psr4AutoloaderInit',
208
-                    EE_CORE . 'EE_Psr4AutoloaderInit.core.php'
209
-                );
210
-                $AutoloaderInit = new EE_Psr4AutoloaderInit();
211
-                $AutoloaderInit->initializeAutoloader();
212
-                espresso_load_required(
213
-                    'EE_Request',
214
-                    EE_CORE . 'request_stack' . DS . 'EE_Request.core.php'
215
-                );
216
-                espresso_load_required(
217
-                    'EE_Response',
218
-                    EE_CORE . 'request_stack' . DS . 'EE_Response.core.php'
219
-                );
220
-                espresso_load_required(
221
-                    'EE_Bootstrap',
222
-                    EE_CORE . 'EE_Bootstrap.core.php'
223
-                );
224
-                // bootstrap EE and the request stack
225
-                new EE_Bootstrap(
226
-                    new EE_Request($_GET, $_POST, $_COOKIE),
227
-                    new EE_Response()
228
-                );
229
-            } catch (Exception $e) {
230
-                require_once EE_CORE . 'exceptions' . DS . 'ExceptionStackTraceDisplay.php';
231
-                new EventEspresso\core\exceptions\ExceptionStackTraceDisplay($e);
232
-            }
233
-        }
234
-        bootstrap_espresso();
235
-    }
168
+		/**
169
+		 * @since 4.9.27
170
+		 * @throws \EE_Error
171
+		 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
172
+		 * @throws \EventEspresso\core\exceptions\InvalidEntityException
173
+		 * @throws \EventEspresso\core\exceptions\InvalidIdentifierException
174
+		 * @throws \EventEspresso\core\exceptions\InvalidClassException
175
+		 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
176
+		 * @throws \EventEspresso\core\services\container\exceptions\ServiceExistsException
177
+		 * @throws \EventEspresso\core\services\container\exceptions\ServiceNotFoundException
178
+		 * @throws \OutOfBoundsException
179
+		 */
180
+		function bootstrap_espresso()
181
+		{
182
+			require_once __DIR__ . '/core/espresso_definitions.php';
183
+			try {
184
+				espresso_load_error_handling();
185
+				espresso_load_required(
186
+					'EEH_Base',
187
+					EE_CORE . 'helpers' . DS . 'EEH_Base.helper.php'
188
+				);
189
+				espresso_load_required(
190
+					'EEH_File',
191
+					EE_CORE . 'interfaces' . DS . 'EEHI_File.interface.php'
192
+				);
193
+				espresso_load_required(
194
+					'EEH_File',
195
+					EE_CORE . 'helpers' . DS . 'EEH_File.helper.php'
196
+				);
197
+				espresso_load_required(
198
+					'EEH_Array',
199
+					EE_CORE . 'helpers' . DS . 'EEH_Array.helper.php'
200
+				);
201
+				// instantiate and configure PSR4 autoloader
202
+				espresso_load_required(
203
+					'Psr4Autoloader',
204
+					EE_CORE . 'Psr4Autoloader.php'
205
+				);
206
+				espresso_load_required(
207
+					'EE_Psr4AutoloaderInit',
208
+					EE_CORE . 'EE_Psr4AutoloaderInit.core.php'
209
+				);
210
+				$AutoloaderInit = new EE_Psr4AutoloaderInit();
211
+				$AutoloaderInit->initializeAutoloader();
212
+				espresso_load_required(
213
+					'EE_Request',
214
+					EE_CORE . 'request_stack' . DS . 'EE_Request.core.php'
215
+				);
216
+				espresso_load_required(
217
+					'EE_Response',
218
+					EE_CORE . 'request_stack' . DS . 'EE_Response.core.php'
219
+				);
220
+				espresso_load_required(
221
+					'EE_Bootstrap',
222
+					EE_CORE . 'EE_Bootstrap.core.php'
223
+				);
224
+				// bootstrap EE and the request stack
225
+				new EE_Bootstrap(
226
+					new EE_Request($_GET, $_POST, $_COOKIE),
227
+					new EE_Response()
228
+				);
229
+			} catch (Exception $e) {
230
+				require_once EE_CORE . 'exceptions' . DS . 'ExceptionStackTraceDisplay.php';
231
+				new EventEspresso\core\exceptions\ExceptionStackTraceDisplay($e);
232
+			}
233
+		}
234
+		bootstrap_espresso();
235
+	}
236 236
 }
237 237
 if (! function_exists('espresso_deactivate_plugin')) {
238
-    /**
239
-     *    deactivate_plugin
240
-     * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
241
-     *
242
-     * @access public
243
-     * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
244
-     * @return    void
245
-     */
246
-    function espresso_deactivate_plugin($plugin_basename = '')
247
-    {
248
-        if (! function_exists('deactivate_plugins')) {
249
-            require_once ABSPATH . 'wp-admin/includes/plugin.php';
250
-        }
251
-        unset($_GET['activate'], $_REQUEST['activate']);
252
-        deactivate_plugins($plugin_basename);
253
-    }
238
+	/**
239
+	 *    deactivate_plugin
240
+	 * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
241
+	 *
242
+	 * @access public
243
+	 * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
244
+	 * @return    void
245
+	 */
246
+	function espresso_deactivate_plugin($plugin_basename = '')
247
+	{
248
+		if (! function_exists('deactivate_plugins')) {
249
+			require_once ABSPATH . 'wp-admin/includes/plugin.php';
250
+		}
251
+		unset($_GET['activate'], $_REQUEST['activate']);
252
+		deactivate_plugins($plugin_basename);
253
+	}
254 254
 }
Please login to merge, or discard this patch.