Completed
Branch Gutenberg/block-manager (11740c)
by
unknown
66:22 queued 53:17
created
core/libraries/plugin_api/EE_Register_Addon.lib.php 2 patches
Indentation   +1124 added lines, -1124 removed lines patch added patch discarded remove patch
@@ -22,1184 +22,1184 @@
 block discarded – undo
22 22
 class EE_Register_Addon implements EEI_Plugin_API
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                       [Required] the EE_Addon's name.
119
-     * @param  array                  $setup_args                       {
120
-     *                                                                  An array of arguments provided for registering
121
-     *                                                                  the 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
125
-     *                                                                  "EE_Calendar"
126
-     * @type string                   $min_core_version                 the minimum version of EE Core that the
127
-     *                                                                  addon will work with. eg "4.8.1.rc.084"
128
-     * @type string                   $version                          the "software" version for the addon. eg
129
-     *                                                                  "1.0.0.p" for a first stable release, or
130
-     *                                                                  "1.0.0.rc.043" for a version in progress
131
-     * @type string                   $main_file_path                   the full server path to the main file
132
-     *                                                                  loaded directly by WP
133
-     * @type DomainInterface $domain                                    child class of
134
-     *                                                                  EventEspresso\core\domain\DomainBase
135
-     * @type string                   $domain_fqcn                      Fully Qualified Class Name
136
-     *                                                                  for the addon's Domain class
137
-     *                                                                  (see EventEspresso\core\domain\Domain)
138
-     * @type string                   $admin_path                       full server path to the folder where the
139
-     *                                                                  addon\'s admin files reside
140
-     * @type string                   $admin_callback                   a method to be called when the EE Admin is
141
-     *                                                                  first invoked, can be used for hooking into
142
-     *                                                                  any admin page
143
-     * @type string                   $config_section                   the section name for this addon's
144
-     *                                                                  configuration settings section
145
-     *                                                                  (defaults to "addons")
146
-     * @type string                   $config_class                     the class name for this addon's
147
-     *                                                                  configuration settings object
148
-     * @type string                   $config_name                      the class name for this addon's
149
-     *                                                                  configuration settings object
150
-     * @type string                   $autoloader_paths                 [Required] an array of class names and the full
151
-     *                                                                  server paths to those files.
152
-     * @type string                   $autoloader_folders               an array of  "full server paths" for any
153
-     *                                                                  folders containing classes that might be
154
-     *                                                                  invoked by the addon
155
-     * @type string                   $dms_paths                        [Required] an array of full server paths to
156
-     *                                                                  folders that contain data migration scripts.
157
-     *                                                                  The key should be the EE_Addon class name that
158
-     *                                                                  this set of data migration scripts belongs to.
159
-     *                                                                  If the EE_Addon class is namespaced, then this
160
-     *                                                                  needs to be the Fully Qualified Class Name
161
-     * @type string                   $module_paths                     an array of full server paths to any
162
-     *                                                                  EED_Modules used by the addon
163
-     * @type string                   $shortcode_paths                  an array of full server paths to folders
164
-     *                                                                  that contain EES_Shortcodes
165
-     * @type string                   $widget_paths                     an array of full server paths to folders
166
-     *                                                                  that contain WP_Widgets
167
-     * @type string                   $pue_options
168
-     * @type array                    $capabilities                     an array indexed by role name
169
-     *                                                                  (i.e administrator,author ) and the values
170
-     *                                                                  are an array of caps to add to the role.
171
-     *                                                                  'administrator' => array(
172
-     *                                                                  'read_addon',
173
-     *                                                                  'edit_addon',
174
-     *                                                                  etc.
175
-     *                                                                  ).
176
-     * @type EE_Meta_Capability_Map[] $capability_maps                  an array of EE_Meta_Capability_Map object
177
-     *                                                                  for any addons that need to register any
178
-     *                                                                  special meta mapped capabilities.  Should
179
-     *                                                                  be indexed where the key is the
180
-     *                                                                  EE_Meta_Capability_Map class name and the
181
-     *                                                                  values are the arguments sent to the class.
182
-     * @type array                    $model_paths                      array of folders containing DB models
183
-     * @see      EE_Register_Model
184
-     * @type array                    $class_paths                      array of folders containing DB classes
185
-     * @see      EE_Register_Model
186
-     * @type array                    $model_extension_paths            array of folders containing DB model
187
-     *                                                                  extensions
188
-     * @see      EE_Register_Model_Extension
189
-     * @type array                    $class_extension_paths            array of folders containing DB class
190
-     *                                                                  extensions
191
-     * @see      EE_Register_Model_Extension
192
-     * @type array message_types {
193
-     *                                                                  An array of message types with the key as
194
-     *                                                                  the message type name and the values as
195
-     *                                                                  below:
196
-     * @type string                   $mtfilename                       [Required] The filename of the message type
197
-     *                                                                  being registered. This will be the main
198
-     *                                                                  EE_{Message Type Name}_message_type class.
199
-     *                                                                  for example:
200
-     *                                                                  EE_Declined_Registration_message_type.class.php
201
-     * @type array                    $autoloadpaths                    [Required] An array of paths to add to the
202
-     *                                                                  messages autoloader for the new message type.
203
-     * @type array                    $messengers_to_activate_with      An array of messengers that this message
204
-     *                                                                  type should activate with. Each value in
205
-     *                                                                  the
206
-     *                                                                  array
207
-     *                                                                  should match the name property of a
208
-     *                                                                  EE_messenger. Optional.
209
-     * @type array                    $messengers_to_validate_with      An array of messengers that this message
210
-     *                                                                  type should validate with. Each value in
211
-     *                                                                  the
212
-     *                                                                  array
213
-     *                                                                  should match the name property of an
214
-     *                                                                  EE_messenger.
215
-     *                                                                  Optional.
216
-     *                                                                  }
217
-     * @type array                    $custom_post_types
218
-     * @type array                    $custom_taxonomies
219
-     * @type array                    $payment_method_paths             each element is the folder containing the
220
-     *                                                                  EE_PMT_Base child class
221
-     *                                                                  (eg,
222
-     *                                                                  '/wp-content/plugins/my_plugin/Payomatic/'
223
-     *                                                                  which contains the files
224
-     *                                                                  EE_PMT_Payomatic.pm.php)
225
-     * @type array                    $default_terms
226
-     * @type array                    $namespace                        {
227
-     *                                                                  An array with two items for registering the
228
-     *                                                                  addon's namespace. (If, for some reason, you
229
-     *                                                                  require additional namespaces,
230
-     *                                                                  use
231
-     *                                                                  EventEspresso\core\Psr4Autoloader::addNamespace()
232
-     *                                                                  directly)
233
-     * @see      EventEspresso\core\Psr4Autoloader::addNamespace()
234
-     * @type string                   $FQNS                             the namespace prefix
235
-     * @type string                   $DIR                              a base directory for class files in the
236
-     *                                                                  namespace.
237
-     *                                                                  }
238
-     *                                                                  }
239
-     * @type string                   $privacy_policies                 FQNSs (namespaces, each of which contains only
240
-     *                                                                  privacy policy classes) or FQCNs (specific
241
-     *                                                                  classnames of privacy policy classes)
242
-     * @return void
243
-     * @throws DomainException
244
-     * @throws EE_Error
245
-     * @throws InvalidArgumentException
246
-     * @throws ReflectionException
247
-     * @throws InvalidDataTypeException
248
-     * @throws InvalidInterfaceException
249
-     */
250
-    public static function register($addon_name = '', $setup_args = array())
251
-    {
252
-        // required fields MUST be present, so let's make sure they are.
253
-        EE_Register_Addon::_verify_parameters($addon_name, $setup_args);
254
-        // get class name for addon
255
-        $class_name = EE_Register_Addon::_parse_class_name($addon_name, $setup_args);
256
-        // setup $_settings array from incoming values.
257
-        $addon_settings = EE_Register_Addon::_get_addon_settings($class_name, $setup_args);
258
-        // setup PUE
259
-        EE_Register_Addon::_parse_pue_options($addon_name, $class_name, $setup_args);
260
-        // does this addon work with this version of core or WordPress ?
261
-        if (! EE_Register_Addon::_addon_is_compatible($addon_name, $addon_settings)) {
262
-            return;
263
-        }
264
-        // register namespaces
265
-        EE_Register_Addon::_setup_namespaces($addon_settings);
266
-        // check if this is an activation request
267
-        if (EE_Register_Addon::_addon_activation($addon_name, $addon_settings)) {
268
-            // dont bother setting up the rest of the addon atm
269
-            return;
270
-        }
271
-        // we need cars
272
-        EE_Register_Addon::_setup_autoloaders($addon_name);
273
-        // register new models and extensions
274
-        EE_Register_Addon::_register_models_and_extensions($addon_name);
275
-        // setup DMS
276
-        EE_Register_Addon::_register_data_migration_scripts($addon_name);
277
-        // if config_class is present let's register config.
278
-        EE_Register_Addon::_register_config($addon_name);
279
-        // register admin pages
280
-        EE_Register_Addon::_register_admin_pages($addon_name);
281
-        // add to list of modules to be registered
282
-        EE_Register_Addon::_register_modules($addon_name);
283
-        // add to list of shortcodes to be registered
284
-        EE_Register_Addon::_register_shortcodes($addon_name);
285
-        // add to list of widgets to be registered
286
-        EE_Register_Addon::_register_widgets($addon_name);
287
-        // register capability related stuff.
288
-        EE_Register_Addon::_register_capabilities($addon_name);
289
-        // any message type to register?
290
-        EE_Register_Addon::_register_message_types($addon_name);
291
-        // any custom post type/ custom capabilities or default terms to register
292
-        EE_Register_Addon::_register_custom_post_types($addon_name);
293
-        // and any payment methods
294
-        EE_Register_Addon::_register_payment_methods($addon_name);
295
-        // and privacy policy generators
296
-        EE_Register_Addon::registerPrivacyPolicies($addon_name);
297
-        // load and instantiate main addon class
298
-        $addon = EE_Register_Addon::_load_and_init_addon_class($addon_name);
299
-        // delay calling after_registration hook on each addon until after all add-ons have been registered.
300
-        add_action('AHEE__EE_System__load_espresso_addons__complete', array($addon, 'after_registration'), 999);
301
-    }
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                       [Required] the EE_Addon's name.
119
+	 * @param  array                  $setup_args                       {
120
+	 *                                                                  An array of arguments provided for registering
121
+	 *                                                                  the 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
125
+	 *                                                                  "EE_Calendar"
126
+	 * @type string                   $min_core_version                 the minimum version of EE Core that the
127
+	 *                                                                  addon will work with. eg "4.8.1.rc.084"
128
+	 * @type string                   $version                          the "software" version for the addon. eg
129
+	 *                                                                  "1.0.0.p" for a first stable release, or
130
+	 *                                                                  "1.0.0.rc.043" for a version in progress
131
+	 * @type string                   $main_file_path                   the full server path to the main file
132
+	 *                                                                  loaded directly by WP
133
+	 * @type DomainInterface $domain                                    child class of
134
+	 *                                                                  EventEspresso\core\domain\DomainBase
135
+	 * @type string                   $domain_fqcn                      Fully Qualified Class Name
136
+	 *                                                                  for the addon's Domain class
137
+	 *                                                                  (see EventEspresso\core\domain\Domain)
138
+	 * @type string                   $admin_path                       full server path to the folder where the
139
+	 *                                                                  addon\'s admin files reside
140
+	 * @type string                   $admin_callback                   a method to be called when the EE Admin is
141
+	 *                                                                  first invoked, can be used for hooking into
142
+	 *                                                                  any admin page
143
+	 * @type string                   $config_section                   the section name for this addon's
144
+	 *                                                                  configuration settings section
145
+	 *                                                                  (defaults to "addons")
146
+	 * @type string                   $config_class                     the class name for this addon's
147
+	 *                                                                  configuration settings object
148
+	 * @type string                   $config_name                      the class name for this addon's
149
+	 *                                                                  configuration settings object
150
+	 * @type string                   $autoloader_paths                 [Required] an array of class names and the full
151
+	 *                                                                  server paths to those files.
152
+	 * @type string                   $autoloader_folders               an array of  "full server paths" for any
153
+	 *                                                                  folders containing classes that might be
154
+	 *                                                                  invoked by the addon
155
+	 * @type string                   $dms_paths                        [Required] an array of full server paths to
156
+	 *                                                                  folders that contain data migration scripts.
157
+	 *                                                                  The key should be the EE_Addon class name that
158
+	 *                                                                  this set of data migration scripts belongs to.
159
+	 *                                                                  If the EE_Addon class is namespaced, then this
160
+	 *                                                                  needs to be the Fully Qualified Class Name
161
+	 * @type string                   $module_paths                     an array of full server paths to any
162
+	 *                                                                  EED_Modules used by the addon
163
+	 * @type string                   $shortcode_paths                  an array of full server paths to folders
164
+	 *                                                                  that contain EES_Shortcodes
165
+	 * @type string                   $widget_paths                     an array of full server paths to folders
166
+	 *                                                                  that contain WP_Widgets
167
+	 * @type string                   $pue_options
168
+	 * @type array                    $capabilities                     an array indexed by role name
169
+	 *                                                                  (i.e administrator,author ) and the values
170
+	 *                                                                  are an array of caps to add to the role.
171
+	 *                                                                  'administrator' => array(
172
+	 *                                                                  'read_addon',
173
+	 *                                                                  'edit_addon',
174
+	 *                                                                  etc.
175
+	 *                                                                  ).
176
+	 * @type EE_Meta_Capability_Map[] $capability_maps                  an array of EE_Meta_Capability_Map object
177
+	 *                                                                  for any addons that need to register any
178
+	 *                                                                  special meta mapped capabilities.  Should
179
+	 *                                                                  be indexed where the key is the
180
+	 *                                                                  EE_Meta_Capability_Map class name and the
181
+	 *                                                                  values are the arguments sent to the class.
182
+	 * @type array                    $model_paths                      array of folders containing DB models
183
+	 * @see      EE_Register_Model
184
+	 * @type array                    $class_paths                      array of folders containing DB classes
185
+	 * @see      EE_Register_Model
186
+	 * @type array                    $model_extension_paths            array of folders containing DB model
187
+	 *                                                                  extensions
188
+	 * @see      EE_Register_Model_Extension
189
+	 * @type array                    $class_extension_paths            array of folders containing DB class
190
+	 *                                                                  extensions
191
+	 * @see      EE_Register_Model_Extension
192
+	 * @type array message_types {
193
+	 *                                                                  An array of message types with the key as
194
+	 *                                                                  the message type name and the values as
195
+	 *                                                                  below:
196
+	 * @type string                   $mtfilename                       [Required] The filename of the message type
197
+	 *                                                                  being registered. This will be the main
198
+	 *                                                                  EE_{Message Type Name}_message_type class.
199
+	 *                                                                  for example:
200
+	 *                                                                  EE_Declined_Registration_message_type.class.php
201
+	 * @type array                    $autoloadpaths                    [Required] An array of paths to add to the
202
+	 *                                                                  messages autoloader for the new message type.
203
+	 * @type array                    $messengers_to_activate_with      An array of messengers that this message
204
+	 *                                                                  type should activate with. Each value in
205
+	 *                                                                  the
206
+	 *                                                                  array
207
+	 *                                                                  should match the name property of a
208
+	 *                                                                  EE_messenger. Optional.
209
+	 * @type array                    $messengers_to_validate_with      An array of messengers that this message
210
+	 *                                                                  type should validate with. Each value in
211
+	 *                                                                  the
212
+	 *                                                                  array
213
+	 *                                                                  should match the name property of an
214
+	 *                                                                  EE_messenger.
215
+	 *                                                                  Optional.
216
+	 *                                                                  }
217
+	 * @type array                    $custom_post_types
218
+	 * @type array                    $custom_taxonomies
219
+	 * @type array                    $payment_method_paths             each element is the folder containing the
220
+	 *                                                                  EE_PMT_Base child class
221
+	 *                                                                  (eg,
222
+	 *                                                                  '/wp-content/plugins/my_plugin/Payomatic/'
223
+	 *                                                                  which contains the files
224
+	 *                                                                  EE_PMT_Payomatic.pm.php)
225
+	 * @type array                    $default_terms
226
+	 * @type array                    $namespace                        {
227
+	 *                                                                  An array with two items for registering the
228
+	 *                                                                  addon's namespace. (If, for some reason, you
229
+	 *                                                                  require additional namespaces,
230
+	 *                                                                  use
231
+	 *                                                                  EventEspresso\core\Psr4Autoloader::addNamespace()
232
+	 *                                                                  directly)
233
+	 * @see      EventEspresso\core\Psr4Autoloader::addNamespace()
234
+	 * @type string                   $FQNS                             the namespace prefix
235
+	 * @type string                   $DIR                              a base directory for class files in the
236
+	 *                                                                  namespace.
237
+	 *                                                                  }
238
+	 *                                                                  }
239
+	 * @type string                   $privacy_policies                 FQNSs (namespaces, each of which contains only
240
+	 *                                                                  privacy policy classes) or FQCNs (specific
241
+	 *                                                                  classnames of privacy policy classes)
242
+	 * @return void
243
+	 * @throws DomainException
244
+	 * @throws EE_Error
245
+	 * @throws InvalidArgumentException
246
+	 * @throws ReflectionException
247
+	 * @throws InvalidDataTypeException
248
+	 * @throws InvalidInterfaceException
249
+	 */
250
+	public static function register($addon_name = '', $setup_args = array())
251
+	{
252
+		// required fields MUST be present, so let's make sure they are.
253
+		EE_Register_Addon::_verify_parameters($addon_name, $setup_args);
254
+		// get class name for addon
255
+		$class_name = EE_Register_Addon::_parse_class_name($addon_name, $setup_args);
256
+		// setup $_settings array from incoming values.
257
+		$addon_settings = EE_Register_Addon::_get_addon_settings($class_name, $setup_args);
258
+		// setup PUE
259
+		EE_Register_Addon::_parse_pue_options($addon_name, $class_name, $setup_args);
260
+		// does this addon work with this version of core or WordPress ?
261
+		if (! EE_Register_Addon::_addon_is_compatible($addon_name, $addon_settings)) {
262
+			return;
263
+		}
264
+		// register namespaces
265
+		EE_Register_Addon::_setup_namespaces($addon_settings);
266
+		// check if this is an activation request
267
+		if (EE_Register_Addon::_addon_activation($addon_name, $addon_settings)) {
268
+			// dont bother setting up the rest of the addon atm
269
+			return;
270
+		}
271
+		// we need cars
272
+		EE_Register_Addon::_setup_autoloaders($addon_name);
273
+		// register new models and extensions
274
+		EE_Register_Addon::_register_models_and_extensions($addon_name);
275
+		// setup DMS
276
+		EE_Register_Addon::_register_data_migration_scripts($addon_name);
277
+		// if config_class is present let's register config.
278
+		EE_Register_Addon::_register_config($addon_name);
279
+		// register admin pages
280
+		EE_Register_Addon::_register_admin_pages($addon_name);
281
+		// add to list of modules to be registered
282
+		EE_Register_Addon::_register_modules($addon_name);
283
+		// add to list of shortcodes to be registered
284
+		EE_Register_Addon::_register_shortcodes($addon_name);
285
+		// add to list of widgets to be registered
286
+		EE_Register_Addon::_register_widgets($addon_name);
287
+		// register capability related stuff.
288
+		EE_Register_Addon::_register_capabilities($addon_name);
289
+		// any message type to register?
290
+		EE_Register_Addon::_register_message_types($addon_name);
291
+		// any custom post type/ custom capabilities or default terms to register
292
+		EE_Register_Addon::_register_custom_post_types($addon_name);
293
+		// and any payment methods
294
+		EE_Register_Addon::_register_payment_methods($addon_name);
295
+		// and privacy policy generators
296
+		EE_Register_Addon::registerPrivacyPolicies($addon_name);
297
+		// load and instantiate main addon class
298
+		$addon = EE_Register_Addon::_load_and_init_addon_class($addon_name);
299
+		// delay calling after_registration hook on each addon until after all add-ons have been registered.
300
+		add_action('AHEE__EE_System__load_espresso_addons__complete', array($addon, 'after_registration'), 999);
301
+	}
302 302
 
303 303
 
304
-    /**
305
-     * @param string $addon_name
306
-     * @param array  $setup_args
307
-     * @return void
308
-     * @throws EE_Error
309
-     */
310
-    private static function _verify_parameters($addon_name, array $setup_args)
311
-    {
312
-        // required fields MUST be present, so let's make sure they are.
313
-        if (empty($addon_name) || ! is_array($setup_args)) {
314
-            throw new EE_Error(
315
-                __(
316
-                    '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.',
317
-                    'event_espresso'
318
-                )
319
-            );
320
-        }
321
-        if (! isset($setup_args['main_file_path']) || empty($setup_args['main_file_path'])) {
322
-            throw new EE_Error(
323
-                sprintf(
324
-                    __(
325
-                        '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',
326
-                        'event_espresso'
327
-                    ),
328
-                    implode(',', array_keys($setup_args))
329
-                )
330
-            );
331
-        }
332
-        // check that addon has not already been registered with that name
333
-        if (isset(self::$_settings[ $addon_name ]) && ! did_action('activate_plugin')) {
334
-            throw new EE_Error(
335
-                sprintf(
336
-                    __(
337
-                        'An EE_Addon with the name "%s" has already been registered and each EE_Addon requires a unique name.',
338
-                        'event_espresso'
339
-                    ),
340
-                    $addon_name
341
-                )
342
-            );
343
-        }
344
-    }
304
+	/**
305
+	 * @param string $addon_name
306
+	 * @param array  $setup_args
307
+	 * @return void
308
+	 * @throws EE_Error
309
+	 */
310
+	private static function _verify_parameters($addon_name, array $setup_args)
311
+	{
312
+		// required fields MUST be present, so let's make sure they are.
313
+		if (empty($addon_name) || ! is_array($setup_args)) {
314
+			throw new EE_Error(
315
+				__(
316
+					'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.',
317
+					'event_espresso'
318
+				)
319
+			);
320
+		}
321
+		if (! isset($setup_args['main_file_path']) || empty($setup_args['main_file_path'])) {
322
+			throw new EE_Error(
323
+				sprintf(
324
+					__(
325
+						'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',
326
+						'event_espresso'
327
+					),
328
+					implode(',', array_keys($setup_args))
329
+				)
330
+			);
331
+		}
332
+		// check that addon has not already been registered with that name
333
+		if (isset(self::$_settings[ $addon_name ]) && ! did_action('activate_plugin')) {
334
+			throw new EE_Error(
335
+				sprintf(
336
+					__(
337
+						'An EE_Addon with the name "%s" has already been registered and each EE_Addon requires a unique name.',
338
+						'event_espresso'
339
+					),
340
+					$addon_name
341
+				)
342
+			);
343
+		}
344
+	}
345 345
 
346 346
 
347
-    /**
348
-     * @param string $addon_name
349
-     * @param array  $setup_args
350
-     * @return string
351
-     */
352
-    private static function _parse_class_name($addon_name, array $setup_args)
353
-    {
354
-        if (empty($setup_args['class_name'])) {
355
-            // generate one by first separating name with spaces
356
-            $class_name = str_replace(array('-', '_'), ' ', trim($addon_name));
357
-            // capitalize, then replace spaces with underscores
358
-            $class_name = str_replace(' ', '_', ucwords($class_name));
359
-        } else {
360
-            $class_name = $setup_args['class_name'];
361
-        }
362
-        // check if classname is fully  qualified or is a legacy classname already prefixed with 'EE_'
363
-        return strpos($class_name, '\\') || strpos($class_name, 'EE_') === 0
364
-            ? $class_name
365
-            : 'EE_' . $class_name;
366
-    }
347
+	/**
348
+	 * @param string $addon_name
349
+	 * @param array  $setup_args
350
+	 * @return string
351
+	 */
352
+	private static function _parse_class_name($addon_name, array $setup_args)
353
+	{
354
+		if (empty($setup_args['class_name'])) {
355
+			// generate one by first separating name with spaces
356
+			$class_name = str_replace(array('-', '_'), ' ', trim($addon_name));
357
+			// capitalize, then replace spaces with underscores
358
+			$class_name = str_replace(' ', '_', ucwords($class_name));
359
+		} else {
360
+			$class_name = $setup_args['class_name'];
361
+		}
362
+		// check if classname is fully  qualified or is a legacy classname already prefixed with 'EE_'
363
+		return strpos($class_name, '\\') || strpos($class_name, 'EE_') === 0
364
+			? $class_name
365
+			: 'EE_' . $class_name;
366
+	}
367 367
 
368 368
 
369
-    /**
370
-     * @param string $class_name
371
-     * @param array  $setup_args
372
-     * @return array
373
-     */
374
-    private static function _get_addon_settings($class_name, array $setup_args)
375
-    {
376
-        // setup $_settings array from incoming values.
377
-        $addon_settings = array(
378
-            // generated from the addon name, changes something like "calendar" to "EE_Calendar"
379
-            'class_name'            => $class_name,
380
-            // the addon slug for use in URLs, etc
381
-            'plugin_slug'           => isset($setup_args['plugin_slug'])
382
-                ? (string) $setup_args['plugin_slug']
383
-                : '',
384
-            // page slug to be used when generating the "Settings" link on the WP plugin page
385
-            'plugin_action_slug'    => isset($setup_args['plugin_action_slug'])
386
-                ? (string) $setup_args['plugin_action_slug']
387
-                : '',
388
-            // the "software" version for the addon
389
-            'version'               => isset($setup_args['version'])
390
-                ? (string) $setup_args['version']
391
-                : '',
392
-            // the minimum version of EE Core that the addon will work with
393
-            'min_core_version'      => isset($setup_args['min_core_version'])
394
-                ? (string) $setup_args['min_core_version']
395
-                : '',
396
-            // the minimum version of WordPress that the addon will work with
397
-            'min_wp_version'        => isset($setup_args['min_wp_version'])
398
-                ? (string) $setup_args['min_wp_version']
399
-                : EE_MIN_WP_VER_REQUIRED,
400
-            // full server path to main file (file loaded directly by WP)
401
-            'main_file_path'        => isset($setup_args['main_file_path'])
402
-                ? (string) $setup_args['main_file_path']
403
-                : '',
404
-            // instance of \EventEspresso\core\domain\DomainInterface
405
-            'domain'                => isset($setup_args['domain']) && $setup_args['domain'] instanceof DomainInterface
406
-                ? $setup_args['domain']
407
-                : null,
408
-            // Fully Qualified Class Name for the addon's Domain class
409
-            'domain_fqcn'           => isset($setup_args['domain_fqcn'])
410
-                ? (string) $setup_args['domain_fqcn']
411
-                : '',
412
-            // path to folder containing files for integrating with the EE core admin and/or setting up EE admin pages
413
-            'admin_path'            => isset($setup_args['admin_path'])
414
-                ? (string) $setup_args['admin_path'] : '',
415
-            // a method to be called when the EE Admin is first invoked, can be used for hooking into any admin page
416
-            'admin_callback'        => isset($setup_args['admin_callback'])
417
-                ? (string) $setup_args['admin_callback']
418
-                : '',
419
-            // the section name for this addon's configuration settings section (defaults to "addons")
420
-            'config_section'        => isset($setup_args['config_section'])
421
-                ? (string) $setup_args['config_section']
422
-                : 'addons',
423
-            // the class name for this addon's configuration settings object
424
-            'config_class'          => isset($setup_args['config_class'])
425
-                ? (string) $setup_args['config_class'] : '',
426
-            // the name given to the config for this addons' configuration settings object (optional)
427
-            'config_name'           => isset($setup_args['config_name'])
428
-                ? (string) $setup_args['config_name'] : '',
429
-            // an array of "class names" => "full server paths" for any classes that might be invoked by the addon
430
-            'autoloader_paths'      => isset($setup_args['autoloader_paths'])
431
-                ? (array) $setup_args['autoloader_paths']
432
-                : array(),
433
-            // an array of  "full server paths" for any folders containing classes that might be invoked by the addon
434
-            'autoloader_folders'    => isset($setup_args['autoloader_folders'])
435
-                ? (array) $setup_args['autoloader_folders']
436
-                : array(),
437
-            // array of full server paths to any EE_DMS data migration scripts used by the addon.
438
-            // The key should be the EE_Addon class name that this set of data migration scripts belongs to.
439
-            // If the EE_Addon class is namespaced, then this needs to be the Fully Qualified Class Name
440
-            'dms_paths'             => isset($setup_args['dms_paths'])
441
-                ? (array) $setup_args['dms_paths']
442
-                : array(),
443
-            // array of full server paths to any EED_Modules used by the addon
444
-            'module_paths'          => isset($setup_args['module_paths'])
445
-                ? (array) $setup_args['module_paths']
446
-                : array(),
447
-            // array of full server paths to any EES_Shortcodes used by the addon
448
-            'shortcode_paths'       => isset($setup_args['shortcode_paths'])
449
-                ? (array) $setup_args['shortcode_paths']
450
-                : array(),
451
-            'shortcode_fqcns'       => isset($setup_args['shortcode_fqcns'])
452
-                ? (array) $setup_args['shortcode_fqcns']
453
-                : array(),
454
-            // array of full server paths to any WP_Widgets used by the addon
455
-            'widget_paths'          => isset($setup_args['widget_paths'])
456
-                ? (array) $setup_args['widget_paths']
457
-                : array(),
458
-            // array of PUE options used by the addon
459
-            'pue_options'           => isset($setup_args['pue_options'])
460
-                ? (array) $setup_args['pue_options']
461
-                : array(),
462
-            'message_types'         => isset($setup_args['message_types'])
463
-                ? (array) $setup_args['message_types']
464
-                : array(),
465
-            'capabilities'          => isset($setup_args['capabilities'])
466
-                ? (array) $setup_args['capabilities']
467
-                : array(),
468
-            'capability_maps'       => isset($setup_args['capability_maps'])
469
-                ? (array) $setup_args['capability_maps']
470
-                : array(),
471
-            'model_paths'           => isset($setup_args['model_paths'])
472
-                ? (array) $setup_args['model_paths']
473
-                : array(),
474
-            'class_paths'           => isset($setup_args['class_paths'])
475
-                ? (array) $setup_args['class_paths']
476
-                : array(),
477
-            'model_extension_paths' => isset($setup_args['model_extension_paths'])
478
-                ? (array) $setup_args['model_extension_paths']
479
-                : array(),
480
-            'class_extension_paths' => isset($setup_args['class_extension_paths'])
481
-                ? (array) $setup_args['class_extension_paths']
482
-                : array(),
483
-            'custom_post_types'     => isset($setup_args['custom_post_types'])
484
-                ? (array) $setup_args['custom_post_types']
485
-                : array(),
486
-            'custom_taxonomies'     => isset($setup_args['custom_taxonomies'])
487
-                ? (array) $setup_args['custom_taxonomies']
488
-                : array(),
489
-            'payment_method_paths'  => isset($setup_args['payment_method_paths'])
490
-                ? (array) $setup_args['payment_method_paths']
491
-                : array(),
492
-            'default_terms'         => isset($setup_args['default_terms'])
493
-                ? (array) $setup_args['default_terms']
494
-                : array(),
495
-            // if not empty, inserts a new table row after this plugin's row on the WP Plugins page
496
-            // that can be used for adding upgrading/marketing info
497
-            'plugins_page_row'      => isset($setup_args['plugins_page_row'])
498
-                ? $setup_args['plugins_page_row']
499
-                : '',
500
-            'namespace'             => isset(
501
-                $setup_args['namespace']['FQNS'],
502
-                $setup_args['namespace']['DIR']
503
-            )
504
-                ? (array) $setup_args['namespace']
505
-                : array(),
506
-            'privacy_policies'      => isset($setup_args['privacy_policies'])
507
-                ? (array) $setup_args['privacy_policies']
508
-                : '',
509
-        );
510
-        // if plugin_action_slug is NOT set, but an admin page path IS set,
511
-        // then let's just use the plugin_slug since that will be used for linking to the admin page
512
-        $addon_settings['plugin_action_slug'] = empty($addon_settings['plugin_action_slug'])
513
-                                                && ! empty($addon_settings['admin_path'])
514
-            ? $addon_settings['plugin_slug']
515
-            : $addon_settings['plugin_action_slug'];
516
-        // full server path to main file (file loaded directly by WP)
517
-        $addon_settings['plugin_basename'] = plugin_basename($addon_settings['main_file_path']);
518
-        return $addon_settings;
519
-    }
369
+	/**
370
+	 * @param string $class_name
371
+	 * @param array  $setup_args
372
+	 * @return array
373
+	 */
374
+	private static function _get_addon_settings($class_name, array $setup_args)
375
+	{
376
+		// setup $_settings array from incoming values.
377
+		$addon_settings = array(
378
+			// generated from the addon name, changes something like "calendar" to "EE_Calendar"
379
+			'class_name'            => $class_name,
380
+			// the addon slug for use in URLs, etc
381
+			'plugin_slug'           => isset($setup_args['plugin_slug'])
382
+				? (string) $setup_args['plugin_slug']
383
+				: '',
384
+			// page slug to be used when generating the "Settings" link on the WP plugin page
385
+			'plugin_action_slug'    => isset($setup_args['plugin_action_slug'])
386
+				? (string) $setup_args['plugin_action_slug']
387
+				: '',
388
+			// the "software" version for the addon
389
+			'version'               => isset($setup_args['version'])
390
+				? (string) $setup_args['version']
391
+				: '',
392
+			// the minimum version of EE Core that the addon will work with
393
+			'min_core_version'      => isset($setup_args['min_core_version'])
394
+				? (string) $setup_args['min_core_version']
395
+				: '',
396
+			// the minimum version of WordPress that the addon will work with
397
+			'min_wp_version'        => isset($setup_args['min_wp_version'])
398
+				? (string) $setup_args['min_wp_version']
399
+				: EE_MIN_WP_VER_REQUIRED,
400
+			// full server path to main file (file loaded directly by WP)
401
+			'main_file_path'        => isset($setup_args['main_file_path'])
402
+				? (string) $setup_args['main_file_path']
403
+				: '',
404
+			// instance of \EventEspresso\core\domain\DomainInterface
405
+			'domain'                => isset($setup_args['domain']) && $setup_args['domain'] instanceof DomainInterface
406
+				? $setup_args['domain']
407
+				: null,
408
+			// Fully Qualified Class Name for the addon's Domain class
409
+			'domain_fqcn'           => isset($setup_args['domain_fqcn'])
410
+				? (string) $setup_args['domain_fqcn']
411
+				: '',
412
+			// path to folder containing files for integrating with the EE core admin and/or setting up EE admin pages
413
+			'admin_path'            => isset($setup_args['admin_path'])
414
+				? (string) $setup_args['admin_path'] : '',
415
+			// a method to be called when the EE Admin is first invoked, can be used for hooking into any admin page
416
+			'admin_callback'        => isset($setup_args['admin_callback'])
417
+				? (string) $setup_args['admin_callback']
418
+				: '',
419
+			// the section name for this addon's configuration settings section (defaults to "addons")
420
+			'config_section'        => isset($setup_args['config_section'])
421
+				? (string) $setup_args['config_section']
422
+				: 'addons',
423
+			// the class name for this addon's configuration settings object
424
+			'config_class'          => isset($setup_args['config_class'])
425
+				? (string) $setup_args['config_class'] : '',
426
+			// the name given to the config for this addons' configuration settings object (optional)
427
+			'config_name'           => isset($setup_args['config_name'])
428
+				? (string) $setup_args['config_name'] : '',
429
+			// an array of "class names" => "full server paths" for any classes that might be invoked by the addon
430
+			'autoloader_paths'      => isset($setup_args['autoloader_paths'])
431
+				? (array) $setup_args['autoloader_paths']
432
+				: array(),
433
+			// an array of  "full server paths" for any folders containing classes that might be invoked by the addon
434
+			'autoloader_folders'    => isset($setup_args['autoloader_folders'])
435
+				? (array) $setup_args['autoloader_folders']
436
+				: array(),
437
+			// array of full server paths to any EE_DMS data migration scripts used by the addon.
438
+			// The key should be the EE_Addon class name that this set of data migration scripts belongs to.
439
+			// If the EE_Addon class is namespaced, then this needs to be the Fully Qualified Class Name
440
+			'dms_paths'             => isset($setup_args['dms_paths'])
441
+				? (array) $setup_args['dms_paths']
442
+				: array(),
443
+			// array of full server paths to any EED_Modules used by the addon
444
+			'module_paths'          => isset($setup_args['module_paths'])
445
+				? (array) $setup_args['module_paths']
446
+				: array(),
447
+			// array of full server paths to any EES_Shortcodes used by the addon
448
+			'shortcode_paths'       => isset($setup_args['shortcode_paths'])
449
+				? (array) $setup_args['shortcode_paths']
450
+				: array(),
451
+			'shortcode_fqcns'       => isset($setup_args['shortcode_fqcns'])
452
+				? (array) $setup_args['shortcode_fqcns']
453
+				: array(),
454
+			// array of full server paths to any WP_Widgets used by the addon
455
+			'widget_paths'          => isset($setup_args['widget_paths'])
456
+				? (array) $setup_args['widget_paths']
457
+				: array(),
458
+			// array of PUE options used by the addon
459
+			'pue_options'           => isset($setup_args['pue_options'])
460
+				? (array) $setup_args['pue_options']
461
+				: array(),
462
+			'message_types'         => isset($setup_args['message_types'])
463
+				? (array) $setup_args['message_types']
464
+				: array(),
465
+			'capabilities'          => isset($setup_args['capabilities'])
466
+				? (array) $setup_args['capabilities']
467
+				: array(),
468
+			'capability_maps'       => isset($setup_args['capability_maps'])
469
+				? (array) $setup_args['capability_maps']
470
+				: array(),
471
+			'model_paths'           => isset($setup_args['model_paths'])
472
+				? (array) $setup_args['model_paths']
473
+				: array(),
474
+			'class_paths'           => isset($setup_args['class_paths'])
475
+				? (array) $setup_args['class_paths']
476
+				: array(),
477
+			'model_extension_paths' => isset($setup_args['model_extension_paths'])
478
+				? (array) $setup_args['model_extension_paths']
479
+				: array(),
480
+			'class_extension_paths' => isset($setup_args['class_extension_paths'])
481
+				? (array) $setup_args['class_extension_paths']
482
+				: array(),
483
+			'custom_post_types'     => isset($setup_args['custom_post_types'])
484
+				? (array) $setup_args['custom_post_types']
485
+				: array(),
486
+			'custom_taxonomies'     => isset($setup_args['custom_taxonomies'])
487
+				? (array) $setup_args['custom_taxonomies']
488
+				: array(),
489
+			'payment_method_paths'  => isset($setup_args['payment_method_paths'])
490
+				? (array) $setup_args['payment_method_paths']
491
+				: array(),
492
+			'default_terms'         => isset($setup_args['default_terms'])
493
+				? (array) $setup_args['default_terms']
494
+				: array(),
495
+			// if not empty, inserts a new table row after this plugin's row on the WP Plugins page
496
+			// that can be used for adding upgrading/marketing info
497
+			'plugins_page_row'      => isset($setup_args['plugins_page_row'])
498
+				? $setup_args['plugins_page_row']
499
+				: '',
500
+			'namespace'             => isset(
501
+				$setup_args['namespace']['FQNS'],
502
+				$setup_args['namespace']['DIR']
503
+			)
504
+				? (array) $setup_args['namespace']
505
+				: array(),
506
+			'privacy_policies'      => isset($setup_args['privacy_policies'])
507
+				? (array) $setup_args['privacy_policies']
508
+				: '',
509
+		);
510
+		// if plugin_action_slug is NOT set, but an admin page path IS set,
511
+		// then let's just use the plugin_slug since that will be used for linking to the admin page
512
+		$addon_settings['plugin_action_slug'] = empty($addon_settings['plugin_action_slug'])
513
+												&& ! empty($addon_settings['admin_path'])
514
+			? $addon_settings['plugin_slug']
515
+			: $addon_settings['plugin_action_slug'];
516
+		// full server path to main file (file loaded directly by WP)
517
+		$addon_settings['plugin_basename'] = plugin_basename($addon_settings['main_file_path']);
518
+		return $addon_settings;
519
+	}
520 520
 
521 521
 
522
-    /**
523
-     * @param string $addon_name
524
-     * @param array  $addon_settings
525
-     * @return boolean
526
-     */
527
-    private static function _addon_is_compatible($addon_name, array $addon_settings)
528
-    {
529
-        global $wp_version;
530
-        $incompatibility_message = '';
531
-        // check whether this addon version is compatible with EE core
532
-        if (isset(EE_Register_Addon::$_incompatible_addons[ $addon_name ])
533
-            && ! self::_meets_min_core_version_requirement(
534
-                EE_Register_Addon::$_incompatible_addons[ $addon_name ],
535
-                $addon_settings['version']
536
-            )
537
-        ) {
538
-            $incompatibility_message = sprintf(
539
-                __(
540
-                    '%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.',
541
-                    'event_espresso'
542
-                ),
543
-                $addon_name,
544
-                '<br />',
545
-                EE_Register_Addon::$_incompatible_addons[ $addon_name ],
546
-                '<span style="font-weight: bold; color: #D54E21;">',
547
-                '</span><br />'
548
-            );
549
-        } elseif (! self::_meets_min_core_version_requirement($addon_settings['min_core_version'], espresso_version())
550
-        ) {
551
-            $incompatibility_message = sprintf(
552
-                __(
553
-                    '%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".',
554
-                    'event_espresso'
555
-                ),
556
-                $addon_name,
557
-                self::_effective_version($addon_settings['min_core_version']),
558
-                self::_effective_version(espresso_version()),
559
-                '<br />',
560
-                '<span style="font-weight: bold; color: #D54E21;">',
561
-                '</span><br />'
562
-            );
563
-        } elseif (version_compare($wp_version, $addon_settings['min_wp_version'], '<')) {
564
-            $incompatibility_message = sprintf(
565
-                __(
566
-                    '%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.',
567
-                    'event_espresso'
568
-                ),
569
-                $addon_name,
570
-                $addon_settings['min_wp_version'],
571
-                '<br />',
572
-                '<span style="font-weight: bold; color: #D54E21;">',
573
-                '</span><br />'
574
-            );
575
-        }
576
-        if (! empty($incompatibility_message)) {
577
-            // remove 'activate' from the REQUEST
578
-            // so WP doesn't erroneously tell the user the plugin activated fine when it didn't
579
-            unset($_GET['activate'], $_REQUEST['activate']);
580
-            if (current_user_can('activate_plugins')) {
581
-                // show an error message indicating the plugin didn't activate properly
582
-                EE_Error::add_error($incompatibility_message, __FILE__, __FUNCTION__, __LINE__);
583
-            }
584
-            // BAIL FROM THE ADDON REGISTRATION PROCESS
585
-            return false;
586
-        }
587
-        // addon IS compatible
588
-        return true;
589
-    }
522
+	/**
523
+	 * @param string $addon_name
524
+	 * @param array  $addon_settings
525
+	 * @return boolean
526
+	 */
527
+	private static function _addon_is_compatible($addon_name, array $addon_settings)
528
+	{
529
+		global $wp_version;
530
+		$incompatibility_message = '';
531
+		// check whether this addon version is compatible with EE core
532
+		if (isset(EE_Register_Addon::$_incompatible_addons[ $addon_name ])
533
+			&& ! self::_meets_min_core_version_requirement(
534
+				EE_Register_Addon::$_incompatible_addons[ $addon_name ],
535
+				$addon_settings['version']
536
+			)
537
+		) {
538
+			$incompatibility_message = sprintf(
539
+				__(
540
+					'%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.',
541
+					'event_espresso'
542
+				),
543
+				$addon_name,
544
+				'<br />',
545
+				EE_Register_Addon::$_incompatible_addons[ $addon_name ],
546
+				'<span style="font-weight: bold; color: #D54E21;">',
547
+				'</span><br />'
548
+			);
549
+		} elseif (! self::_meets_min_core_version_requirement($addon_settings['min_core_version'], espresso_version())
550
+		) {
551
+			$incompatibility_message = sprintf(
552
+				__(
553
+					'%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".',
554
+					'event_espresso'
555
+				),
556
+				$addon_name,
557
+				self::_effective_version($addon_settings['min_core_version']),
558
+				self::_effective_version(espresso_version()),
559
+				'<br />',
560
+				'<span style="font-weight: bold; color: #D54E21;">',
561
+				'</span><br />'
562
+			);
563
+		} elseif (version_compare($wp_version, $addon_settings['min_wp_version'], '<')) {
564
+			$incompatibility_message = sprintf(
565
+				__(
566
+					'%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.',
567
+					'event_espresso'
568
+				),
569
+				$addon_name,
570
+				$addon_settings['min_wp_version'],
571
+				'<br />',
572
+				'<span style="font-weight: bold; color: #D54E21;">',
573
+				'</span><br />'
574
+			);
575
+		}
576
+		if (! empty($incompatibility_message)) {
577
+			// remove 'activate' from the REQUEST
578
+			// so WP doesn't erroneously tell the user the plugin activated fine when it didn't
579
+			unset($_GET['activate'], $_REQUEST['activate']);
580
+			if (current_user_can('activate_plugins')) {
581
+				// show an error message indicating the plugin didn't activate properly
582
+				EE_Error::add_error($incompatibility_message, __FILE__, __FUNCTION__, __LINE__);
583
+			}
584
+			// BAIL FROM THE ADDON REGISTRATION PROCESS
585
+			return false;
586
+		}
587
+		// addon IS compatible
588
+		return true;
589
+	}
590 590
 
591 591
 
592
-    /**
593
-     * if plugin update engine is being used for auto-updates,
594
-     * then let's set that up now before going any further so that ALL addons can be updated
595
-     * (not needed if PUE is not being used)
596
-     *
597
-     * @param string $addon_name
598
-     * @param string $class_name
599
-     * @param array  $setup_args
600
-     * @return void
601
-     */
602
-    private static function _parse_pue_options($addon_name, $class_name, array $setup_args)
603
-    {
604
-        if (! empty($setup_args['pue_options'])) {
605
-            self::$_settings[ $addon_name ]['pue_options'] = array(
606
-                'pue_plugin_slug' => isset($setup_args['pue_options']['pue_plugin_slug'])
607
-                    ? (string) $setup_args['pue_options']['pue_plugin_slug']
608
-                    : 'espresso_' . strtolower($class_name),
609
-                'plugin_basename' => isset($setup_args['pue_options']['plugin_basename'])
610
-                    ? (string) $setup_args['pue_options']['plugin_basename']
611
-                    : plugin_basename($setup_args['main_file_path']),
612
-                'checkPeriod'     => isset($setup_args['pue_options']['checkPeriod'])
613
-                    ? (string) $setup_args['pue_options']['checkPeriod']
614
-                    : '24',
615
-                'use_wp_update'   => isset($setup_args['pue_options']['use_wp_update'])
616
-                    ? (string) $setup_args['pue_options']['use_wp_update']
617
-                    : false,
618
-            );
619
-            add_action(
620
-                'AHEE__EE_System__brew_espresso__after_pue_init',
621
-                array('EE_Register_Addon', 'load_pue_update')
622
-            );
623
-        }
624
-    }
592
+	/**
593
+	 * if plugin update engine is being used for auto-updates,
594
+	 * then let's set that up now before going any further so that ALL addons can be updated
595
+	 * (not needed if PUE is not being used)
596
+	 *
597
+	 * @param string $addon_name
598
+	 * @param string $class_name
599
+	 * @param array  $setup_args
600
+	 * @return void
601
+	 */
602
+	private static function _parse_pue_options($addon_name, $class_name, array $setup_args)
603
+	{
604
+		if (! empty($setup_args['pue_options'])) {
605
+			self::$_settings[ $addon_name ]['pue_options'] = array(
606
+				'pue_plugin_slug' => isset($setup_args['pue_options']['pue_plugin_slug'])
607
+					? (string) $setup_args['pue_options']['pue_plugin_slug']
608
+					: 'espresso_' . strtolower($class_name),
609
+				'plugin_basename' => isset($setup_args['pue_options']['plugin_basename'])
610
+					? (string) $setup_args['pue_options']['plugin_basename']
611
+					: plugin_basename($setup_args['main_file_path']),
612
+				'checkPeriod'     => isset($setup_args['pue_options']['checkPeriod'])
613
+					? (string) $setup_args['pue_options']['checkPeriod']
614
+					: '24',
615
+				'use_wp_update'   => isset($setup_args['pue_options']['use_wp_update'])
616
+					? (string) $setup_args['pue_options']['use_wp_update']
617
+					: false,
618
+			);
619
+			add_action(
620
+				'AHEE__EE_System__brew_espresso__after_pue_init',
621
+				array('EE_Register_Addon', 'load_pue_update')
622
+			);
623
+		}
624
+	}
625 625
 
626 626
 
627
-    /**
628
-     * register namespaces right away before any other files or classes get loaded, but AFTER the version checks
629
-     *
630
-     * @param array $addon_settings
631
-     * @return void
632
-     */
633
-    private static function _setup_namespaces(array $addon_settings)
634
-    {
635
-        //
636
-        if (isset(
637
-            $addon_settings['namespace']['FQNS'],
638
-            $addon_settings['namespace']['DIR']
639
-        )) {
640
-            EE_Psr4AutoloaderInit::psr4_loader()->addNamespace(
641
-                $addon_settings['namespace']['FQNS'],
642
-                $addon_settings['namespace']['DIR']
643
-            );
644
-        }
645
-    }
627
+	/**
628
+	 * register namespaces right away before any other files or classes get loaded, but AFTER the version checks
629
+	 *
630
+	 * @param array $addon_settings
631
+	 * @return void
632
+	 */
633
+	private static function _setup_namespaces(array $addon_settings)
634
+	{
635
+		//
636
+		if (isset(
637
+			$addon_settings['namespace']['FQNS'],
638
+			$addon_settings['namespace']['DIR']
639
+		)) {
640
+			EE_Psr4AutoloaderInit::psr4_loader()->addNamespace(
641
+				$addon_settings['namespace']['FQNS'],
642
+				$addon_settings['namespace']['DIR']
643
+			);
644
+		}
645
+	}
646 646
 
647 647
 
648
-    /**
649
-     * @param string $addon_name
650
-     * @param array  $addon_settings
651
-     * @return bool
652
-     * @throws EE_Error
653
-     * @throws InvalidArgumentException
654
-     * @throws ReflectionException
655
-     * @throws InvalidDataTypeException
656
-     * @throws InvalidInterfaceException
657
-     */
658
-    private static function _addon_activation($addon_name, array $addon_settings)
659
-    {
660
-        // this is an activation request
661
-        if (did_action(
662
-            'activate_plugin'
663
-        )) {// to find if THIS is the addon that was activated, just check if we have already registered it or not
664
-            // (as the newly-activated addon wasn't around the first time addons were registered).
665
-            // Note: the presence of pue_options in the addon registration options will initialize the $_settings
666
-            // property for the add-on, but the add-on is only partially initialized.  Hence, the additional check.
667
-            if (! isset(self::$_settings[ $addon_name ])
668
-                || (isset(self::$_settings[ $addon_name ])
669
-                    && ! isset(self::$_settings[ $addon_name ]['class_name'])
670
-                )
671
-            ) {
672
-                self::$_settings[ $addon_name ] = $addon_settings;
673
-                $addon = self::_load_and_init_addon_class($addon_name);
674
-                $addon->set_activation_indicator_option();
675
-                // dont bother setting up the rest of the addon.
676
-                // we know it was just activated and the request will end soon
677
-            }
678
-            return true;
679
-        }
680
-        // make sure this was called in the right place!
681
-        if (! did_action('AHEE__EE_System__load_espresso_addons')
682
-            || did_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin')
683
-        ) {
684
-            EE_Error::doing_it_wrong(
685
-                __METHOD__,
686
-                sprintf(
687
-                    __(
688
-                        '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.',
689
-                        'event_espresso'
690
-                    ),
691
-                    $addon_name
692
-                ),
693
-                '4.3.0'
694
-            );
695
-        }
696
-        // make sure addon settings are set correctly without overwriting anything existing
697
-        if (isset(self::$_settings[ $addon_name ])) {
698
-            self::$_settings[ $addon_name ] += $addon_settings;
699
-        } else {
700
-            self::$_settings[ $addon_name ] = $addon_settings;
701
-        }
702
-        return false;
703
-    }
648
+	/**
649
+	 * @param string $addon_name
650
+	 * @param array  $addon_settings
651
+	 * @return bool
652
+	 * @throws EE_Error
653
+	 * @throws InvalidArgumentException
654
+	 * @throws ReflectionException
655
+	 * @throws InvalidDataTypeException
656
+	 * @throws InvalidInterfaceException
657
+	 */
658
+	private static function _addon_activation($addon_name, array $addon_settings)
659
+	{
660
+		// this is an activation request
661
+		if (did_action(
662
+			'activate_plugin'
663
+		)) {// to find if THIS is the addon that was activated, just check if we have already registered it or not
664
+			// (as the newly-activated addon wasn't around the first time addons were registered).
665
+			// Note: the presence of pue_options in the addon registration options will initialize the $_settings
666
+			// property for the add-on, but the add-on is only partially initialized.  Hence, the additional check.
667
+			if (! isset(self::$_settings[ $addon_name ])
668
+				|| (isset(self::$_settings[ $addon_name ])
669
+					&& ! isset(self::$_settings[ $addon_name ]['class_name'])
670
+				)
671
+			) {
672
+				self::$_settings[ $addon_name ] = $addon_settings;
673
+				$addon = self::_load_and_init_addon_class($addon_name);
674
+				$addon->set_activation_indicator_option();
675
+				// dont bother setting up the rest of the addon.
676
+				// we know it was just activated and the request will end soon
677
+			}
678
+			return true;
679
+		}
680
+		// make sure this was called in the right place!
681
+		if (! did_action('AHEE__EE_System__load_espresso_addons')
682
+			|| did_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin')
683
+		) {
684
+			EE_Error::doing_it_wrong(
685
+				__METHOD__,
686
+				sprintf(
687
+					__(
688
+						'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.',
689
+						'event_espresso'
690
+					),
691
+					$addon_name
692
+				),
693
+				'4.3.0'
694
+			);
695
+		}
696
+		// make sure addon settings are set correctly without overwriting anything existing
697
+		if (isset(self::$_settings[ $addon_name ])) {
698
+			self::$_settings[ $addon_name ] += $addon_settings;
699
+		} else {
700
+			self::$_settings[ $addon_name ] = $addon_settings;
701
+		}
702
+		return false;
703
+	}
704 704
 
705 705
 
706
-    /**
707
-     * @param string $addon_name
708
-     * @return void
709
-     * @throws EE_Error
710
-     */
711
-    private static function _setup_autoloaders($addon_name)
712
-    {
713
-        if (! empty(self::$_settings[ $addon_name ]['autoloader_paths'])) {
714
-            // setup autoloader for single file
715
-            EEH_Autoloader::instance()->register_autoloader(self::$_settings[ $addon_name ]['autoloader_paths']);
716
-        }
717
-        // setup autoloaders for folders
718
-        if (! empty(self::$_settings[ $addon_name ]['autoloader_folders'])) {
719
-            foreach ((array) self::$_settings[ $addon_name ]['autoloader_folders'] as $autoloader_folder) {
720
-                EEH_Autoloader::register_autoloaders_for_each_file_in_folder($autoloader_folder);
721
-            }
722
-        }
723
-    }
706
+	/**
707
+	 * @param string $addon_name
708
+	 * @return void
709
+	 * @throws EE_Error
710
+	 */
711
+	private static function _setup_autoloaders($addon_name)
712
+	{
713
+		if (! empty(self::$_settings[ $addon_name ]['autoloader_paths'])) {
714
+			// setup autoloader for single file
715
+			EEH_Autoloader::instance()->register_autoloader(self::$_settings[ $addon_name ]['autoloader_paths']);
716
+		}
717
+		// setup autoloaders for folders
718
+		if (! empty(self::$_settings[ $addon_name ]['autoloader_folders'])) {
719
+			foreach ((array) self::$_settings[ $addon_name ]['autoloader_folders'] as $autoloader_folder) {
720
+				EEH_Autoloader::register_autoloaders_for_each_file_in_folder($autoloader_folder);
721
+			}
722
+		}
723
+	}
724 724
 
725 725
 
726
-    /**
727
-     * register new models and extensions
728
-     *
729
-     * @param string $addon_name
730
-     * @return void
731
-     * @throws EE_Error
732
-     */
733
-    private static function _register_models_and_extensions($addon_name)
734
-    {
735
-        // register new models
736
-        if (! empty(self::$_settings[ $addon_name ]['model_paths'])
737
-            || ! empty(self::$_settings[ $addon_name ]['class_paths'])
738
-        ) {
739
-            EE_Register_Model::register(
740
-                $addon_name,
741
-                array(
742
-                    'model_paths' => self::$_settings[ $addon_name ]['model_paths'],
743
-                    'class_paths' => self::$_settings[ $addon_name ]['class_paths'],
744
-                )
745
-            );
746
-        }
747
-        // register model extensions
748
-        if (! empty(self::$_settings[ $addon_name ]['model_extension_paths'])
749
-            || ! empty(self::$_settings[ $addon_name ]['class_extension_paths'])
750
-        ) {
751
-            EE_Register_Model_Extensions::register(
752
-                $addon_name,
753
-                array(
754
-                    'model_extension_paths' => self::$_settings[ $addon_name ]['model_extension_paths'],
755
-                    'class_extension_paths' => self::$_settings[ $addon_name ]['class_extension_paths'],
756
-                )
757
-            );
758
-        }
759
-    }
726
+	/**
727
+	 * register new models and extensions
728
+	 *
729
+	 * @param string $addon_name
730
+	 * @return void
731
+	 * @throws EE_Error
732
+	 */
733
+	private static function _register_models_and_extensions($addon_name)
734
+	{
735
+		// register new models
736
+		if (! empty(self::$_settings[ $addon_name ]['model_paths'])
737
+			|| ! empty(self::$_settings[ $addon_name ]['class_paths'])
738
+		) {
739
+			EE_Register_Model::register(
740
+				$addon_name,
741
+				array(
742
+					'model_paths' => self::$_settings[ $addon_name ]['model_paths'],
743
+					'class_paths' => self::$_settings[ $addon_name ]['class_paths'],
744
+				)
745
+			);
746
+		}
747
+		// register model extensions
748
+		if (! empty(self::$_settings[ $addon_name ]['model_extension_paths'])
749
+			|| ! empty(self::$_settings[ $addon_name ]['class_extension_paths'])
750
+		) {
751
+			EE_Register_Model_Extensions::register(
752
+				$addon_name,
753
+				array(
754
+					'model_extension_paths' => self::$_settings[ $addon_name ]['model_extension_paths'],
755
+					'class_extension_paths' => self::$_settings[ $addon_name ]['class_extension_paths'],
756
+				)
757
+			);
758
+		}
759
+	}
760 760
 
761 761
 
762
-    /**
763
-     * @param string $addon_name
764
-     * @return void
765
-     * @throws EE_Error
766
-     */
767
-    private static function _register_data_migration_scripts($addon_name)
768
-    {
769
-        // setup DMS
770
-        if (! empty(self::$_settings[ $addon_name ]['dms_paths'])) {
771
-            EE_Register_Data_Migration_Scripts::register(
772
-                $addon_name,
773
-                array('dms_paths' => self::$_settings[ $addon_name ]['dms_paths'])
774
-            );
775
-        }
776
-    }
762
+	/**
763
+	 * @param string $addon_name
764
+	 * @return void
765
+	 * @throws EE_Error
766
+	 */
767
+	private static function _register_data_migration_scripts($addon_name)
768
+	{
769
+		// setup DMS
770
+		if (! empty(self::$_settings[ $addon_name ]['dms_paths'])) {
771
+			EE_Register_Data_Migration_Scripts::register(
772
+				$addon_name,
773
+				array('dms_paths' => self::$_settings[ $addon_name ]['dms_paths'])
774
+			);
775
+		}
776
+	}
777 777
 
778 778
 
779
-    /**
780
-     * @param string $addon_name
781
-     * @return void
782
-     * @throws EE_Error
783
-     */
784
-    private static function _register_config($addon_name)
785
-    {
786
-        // if config_class is present let's register config.
787
-        if (! empty(self::$_settings[ $addon_name ]['config_class'])) {
788
-            EE_Register_Config::register(
789
-                self::$_settings[ $addon_name ]['config_class'],
790
-                array(
791
-                    'config_section' => self::$_settings[ $addon_name ]['config_section'],
792
-                    'config_name'    => self::$_settings[ $addon_name ]['config_name'],
793
-                )
794
-            );
795
-        }
796
-    }
779
+	/**
780
+	 * @param string $addon_name
781
+	 * @return void
782
+	 * @throws EE_Error
783
+	 */
784
+	private static function _register_config($addon_name)
785
+	{
786
+		// if config_class is present let's register config.
787
+		if (! empty(self::$_settings[ $addon_name ]['config_class'])) {
788
+			EE_Register_Config::register(
789
+				self::$_settings[ $addon_name ]['config_class'],
790
+				array(
791
+					'config_section' => self::$_settings[ $addon_name ]['config_section'],
792
+					'config_name'    => self::$_settings[ $addon_name ]['config_name'],
793
+				)
794
+			);
795
+		}
796
+	}
797 797
 
798 798
 
799
-    /**
800
-     * @param string $addon_name
801
-     * @return void
802
-     * @throws EE_Error
803
-     */
804
-    private static function _register_admin_pages($addon_name)
805
-    {
806
-        if (! empty(self::$_settings[ $addon_name ]['admin_path'])) {
807
-            EE_Register_Admin_Page::register(
808
-                $addon_name,
809
-                array('page_path' => self::$_settings[ $addon_name ]['admin_path'])
810
-            );
811
-        }
812
-    }
799
+	/**
800
+	 * @param string $addon_name
801
+	 * @return void
802
+	 * @throws EE_Error
803
+	 */
804
+	private static function _register_admin_pages($addon_name)
805
+	{
806
+		if (! empty(self::$_settings[ $addon_name ]['admin_path'])) {
807
+			EE_Register_Admin_Page::register(
808
+				$addon_name,
809
+				array('page_path' => self::$_settings[ $addon_name ]['admin_path'])
810
+			);
811
+		}
812
+	}
813 813
 
814 814
 
815
-    /**
816
-     * @param string $addon_name
817
-     * @return void
818
-     * @throws EE_Error
819
-     */
820
-    private static function _register_modules($addon_name)
821
-    {
822
-        if (! empty(self::$_settings[ $addon_name ]['module_paths'])) {
823
-            EE_Register_Module::register(
824
-                $addon_name,
825
-                array('module_paths' => self::$_settings[ $addon_name ]['module_paths'])
826
-            );
827
-        }
828
-    }
815
+	/**
816
+	 * @param string $addon_name
817
+	 * @return void
818
+	 * @throws EE_Error
819
+	 */
820
+	private static function _register_modules($addon_name)
821
+	{
822
+		if (! empty(self::$_settings[ $addon_name ]['module_paths'])) {
823
+			EE_Register_Module::register(
824
+				$addon_name,
825
+				array('module_paths' => self::$_settings[ $addon_name ]['module_paths'])
826
+			);
827
+		}
828
+	}
829 829
 
830 830
 
831
-    /**
832
-     * @param string $addon_name
833
-     * @return void
834
-     * @throws EE_Error
835
-     */
836
-    private static function _register_shortcodes($addon_name)
837
-    {
838
-        if (! empty(self::$_settings[ $addon_name ]['shortcode_paths'])
839
-            || ! empty(self::$_settings[ $addon_name ]['shortcode_fqcns'])
840
-        ) {
841
-            EE_Register_Shortcode::register(
842
-                $addon_name,
843
-                array(
844
-                    'shortcode_paths' => isset(self::$_settings[ $addon_name ]['shortcode_paths'])
845
-                        ? self::$_settings[ $addon_name ]['shortcode_paths']
846
-                        : array(),
847
-                    'shortcode_fqcns' => isset(self::$_settings[ $addon_name ]['shortcode_fqcns'])
848
-                        ? self::$_settings[ $addon_name ]['shortcode_fqcns']
849
-                        : array(),
850
-                )
851
-            );
852
-        }
853
-    }
831
+	/**
832
+	 * @param string $addon_name
833
+	 * @return void
834
+	 * @throws EE_Error
835
+	 */
836
+	private static function _register_shortcodes($addon_name)
837
+	{
838
+		if (! empty(self::$_settings[ $addon_name ]['shortcode_paths'])
839
+			|| ! empty(self::$_settings[ $addon_name ]['shortcode_fqcns'])
840
+		) {
841
+			EE_Register_Shortcode::register(
842
+				$addon_name,
843
+				array(
844
+					'shortcode_paths' => isset(self::$_settings[ $addon_name ]['shortcode_paths'])
845
+						? self::$_settings[ $addon_name ]['shortcode_paths']
846
+						: array(),
847
+					'shortcode_fqcns' => isset(self::$_settings[ $addon_name ]['shortcode_fqcns'])
848
+						? self::$_settings[ $addon_name ]['shortcode_fqcns']
849
+						: array(),
850
+				)
851
+			);
852
+		}
853
+	}
854 854
 
855 855
 
856
-    /**
857
-     * @param string $addon_name
858
-     * @return void
859
-     * @throws EE_Error
860
-     */
861
-    private static function _register_widgets($addon_name)
862
-    {
863
-        if (! empty(self::$_settings[ $addon_name ]['widget_paths'])) {
864
-            EE_Register_Widget::register(
865
-                $addon_name,
866
-                array('widget_paths' => self::$_settings[ $addon_name ]['widget_paths'])
867
-            );
868
-        }
869
-    }
856
+	/**
857
+	 * @param string $addon_name
858
+	 * @return void
859
+	 * @throws EE_Error
860
+	 */
861
+	private static function _register_widgets($addon_name)
862
+	{
863
+		if (! empty(self::$_settings[ $addon_name ]['widget_paths'])) {
864
+			EE_Register_Widget::register(
865
+				$addon_name,
866
+				array('widget_paths' => self::$_settings[ $addon_name ]['widget_paths'])
867
+			);
868
+		}
869
+	}
870 870
 
871 871
 
872
-    /**
873
-     * @param string $addon_name
874
-     * @return void
875
-     * @throws EE_Error
876
-     */
877
-    private static function _register_capabilities($addon_name)
878
-    {
879
-        if (! empty(self::$_settings[ $addon_name ]['capabilities'])) {
880
-            EE_Register_Capabilities::register(
881
-                $addon_name,
882
-                array(
883
-                    'capabilities'    => self::$_settings[ $addon_name ]['capabilities'],
884
-                    'capability_maps' => self::$_settings[ $addon_name ]['capability_maps'],
885
-                )
886
-            );
887
-        }
888
-    }
872
+	/**
873
+	 * @param string $addon_name
874
+	 * @return void
875
+	 * @throws EE_Error
876
+	 */
877
+	private static function _register_capabilities($addon_name)
878
+	{
879
+		if (! empty(self::$_settings[ $addon_name ]['capabilities'])) {
880
+			EE_Register_Capabilities::register(
881
+				$addon_name,
882
+				array(
883
+					'capabilities'    => self::$_settings[ $addon_name ]['capabilities'],
884
+					'capability_maps' => self::$_settings[ $addon_name ]['capability_maps'],
885
+				)
886
+			);
887
+		}
888
+	}
889 889
 
890 890
 
891
-    /**
892
-     * @param string $addon_name
893
-     * @return void
894
-     * @throws EE_Error
895
-     */
896
-    private static function _register_message_types($addon_name)
897
-    {
898
-        if (! empty(self::$_settings[ $addon_name ]['message_types'])) {
899
-            add_action(
900
-                'EE_Brewing_Regular___messages_caf',
901
-                array('EE_Register_Addon', 'register_message_types')
902
-            );
903
-        }
904
-    }
891
+	/**
892
+	 * @param string $addon_name
893
+	 * @return void
894
+	 * @throws EE_Error
895
+	 */
896
+	private static function _register_message_types($addon_name)
897
+	{
898
+		if (! empty(self::$_settings[ $addon_name ]['message_types'])) {
899
+			add_action(
900
+				'EE_Brewing_Regular___messages_caf',
901
+				array('EE_Register_Addon', 'register_message_types')
902
+			);
903
+		}
904
+	}
905 905
 
906 906
 
907
-    /**
908
-     * @param string $addon_name
909
-     * @return void
910
-     * @throws EE_Error
911
-     */
912
-    private static function _register_custom_post_types($addon_name)
913
-    {
914
-        if (! empty(self::$_settings[ $addon_name ]['custom_post_types'])
915
-            || ! empty(self::$_settings[ $addon_name ]['custom_taxonomies'])
916
-        ) {
917
-            EE_Register_CPT::register(
918
-                $addon_name,
919
-                array(
920
-                    'cpts'          => self::$_settings[ $addon_name ]['custom_post_types'],
921
-                    'cts'           => self::$_settings[ $addon_name ]['custom_taxonomies'],
922
-                    'default_terms' => self::$_settings[ $addon_name ]['default_terms'],
923
-                )
924
-            );
925
-        }
926
-    }
907
+	/**
908
+	 * @param string $addon_name
909
+	 * @return void
910
+	 * @throws EE_Error
911
+	 */
912
+	private static function _register_custom_post_types($addon_name)
913
+	{
914
+		if (! empty(self::$_settings[ $addon_name ]['custom_post_types'])
915
+			|| ! empty(self::$_settings[ $addon_name ]['custom_taxonomies'])
916
+		) {
917
+			EE_Register_CPT::register(
918
+				$addon_name,
919
+				array(
920
+					'cpts'          => self::$_settings[ $addon_name ]['custom_post_types'],
921
+					'cts'           => self::$_settings[ $addon_name ]['custom_taxonomies'],
922
+					'default_terms' => self::$_settings[ $addon_name ]['default_terms'],
923
+				)
924
+			);
925
+		}
926
+	}
927 927
 
928 928
 
929
-    /**
930
-     * @param string $addon_name
931
-     * @return void
932
-     * @throws InvalidArgumentException
933
-     * @throws InvalidInterfaceException
934
-     * @throws InvalidDataTypeException
935
-     * @throws DomainException
936
-     * @throws EE_Error
937
-     */
938
-    private static function _register_payment_methods($addon_name)
939
-    {
940
-        if (! empty(self::$_settings[ $addon_name ]['payment_method_paths'])) {
941
-            EE_Register_Payment_Method::register(
942
-                $addon_name,
943
-                array('payment_method_paths' => self::$_settings[ $addon_name ]['payment_method_paths'])
944
-            );
945
-        }
946
-    }
929
+	/**
930
+	 * @param string $addon_name
931
+	 * @return void
932
+	 * @throws InvalidArgumentException
933
+	 * @throws InvalidInterfaceException
934
+	 * @throws InvalidDataTypeException
935
+	 * @throws DomainException
936
+	 * @throws EE_Error
937
+	 */
938
+	private static function _register_payment_methods($addon_name)
939
+	{
940
+		if (! empty(self::$_settings[ $addon_name ]['payment_method_paths'])) {
941
+			EE_Register_Payment_Method::register(
942
+				$addon_name,
943
+				array('payment_method_paths' => self::$_settings[ $addon_name ]['payment_method_paths'])
944
+			);
945
+		}
946
+	}
947 947
 
948 948
 
949
-    /**
950
-     * @param string $addon_name
951
-     * @return void
952
-     * @throws InvalidArgumentException
953
-     * @throws InvalidInterfaceException
954
-     * @throws InvalidDataTypeException
955
-     * @throws DomainException
956
-     * @throws EE_Error
957
-     */
958
-    private static function registerPrivacyPolicies($addon_name)
959
-    {
960
-        if (! empty(self::$_settings[ $addon_name ]['privacy_policies'])) {
961
-            EE_Register_Privacy_Policy::register(
962
-                $addon_name,
963
-                self::$_settings[ $addon_name ]['privacy_policies']
964
-            );
965
-        }
966
-    }
949
+	/**
950
+	 * @param string $addon_name
951
+	 * @return void
952
+	 * @throws InvalidArgumentException
953
+	 * @throws InvalidInterfaceException
954
+	 * @throws InvalidDataTypeException
955
+	 * @throws DomainException
956
+	 * @throws EE_Error
957
+	 */
958
+	private static function registerPrivacyPolicies($addon_name)
959
+	{
960
+		if (! empty(self::$_settings[ $addon_name ]['privacy_policies'])) {
961
+			EE_Register_Privacy_Policy::register(
962
+				$addon_name,
963
+				self::$_settings[ $addon_name ]['privacy_policies']
964
+			);
965
+		}
966
+	}
967 967
 
968 968
 
969
-    /**
970
-     * Loads and instantiates the EE_Addon class and adds it onto the registry
971
-     *
972
-     * @param string $addon_name
973
-     * @return EE_Addon
974
-     * @throws InvalidArgumentException
975
-     * @throws InvalidInterfaceException
976
-     * @throws InvalidDataTypeException
977
-     * @throws ReflectionException
978
-     * @throws EE_Error
979
-     */
980
-    private static function _load_and_init_addon_class($addon_name)
981
-    {
982
-        $loader = EventEspresso\core\services\loaders\LoaderFactory::getLoader();
983
-        $addon = $loader->getShared(
984
-            self::$_settings[ $addon_name ]['class_name'],
985
-            array('EE_Registry::create(addon)' => true)
986
-        );
987
-        // setter inject dep map if required
988
-        if ($addon instanceof RequiresDependencyMapInterface && $addon->dependencyMap() === null) {
989
-            $addon->setDependencyMap($loader->getShared('EE_Dependency_Map'));
990
-        }
991
-        // setter inject domain if required
992
-        if ($addon instanceof RequiresDomainInterface
993
-            && $addon->domain() === null
994
-        ) {
995
-            // using supplied Domain object
996
-            $domain = self::$_settings[ $addon_name ]['domain'] instanceof DomainInterface
997
-                ? self::$_settings[ $addon_name ]['domain']
998
-                : null;
999
-            // or construct one using Domain FQCN
1000
-            if ($domain === null && self::$_settings[ $addon_name ]['domain_fqcn'] !== '') {
1001
-                $domain = $loader->getShared(
1002
-                    self::$_settings[ $addon_name ]['domain_fqcn'],
1003
-                    array(
1004
-                        new EventEspresso\core\domain\values\FilePath(
1005
-                            self::$_settings[ $addon_name ]['main_file_path']
1006
-                        ),
1007
-                        EventEspresso\core\domain\values\Version::fromString(
1008
-                            self::$_settings[ $addon_name ]['version']
1009
-                        ),
1010
-                    )
1011
-                );
1012
-            }
1013
-            if ($domain instanceof DomainInterface) {
1014
-                $addon->setDomain($domain);
1015
-            }
1016
-        }
1017
-        $addon->set_name($addon_name);
1018
-        $addon->set_plugin_slug(self::$_settings[ $addon_name ]['plugin_slug']);
1019
-        $addon->set_plugin_basename(self::$_settings[ $addon_name ]['plugin_basename']);
1020
-        $addon->set_main_plugin_file(self::$_settings[ $addon_name ]['main_file_path']);
1021
-        $addon->set_plugin_action_slug(self::$_settings[ $addon_name ]['plugin_action_slug']);
1022
-        $addon->set_plugins_page_row(self::$_settings[ $addon_name ]['plugins_page_row']);
1023
-        $addon->set_version(self::$_settings[ $addon_name ]['version']);
1024
-        $addon->set_min_core_version(self::_effective_version(self::$_settings[ $addon_name ]['min_core_version']));
1025
-        $addon->set_config_section(self::$_settings[ $addon_name ]['config_section']);
1026
-        $addon->set_config_class(self::$_settings[ $addon_name ]['config_class']);
1027
-        $addon->set_config_name(self::$_settings[ $addon_name ]['config_name']);
1028
-        // unfortunately this can't be hooked in upon construction, because we don't have
1029
-        // the plugin mainfile's path upon construction.
1030
-        register_deactivation_hook($addon->get_main_plugin_file(), array($addon, 'deactivation'));
1031
-        // call any additional admin_callback functions during load_admin_controller hook
1032
-        if (! empty(self::$_settings[ $addon_name ]['admin_callback'])) {
1033
-            add_action(
1034
-                'AHEE__EE_System__load_controllers__load_admin_controllers',
1035
-                array($addon, self::$_settings[ $addon_name ]['admin_callback'])
1036
-            );
1037
-        }
1038
-        return $addon;
1039
-    }
969
+	/**
970
+	 * Loads and instantiates the EE_Addon class and adds it onto the registry
971
+	 *
972
+	 * @param string $addon_name
973
+	 * @return EE_Addon
974
+	 * @throws InvalidArgumentException
975
+	 * @throws InvalidInterfaceException
976
+	 * @throws InvalidDataTypeException
977
+	 * @throws ReflectionException
978
+	 * @throws EE_Error
979
+	 */
980
+	private static function _load_and_init_addon_class($addon_name)
981
+	{
982
+		$loader = EventEspresso\core\services\loaders\LoaderFactory::getLoader();
983
+		$addon = $loader->getShared(
984
+			self::$_settings[ $addon_name ]['class_name'],
985
+			array('EE_Registry::create(addon)' => true)
986
+		);
987
+		// setter inject dep map if required
988
+		if ($addon instanceof RequiresDependencyMapInterface && $addon->dependencyMap() === null) {
989
+			$addon->setDependencyMap($loader->getShared('EE_Dependency_Map'));
990
+		}
991
+		// setter inject domain if required
992
+		if ($addon instanceof RequiresDomainInterface
993
+			&& $addon->domain() === null
994
+		) {
995
+			// using supplied Domain object
996
+			$domain = self::$_settings[ $addon_name ]['domain'] instanceof DomainInterface
997
+				? self::$_settings[ $addon_name ]['domain']
998
+				: null;
999
+			// or construct one using Domain FQCN
1000
+			if ($domain === null && self::$_settings[ $addon_name ]['domain_fqcn'] !== '') {
1001
+				$domain = $loader->getShared(
1002
+					self::$_settings[ $addon_name ]['domain_fqcn'],
1003
+					array(
1004
+						new EventEspresso\core\domain\values\FilePath(
1005
+							self::$_settings[ $addon_name ]['main_file_path']
1006
+						),
1007
+						EventEspresso\core\domain\values\Version::fromString(
1008
+							self::$_settings[ $addon_name ]['version']
1009
+						),
1010
+					)
1011
+				);
1012
+			}
1013
+			if ($domain instanceof DomainInterface) {
1014
+				$addon->setDomain($domain);
1015
+			}
1016
+		}
1017
+		$addon->set_name($addon_name);
1018
+		$addon->set_plugin_slug(self::$_settings[ $addon_name ]['plugin_slug']);
1019
+		$addon->set_plugin_basename(self::$_settings[ $addon_name ]['plugin_basename']);
1020
+		$addon->set_main_plugin_file(self::$_settings[ $addon_name ]['main_file_path']);
1021
+		$addon->set_plugin_action_slug(self::$_settings[ $addon_name ]['plugin_action_slug']);
1022
+		$addon->set_plugins_page_row(self::$_settings[ $addon_name ]['plugins_page_row']);
1023
+		$addon->set_version(self::$_settings[ $addon_name ]['version']);
1024
+		$addon->set_min_core_version(self::_effective_version(self::$_settings[ $addon_name ]['min_core_version']));
1025
+		$addon->set_config_section(self::$_settings[ $addon_name ]['config_section']);
1026
+		$addon->set_config_class(self::$_settings[ $addon_name ]['config_class']);
1027
+		$addon->set_config_name(self::$_settings[ $addon_name ]['config_name']);
1028
+		// unfortunately this can't be hooked in upon construction, because we don't have
1029
+		// the plugin mainfile's path upon construction.
1030
+		register_deactivation_hook($addon->get_main_plugin_file(), array($addon, 'deactivation'));
1031
+		// call any additional admin_callback functions during load_admin_controller hook
1032
+		if (! empty(self::$_settings[ $addon_name ]['admin_callback'])) {
1033
+			add_action(
1034
+				'AHEE__EE_System__load_controllers__load_admin_controllers',
1035
+				array($addon, self::$_settings[ $addon_name ]['admin_callback'])
1036
+			);
1037
+		}
1038
+		return $addon;
1039
+	}
1040 1040
 
1041 1041
 
1042
-    /**
1043
-     *    load_pue_update - Update notifications
1044
-     *
1045
-     * @return void
1046
-     * @throws InvalidArgumentException
1047
-     * @throws InvalidDataTypeException
1048
-     * @throws InvalidInterfaceException
1049
-     */
1050
-    public static function load_pue_update()
1051
-    {
1052
-        // load PUE client
1053
-        require_once EE_THIRD_PARTY . 'pue' . DS . 'pue-client.php';
1054
-        // cycle thru settings
1055
-        foreach (self::$_settings as $settings) {
1056
-            if (! empty($settings['pue_options'])) {
1057
-                // initiate the class and start the plugin update engine!
1058
-                new PluginUpdateEngineChecker(
1059
-                    // host file URL
1060
-                    'https://eventespresso.com',
1061
-                    // plugin slug(s)
1062
-                    array(
1063
-                        'premium'    => array('p' => $settings['pue_options']['pue_plugin_slug']),
1064
-                        'prerelease' => array('beta' => $settings['pue_options']['pue_plugin_slug'] . '-pr'),
1065
-                    ),
1066
-                    // options
1067
-                    array(
1068
-                        'apikey'            => EE_Registry::instance()->NET_CFG->core->site_license_key,
1069
-                        'lang_domain'       => 'event_espresso',
1070
-                        'checkPeriod'       => $settings['pue_options']['checkPeriod'],
1071
-                        'option_key'        => 'site_license_key',
1072
-                        'options_page_slug' => 'event_espresso',
1073
-                        'plugin_basename'   => $settings['pue_options']['plugin_basename'],
1074
-                        // if use_wp_update is TRUE it means you want FREE versions of the plugin to be updated from WP
1075
-                        'use_wp_update'     => $settings['pue_options']['use_wp_update'],
1076
-                    )
1077
-                );
1078
-            }
1079
-        }
1080
-    }
1042
+	/**
1043
+	 *    load_pue_update - Update notifications
1044
+	 *
1045
+	 * @return void
1046
+	 * @throws InvalidArgumentException
1047
+	 * @throws InvalidDataTypeException
1048
+	 * @throws InvalidInterfaceException
1049
+	 */
1050
+	public static function load_pue_update()
1051
+	{
1052
+		// load PUE client
1053
+		require_once EE_THIRD_PARTY . 'pue' . DS . 'pue-client.php';
1054
+		// cycle thru settings
1055
+		foreach (self::$_settings as $settings) {
1056
+			if (! empty($settings['pue_options'])) {
1057
+				// initiate the class and start the plugin update engine!
1058
+				new PluginUpdateEngineChecker(
1059
+					// host file URL
1060
+					'https://eventespresso.com',
1061
+					// plugin slug(s)
1062
+					array(
1063
+						'premium'    => array('p' => $settings['pue_options']['pue_plugin_slug']),
1064
+						'prerelease' => array('beta' => $settings['pue_options']['pue_plugin_slug'] . '-pr'),
1065
+					),
1066
+					// options
1067
+					array(
1068
+						'apikey'            => EE_Registry::instance()->NET_CFG->core->site_license_key,
1069
+						'lang_domain'       => 'event_espresso',
1070
+						'checkPeriod'       => $settings['pue_options']['checkPeriod'],
1071
+						'option_key'        => 'site_license_key',
1072
+						'options_page_slug' => 'event_espresso',
1073
+						'plugin_basename'   => $settings['pue_options']['plugin_basename'],
1074
+						// if use_wp_update is TRUE it means you want FREE versions of the plugin to be updated from WP
1075
+						'use_wp_update'     => $settings['pue_options']['use_wp_update'],
1076
+					)
1077
+				);
1078
+			}
1079
+		}
1080
+	}
1081 1081
 
1082 1082
 
1083
-    /**
1084
-     * Callback for EE_Brewing_Regular__messages_caf hook used to register message types.
1085
-     *
1086
-     * @since 4.4.0
1087
-     * @return void
1088
-     * @throws EE_Error
1089
-     */
1090
-    public static function register_message_types()
1091
-    {
1092
-        foreach (self::$_settings as $addon_name => $settings) {
1093
-            if (! empty($settings['message_types'])) {
1094
-                foreach ((array) $settings['message_types'] as $message_type => $message_type_settings) {
1095
-                    EE_Register_Message_Type::register($message_type, $message_type_settings);
1096
-                }
1097
-            }
1098
-        }
1099
-    }
1083
+	/**
1084
+	 * Callback for EE_Brewing_Regular__messages_caf hook used to register message types.
1085
+	 *
1086
+	 * @since 4.4.0
1087
+	 * @return void
1088
+	 * @throws EE_Error
1089
+	 */
1090
+	public static function register_message_types()
1091
+	{
1092
+		foreach (self::$_settings as $addon_name => $settings) {
1093
+			if (! empty($settings['message_types'])) {
1094
+				foreach ((array) $settings['message_types'] as $message_type => $message_type_settings) {
1095
+					EE_Register_Message_Type::register($message_type, $message_type_settings);
1096
+				}
1097
+			}
1098
+		}
1099
+	}
1100 1100
 
1101 1101
 
1102
-    /**
1103
-     * This deregisters an addon that was previously registered with a specific addon_name.
1104
-     *
1105
-     * @since    4.3.0
1106
-     * @param string $addon_name the name for the addon that was previously registered
1107
-     * @throws DomainException
1108
-     * @throws EE_Error
1109
-     * @throws InvalidArgumentException
1110
-     * @throws InvalidDataTypeException
1111
-     * @throws InvalidInterfaceException
1112
-     */
1113
-    public static function deregister($addon_name = null)
1114
-    {
1115
-        if (isset(self::$_settings[ $addon_name ]['class_name'])) {
1116
-            try {
1117
-                do_action('AHEE__EE_Register_Addon__deregister__before', $addon_name);
1118
-                $class_name = self::$_settings[ $addon_name ]['class_name'];
1119
-                if (! empty(self::$_settings[ $addon_name ]['dms_paths'])) {
1120
-                    // setup DMS
1121
-                    EE_Register_Data_Migration_Scripts::deregister($addon_name);
1122
-                }
1123
-                if (! empty(self::$_settings[ $addon_name ]['admin_path'])) {
1124
-                    // register admin page
1125
-                    EE_Register_Admin_Page::deregister($addon_name);
1126
-                }
1127
-                if (! empty(self::$_settings[ $addon_name ]['module_paths'])) {
1128
-                    // add to list of modules to be registered
1129
-                    EE_Register_Module::deregister($addon_name);
1130
-                }
1131
-                if (! empty(self::$_settings[ $addon_name ]['shortcode_paths'])
1132
-                    || ! empty(self::$_settings[ $addon_name ]['shortcode_fqcns'])
1133
-                ) {
1134
-                    // add to list of shortcodes to be registered
1135
-                    EE_Register_Shortcode::deregister($addon_name);
1136
-                }
1137
-                if (! empty(self::$_settings[ $addon_name ]['config_class'])) {
1138
-                    // if config_class present let's register config.
1139
-                    EE_Register_Config::deregister(self::$_settings[ $addon_name ]['config_class']);
1140
-                }
1141
-                if (! empty(self::$_settings[ $addon_name ]['widget_paths'])) {
1142
-                    // add to list of widgets to be registered
1143
-                    EE_Register_Widget::deregister($addon_name);
1144
-                }
1145
-                if (! empty(self::$_settings[ $addon_name ]['model_paths'])
1146
-                    || ! empty(self::$_settings[ $addon_name ]['class_paths'])
1147
-                ) {
1148
-                    // add to list of shortcodes to be registered
1149
-                    EE_Register_Model::deregister($addon_name);
1150
-                }
1151
-                if (! empty(self::$_settings[ $addon_name ]['model_extension_paths'])
1152
-                    || ! empty(self::$_settings[ $addon_name ]['class_extension_paths'])
1153
-                ) {
1154
-                    // add to list of shortcodes to be registered
1155
-                    EE_Register_Model_Extensions::deregister($addon_name);
1156
-                }
1157
-                if (! empty(self::$_settings[ $addon_name ]['message_types'])) {
1158
-                    foreach ((array) self::$_settings[ $addon_name ]['message_types'] as $message_type => $message_type_settings) {
1159
-                        EE_Register_Message_Type::deregister($message_type);
1160
-                    }
1161
-                }
1162
-                // deregister capabilities for addon
1163
-                if (! empty(self::$_settings[ $addon_name ]['capabilities'])
1164
-                    || ! empty(self::$_settings[ $addon_name ]['capability_maps'])
1165
-                ) {
1166
-                    EE_Register_Capabilities::deregister($addon_name);
1167
-                }
1168
-                // deregister custom_post_types for addon
1169
-                if (! empty(self::$_settings[ $addon_name ]['custom_post_types'])) {
1170
-                    EE_Register_CPT::deregister($addon_name);
1171
-                }
1172
-                if (! empty(self::$_settings[ $addon_name ]['payment_method_paths'])) {
1173
-                    EE_Register_Payment_Method::deregister($addon_name);
1174
-                }
1175
-                $addon = EE_Registry::instance()->getAddon($class_name);
1176
-                if ($addon instanceof EE_Addon) {
1177
-                    remove_action(
1178
-                        'deactivate_' . $addon->get_main_plugin_file_basename(),
1179
-                        array($addon, 'deactivation')
1180
-                    );
1181
-                    remove_action(
1182
-                        'AHEE__EE_System__perform_activations_upgrades_and_migrations',
1183
-                        array($addon, 'initialize_db_if_no_migrations_required')
1184
-                    );
1185
-                    // remove `after_registration` call
1186
-                    remove_action(
1187
-                        'AHEE__EE_System__load_espresso_addons__complete',
1188
-                        array($addon, 'after_registration'),
1189
-                        999
1190
-                    );
1191
-                }
1192
-                EE_Registry::instance()->removeAddon($class_name);
1193
-            } catch (OutOfBoundsException $addon_not_yet_registered_exception) {
1194
-                // the add-on was not yet registered in the registry,
1195
-                // so RegistryContainer::__get() throws this exception.
1196
-                // also no need to worry about this or log it,
1197
-                // it's ok to deregister an add-on before its registered in the registry
1198
-            } catch (Exception $e) {
1199
-                new ExceptionLogger($e);
1200
-            }
1201
-            unset(self::$_settings[ $addon_name ]);
1202
-            do_action('AHEE__EE_Register_Addon__deregister__after', $addon_name);
1203
-        }
1204
-    }
1102
+	/**
1103
+	 * This deregisters an addon that was previously registered with a specific addon_name.
1104
+	 *
1105
+	 * @since    4.3.0
1106
+	 * @param string $addon_name the name for the addon that was previously registered
1107
+	 * @throws DomainException
1108
+	 * @throws EE_Error
1109
+	 * @throws InvalidArgumentException
1110
+	 * @throws InvalidDataTypeException
1111
+	 * @throws InvalidInterfaceException
1112
+	 */
1113
+	public static function deregister($addon_name = null)
1114
+	{
1115
+		if (isset(self::$_settings[ $addon_name ]['class_name'])) {
1116
+			try {
1117
+				do_action('AHEE__EE_Register_Addon__deregister__before', $addon_name);
1118
+				$class_name = self::$_settings[ $addon_name ]['class_name'];
1119
+				if (! empty(self::$_settings[ $addon_name ]['dms_paths'])) {
1120
+					// setup DMS
1121
+					EE_Register_Data_Migration_Scripts::deregister($addon_name);
1122
+				}
1123
+				if (! empty(self::$_settings[ $addon_name ]['admin_path'])) {
1124
+					// register admin page
1125
+					EE_Register_Admin_Page::deregister($addon_name);
1126
+				}
1127
+				if (! empty(self::$_settings[ $addon_name ]['module_paths'])) {
1128
+					// add to list of modules to be registered
1129
+					EE_Register_Module::deregister($addon_name);
1130
+				}
1131
+				if (! empty(self::$_settings[ $addon_name ]['shortcode_paths'])
1132
+					|| ! empty(self::$_settings[ $addon_name ]['shortcode_fqcns'])
1133
+				) {
1134
+					// add to list of shortcodes to be registered
1135
+					EE_Register_Shortcode::deregister($addon_name);
1136
+				}
1137
+				if (! empty(self::$_settings[ $addon_name ]['config_class'])) {
1138
+					// if config_class present let's register config.
1139
+					EE_Register_Config::deregister(self::$_settings[ $addon_name ]['config_class']);
1140
+				}
1141
+				if (! empty(self::$_settings[ $addon_name ]['widget_paths'])) {
1142
+					// add to list of widgets to be registered
1143
+					EE_Register_Widget::deregister($addon_name);
1144
+				}
1145
+				if (! empty(self::$_settings[ $addon_name ]['model_paths'])
1146
+					|| ! empty(self::$_settings[ $addon_name ]['class_paths'])
1147
+				) {
1148
+					// add to list of shortcodes to be registered
1149
+					EE_Register_Model::deregister($addon_name);
1150
+				}
1151
+				if (! empty(self::$_settings[ $addon_name ]['model_extension_paths'])
1152
+					|| ! empty(self::$_settings[ $addon_name ]['class_extension_paths'])
1153
+				) {
1154
+					// add to list of shortcodes to be registered
1155
+					EE_Register_Model_Extensions::deregister($addon_name);
1156
+				}
1157
+				if (! empty(self::$_settings[ $addon_name ]['message_types'])) {
1158
+					foreach ((array) self::$_settings[ $addon_name ]['message_types'] as $message_type => $message_type_settings) {
1159
+						EE_Register_Message_Type::deregister($message_type);
1160
+					}
1161
+				}
1162
+				// deregister capabilities for addon
1163
+				if (! empty(self::$_settings[ $addon_name ]['capabilities'])
1164
+					|| ! empty(self::$_settings[ $addon_name ]['capability_maps'])
1165
+				) {
1166
+					EE_Register_Capabilities::deregister($addon_name);
1167
+				}
1168
+				// deregister custom_post_types for addon
1169
+				if (! empty(self::$_settings[ $addon_name ]['custom_post_types'])) {
1170
+					EE_Register_CPT::deregister($addon_name);
1171
+				}
1172
+				if (! empty(self::$_settings[ $addon_name ]['payment_method_paths'])) {
1173
+					EE_Register_Payment_Method::deregister($addon_name);
1174
+				}
1175
+				$addon = EE_Registry::instance()->getAddon($class_name);
1176
+				if ($addon instanceof EE_Addon) {
1177
+					remove_action(
1178
+						'deactivate_' . $addon->get_main_plugin_file_basename(),
1179
+						array($addon, 'deactivation')
1180
+					);
1181
+					remove_action(
1182
+						'AHEE__EE_System__perform_activations_upgrades_and_migrations',
1183
+						array($addon, 'initialize_db_if_no_migrations_required')
1184
+					);
1185
+					// remove `after_registration` call
1186
+					remove_action(
1187
+						'AHEE__EE_System__load_espresso_addons__complete',
1188
+						array($addon, 'after_registration'),
1189
+						999
1190
+					);
1191
+				}
1192
+				EE_Registry::instance()->removeAddon($class_name);
1193
+			} catch (OutOfBoundsException $addon_not_yet_registered_exception) {
1194
+				// the add-on was not yet registered in the registry,
1195
+				// so RegistryContainer::__get() throws this exception.
1196
+				// also no need to worry about this or log it,
1197
+				// it's ok to deregister an add-on before its registered in the registry
1198
+			} catch (Exception $e) {
1199
+				new ExceptionLogger($e);
1200
+			}
1201
+			unset(self::$_settings[ $addon_name ]);
1202
+			do_action('AHEE__EE_Register_Addon__deregister__after', $addon_name);
1203
+		}
1204
+	}
1205 1205
 }
Please login to merge, or discard this patch.
Spacing   +111 added lines, -111 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);
@@ -258,7 +258,7 @@  discard block
 block discarded – undo
258 258
         // setup PUE
259 259
         EE_Register_Addon::_parse_pue_options($addon_name, $class_name, $setup_args);
260 260
         // does this addon work with this version of core or WordPress ?
261
-        if (! EE_Register_Addon::_addon_is_compatible($addon_name, $addon_settings)) {
261
+        if ( ! EE_Register_Addon::_addon_is_compatible($addon_name, $addon_settings)) {
262 262
             return;
263 263
         }
264 264
         // register namespaces
@@ -318,7 +318,7 @@  discard block
 block discarded – undo
318 318
                 )
319 319
             );
320 320
         }
321
-        if (! isset($setup_args['main_file_path']) || empty($setup_args['main_file_path'])) {
321
+        if ( ! isset($setup_args['main_file_path']) || empty($setup_args['main_file_path'])) {
322 322
             throw new EE_Error(
323 323
                 sprintf(
324 324
                     __(
@@ -330,7 +330,7 @@  discard block
 block discarded – undo
330 330
             );
331 331
         }
332 332
         // check that addon has not already been registered with that name
333
-        if (isset(self::$_settings[ $addon_name ]) && ! did_action('activate_plugin')) {
333
+        if (isset(self::$_settings[$addon_name]) && ! did_action('activate_plugin')) {
334 334
             throw new EE_Error(
335 335
                 sprintf(
336 336
                     __(
@@ -362,7 +362,7 @@  discard block
 block discarded – undo
362 362
         // check if classname is fully  qualified or is a legacy classname already prefixed with 'EE_'
363 363
         return strpos($class_name, '\\') || strpos($class_name, 'EE_') === 0
364 364
             ? $class_name
365
-            : 'EE_' . $class_name;
365
+            : 'EE_'.$class_name;
366 366
     }
367 367
 
368 368
 
@@ -529,9 +529,9 @@  discard block
 block discarded – undo
529 529
         global $wp_version;
530 530
         $incompatibility_message = '';
531 531
         // check whether this addon version is compatible with EE core
532
-        if (isset(EE_Register_Addon::$_incompatible_addons[ $addon_name ])
532
+        if (isset(EE_Register_Addon::$_incompatible_addons[$addon_name])
533 533
             && ! self::_meets_min_core_version_requirement(
534
-                EE_Register_Addon::$_incompatible_addons[ $addon_name ],
534
+                EE_Register_Addon::$_incompatible_addons[$addon_name],
535 535
                 $addon_settings['version']
536 536
             )
537 537
         ) {
@@ -542,11 +542,11 @@  discard block
 block discarded – undo
542 542
                 ),
543 543
                 $addon_name,
544 544
                 '<br />',
545
-                EE_Register_Addon::$_incompatible_addons[ $addon_name ],
545
+                EE_Register_Addon::$_incompatible_addons[$addon_name],
546 546
                 '<span style="font-weight: bold; color: #D54E21;">',
547 547
                 '</span><br />'
548 548
             );
549
-        } elseif (! self::_meets_min_core_version_requirement($addon_settings['min_core_version'], espresso_version())
549
+        } elseif ( ! self::_meets_min_core_version_requirement($addon_settings['min_core_version'], espresso_version())
550 550
         ) {
551 551
             $incompatibility_message = sprintf(
552 552
                 __(
@@ -573,7 +573,7 @@  discard block
 block discarded – undo
573 573
                 '</span><br />'
574 574
             );
575 575
         }
576
-        if (! empty($incompatibility_message)) {
576
+        if ( ! empty($incompatibility_message)) {
577 577
             // remove 'activate' from the REQUEST
578 578
             // so WP doesn't erroneously tell the user the plugin activated fine when it didn't
579 579
             unset($_GET['activate'], $_REQUEST['activate']);
@@ -601,11 +601,11 @@  discard block
 block discarded – undo
601 601
      */
602 602
     private static function _parse_pue_options($addon_name, $class_name, array $setup_args)
603 603
     {
604
-        if (! empty($setup_args['pue_options'])) {
605
-            self::$_settings[ $addon_name ]['pue_options'] = array(
604
+        if ( ! empty($setup_args['pue_options'])) {
605
+            self::$_settings[$addon_name]['pue_options'] = array(
606 606
                 'pue_plugin_slug' => isset($setup_args['pue_options']['pue_plugin_slug'])
607 607
                     ? (string) $setup_args['pue_options']['pue_plugin_slug']
608
-                    : 'espresso_' . strtolower($class_name),
608
+                    : 'espresso_'.strtolower($class_name),
609 609
                 'plugin_basename' => isset($setup_args['pue_options']['plugin_basename'])
610 610
                     ? (string) $setup_args['pue_options']['plugin_basename']
611 611
                     : plugin_basename($setup_args['main_file_path']),
@@ -664,12 +664,12 @@  discard block
 block discarded – undo
664 664
             // (as the newly-activated addon wasn't around the first time addons were registered).
665 665
             // Note: the presence of pue_options in the addon registration options will initialize the $_settings
666 666
             // property for the add-on, but the add-on is only partially initialized.  Hence, the additional check.
667
-            if (! isset(self::$_settings[ $addon_name ])
668
-                || (isset(self::$_settings[ $addon_name ])
669
-                    && ! isset(self::$_settings[ $addon_name ]['class_name'])
667
+            if ( ! isset(self::$_settings[$addon_name])
668
+                || (isset(self::$_settings[$addon_name])
669
+                    && ! isset(self::$_settings[$addon_name]['class_name'])
670 670
                 )
671 671
             ) {
672
-                self::$_settings[ $addon_name ] = $addon_settings;
672
+                self::$_settings[$addon_name] = $addon_settings;
673 673
                 $addon = self::_load_and_init_addon_class($addon_name);
674 674
                 $addon->set_activation_indicator_option();
675 675
                 // dont bother setting up the rest of the addon.
@@ -678,7 +678,7 @@  discard block
 block discarded – undo
678 678
             return true;
679 679
         }
680 680
         // make sure this was called in the right place!
681
-        if (! did_action('AHEE__EE_System__load_espresso_addons')
681
+        if ( ! did_action('AHEE__EE_System__load_espresso_addons')
682 682
             || did_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin')
683 683
         ) {
684 684
             EE_Error::doing_it_wrong(
@@ -694,10 +694,10 @@  discard block
 block discarded – undo
694 694
             );
695 695
         }
696 696
         // make sure addon settings are set correctly without overwriting anything existing
697
-        if (isset(self::$_settings[ $addon_name ])) {
698
-            self::$_settings[ $addon_name ] += $addon_settings;
697
+        if (isset(self::$_settings[$addon_name])) {
698
+            self::$_settings[$addon_name] += $addon_settings;
699 699
         } else {
700
-            self::$_settings[ $addon_name ] = $addon_settings;
700
+            self::$_settings[$addon_name] = $addon_settings;
701 701
         }
702 702
         return false;
703 703
     }
@@ -710,13 +710,13 @@  discard block
 block discarded – undo
710 710
      */
711 711
     private static function _setup_autoloaders($addon_name)
712 712
     {
713
-        if (! empty(self::$_settings[ $addon_name ]['autoloader_paths'])) {
713
+        if ( ! empty(self::$_settings[$addon_name]['autoloader_paths'])) {
714 714
             // setup autoloader for single file
715
-            EEH_Autoloader::instance()->register_autoloader(self::$_settings[ $addon_name ]['autoloader_paths']);
715
+            EEH_Autoloader::instance()->register_autoloader(self::$_settings[$addon_name]['autoloader_paths']);
716 716
         }
717 717
         // setup autoloaders for folders
718
-        if (! empty(self::$_settings[ $addon_name ]['autoloader_folders'])) {
719
-            foreach ((array) self::$_settings[ $addon_name ]['autoloader_folders'] as $autoloader_folder) {
718
+        if ( ! empty(self::$_settings[$addon_name]['autoloader_folders'])) {
719
+            foreach ((array) self::$_settings[$addon_name]['autoloader_folders'] as $autoloader_folder) {
720 720
                 EEH_Autoloader::register_autoloaders_for_each_file_in_folder($autoloader_folder);
721 721
             }
722 722
         }
@@ -733,26 +733,26 @@  discard block
 block discarded – undo
733 733
     private static function _register_models_and_extensions($addon_name)
734 734
     {
735 735
         // register new models
736
-        if (! empty(self::$_settings[ $addon_name ]['model_paths'])
737
-            || ! empty(self::$_settings[ $addon_name ]['class_paths'])
736
+        if ( ! empty(self::$_settings[$addon_name]['model_paths'])
737
+            || ! empty(self::$_settings[$addon_name]['class_paths'])
738 738
         ) {
739 739
             EE_Register_Model::register(
740 740
                 $addon_name,
741 741
                 array(
742
-                    'model_paths' => self::$_settings[ $addon_name ]['model_paths'],
743
-                    'class_paths' => self::$_settings[ $addon_name ]['class_paths'],
742
+                    'model_paths' => self::$_settings[$addon_name]['model_paths'],
743
+                    'class_paths' => self::$_settings[$addon_name]['class_paths'],
744 744
                 )
745 745
             );
746 746
         }
747 747
         // register model extensions
748
-        if (! empty(self::$_settings[ $addon_name ]['model_extension_paths'])
749
-            || ! empty(self::$_settings[ $addon_name ]['class_extension_paths'])
748
+        if ( ! empty(self::$_settings[$addon_name]['model_extension_paths'])
749
+            || ! empty(self::$_settings[$addon_name]['class_extension_paths'])
750 750
         ) {
751 751
             EE_Register_Model_Extensions::register(
752 752
                 $addon_name,
753 753
                 array(
754
-                    'model_extension_paths' => self::$_settings[ $addon_name ]['model_extension_paths'],
755
-                    'class_extension_paths' => self::$_settings[ $addon_name ]['class_extension_paths'],
754
+                    'model_extension_paths' => self::$_settings[$addon_name]['model_extension_paths'],
755
+                    'class_extension_paths' => self::$_settings[$addon_name]['class_extension_paths'],
756 756
                 )
757 757
             );
758 758
         }
@@ -767,10 +767,10 @@  discard block
 block discarded – undo
767 767
     private static function _register_data_migration_scripts($addon_name)
768 768
     {
769 769
         // setup DMS
770
-        if (! empty(self::$_settings[ $addon_name ]['dms_paths'])) {
770
+        if ( ! empty(self::$_settings[$addon_name]['dms_paths'])) {
771 771
             EE_Register_Data_Migration_Scripts::register(
772 772
                 $addon_name,
773
-                array('dms_paths' => self::$_settings[ $addon_name ]['dms_paths'])
773
+                array('dms_paths' => self::$_settings[$addon_name]['dms_paths'])
774 774
             );
775 775
         }
776 776
     }
@@ -784,12 +784,12 @@  discard block
 block discarded – undo
784 784
     private static function _register_config($addon_name)
785 785
     {
786 786
         // if config_class is present let's register config.
787
-        if (! empty(self::$_settings[ $addon_name ]['config_class'])) {
787
+        if ( ! empty(self::$_settings[$addon_name]['config_class'])) {
788 788
             EE_Register_Config::register(
789
-                self::$_settings[ $addon_name ]['config_class'],
789
+                self::$_settings[$addon_name]['config_class'],
790 790
                 array(
791
-                    'config_section' => self::$_settings[ $addon_name ]['config_section'],
792
-                    'config_name'    => self::$_settings[ $addon_name ]['config_name'],
791
+                    'config_section' => self::$_settings[$addon_name]['config_section'],
792
+                    'config_name'    => self::$_settings[$addon_name]['config_name'],
793 793
                 )
794 794
             );
795 795
         }
@@ -803,10 +803,10 @@  discard block
 block discarded – undo
803 803
      */
804 804
     private static function _register_admin_pages($addon_name)
805 805
     {
806
-        if (! empty(self::$_settings[ $addon_name ]['admin_path'])) {
806
+        if ( ! empty(self::$_settings[$addon_name]['admin_path'])) {
807 807
             EE_Register_Admin_Page::register(
808 808
                 $addon_name,
809
-                array('page_path' => self::$_settings[ $addon_name ]['admin_path'])
809
+                array('page_path' => self::$_settings[$addon_name]['admin_path'])
810 810
             );
811 811
         }
812 812
     }
@@ -819,10 +819,10 @@  discard block
 block discarded – undo
819 819
      */
820 820
     private static function _register_modules($addon_name)
821 821
     {
822
-        if (! empty(self::$_settings[ $addon_name ]['module_paths'])) {
822
+        if ( ! empty(self::$_settings[$addon_name]['module_paths'])) {
823 823
             EE_Register_Module::register(
824 824
                 $addon_name,
825
-                array('module_paths' => self::$_settings[ $addon_name ]['module_paths'])
825
+                array('module_paths' => self::$_settings[$addon_name]['module_paths'])
826 826
             );
827 827
         }
828 828
     }
@@ -835,17 +835,17 @@  discard block
 block discarded – undo
835 835
      */
836 836
     private static function _register_shortcodes($addon_name)
837 837
     {
838
-        if (! empty(self::$_settings[ $addon_name ]['shortcode_paths'])
839
-            || ! empty(self::$_settings[ $addon_name ]['shortcode_fqcns'])
838
+        if ( ! empty(self::$_settings[$addon_name]['shortcode_paths'])
839
+            || ! empty(self::$_settings[$addon_name]['shortcode_fqcns'])
840 840
         ) {
841 841
             EE_Register_Shortcode::register(
842 842
                 $addon_name,
843 843
                 array(
844
-                    'shortcode_paths' => isset(self::$_settings[ $addon_name ]['shortcode_paths'])
845
-                        ? self::$_settings[ $addon_name ]['shortcode_paths']
844
+                    'shortcode_paths' => isset(self::$_settings[$addon_name]['shortcode_paths'])
845
+                        ? self::$_settings[$addon_name]['shortcode_paths']
846 846
                         : array(),
847
-                    'shortcode_fqcns' => isset(self::$_settings[ $addon_name ]['shortcode_fqcns'])
848
-                        ? self::$_settings[ $addon_name ]['shortcode_fqcns']
847
+                    'shortcode_fqcns' => isset(self::$_settings[$addon_name]['shortcode_fqcns'])
848
+                        ? self::$_settings[$addon_name]['shortcode_fqcns']
849 849
                         : array(),
850 850
                 )
851 851
             );
@@ -860,10 +860,10 @@  discard block
 block discarded – undo
860 860
      */
861 861
     private static function _register_widgets($addon_name)
862 862
     {
863
-        if (! empty(self::$_settings[ $addon_name ]['widget_paths'])) {
863
+        if ( ! empty(self::$_settings[$addon_name]['widget_paths'])) {
864 864
             EE_Register_Widget::register(
865 865
                 $addon_name,
866
-                array('widget_paths' => self::$_settings[ $addon_name ]['widget_paths'])
866
+                array('widget_paths' => self::$_settings[$addon_name]['widget_paths'])
867 867
             );
868 868
         }
869 869
     }
@@ -876,12 +876,12 @@  discard block
 block discarded – undo
876 876
      */
877 877
     private static function _register_capabilities($addon_name)
878 878
     {
879
-        if (! empty(self::$_settings[ $addon_name ]['capabilities'])) {
879
+        if ( ! empty(self::$_settings[$addon_name]['capabilities'])) {
880 880
             EE_Register_Capabilities::register(
881 881
                 $addon_name,
882 882
                 array(
883
-                    'capabilities'    => self::$_settings[ $addon_name ]['capabilities'],
884
-                    'capability_maps' => self::$_settings[ $addon_name ]['capability_maps'],
883
+                    'capabilities'    => self::$_settings[$addon_name]['capabilities'],
884
+                    'capability_maps' => self::$_settings[$addon_name]['capability_maps'],
885 885
                 )
886 886
             );
887 887
         }
@@ -895,7 +895,7 @@  discard block
 block discarded – undo
895 895
      */
896 896
     private static function _register_message_types($addon_name)
897 897
     {
898
-        if (! empty(self::$_settings[ $addon_name ]['message_types'])) {
898
+        if ( ! empty(self::$_settings[$addon_name]['message_types'])) {
899 899
             add_action(
900 900
                 'EE_Brewing_Regular___messages_caf',
901 901
                 array('EE_Register_Addon', 'register_message_types')
@@ -911,15 +911,15 @@  discard block
 block discarded – undo
911 911
      */
912 912
     private static function _register_custom_post_types($addon_name)
913 913
     {
914
-        if (! empty(self::$_settings[ $addon_name ]['custom_post_types'])
915
-            || ! empty(self::$_settings[ $addon_name ]['custom_taxonomies'])
914
+        if ( ! empty(self::$_settings[$addon_name]['custom_post_types'])
915
+            || ! empty(self::$_settings[$addon_name]['custom_taxonomies'])
916 916
         ) {
917 917
             EE_Register_CPT::register(
918 918
                 $addon_name,
919 919
                 array(
920
-                    'cpts'          => self::$_settings[ $addon_name ]['custom_post_types'],
921
-                    'cts'           => self::$_settings[ $addon_name ]['custom_taxonomies'],
922
-                    'default_terms' => self::$_settings[ $addon_name ]['default_terms'],
920
+                    'cpts'          => self::$_settings[$addon_name]['custom_post_types'],
921
+                    'cts'           => self::$_settings[$addon_name]['custom_taxonomies'],
922
+                    'default_terms' => self::$_settings[$addon_name]['default_terms'],
923 923
                 )
924 924
             );
925 925
         }
@@ -937,10 +937,10 @@  discard block
 block discarded – undo
937 937
      */
938 938
     private static function _register_payment_methods($addon_name)
939 939
     {
940
-        if (! empty(self::$_settings[ $addon_name ]['payment_method_paths'])) {
940
+        if ( ! empty(self::$_settings[$addon_name]['payment_method_paths'])) {
941 941
             EE_Register_Payment_Method::register(
942 942
                 $addon_name,
943
-                array('payment_method_paths' => self::$_settings[ $addon_name ]['payment_method_paths'])
943
+                array('payment_method_paths' => self::$_settings[$addon_name]['payment_method_paths'])
944 944
             );
945 945
         }
946 946
     }
@@ -957,10 +957,10 @@  discard block
 block discarded – undo
957 957
      */
958 958
     private static function registerPrivacyPolicies($addon_name)
959 959
     {
960
-        if (! empty(self::$_settings[ $addon_name ]['privacy_policies'])) {
960
+        if ( ! empty(self::$_settings[$addon_name]['privacy_policies'])) {
961 961
             EE_Register_Privacy_Policy::register(
962 962
                 $addon_name,
963
-                self::$_settings[ $addon_name ]['privacy_policies']
963
+                self::$_settings[$addon_name]['privacy_policies']
964 964
             );
965 965
         }
966 966
     }
@@ -981,7 +981,7 @@  discard block
 block discarded – undo
981 981
     {
982 982
         $loader = EventEspresso\core\services\loaders\LoaderFactory::getLoader();
983 983
         $addon = $loader->getShared(
984
-            self::$_settings[ $addon_name ]['class_name'],
984
+            self::$_settings[$addon_name]['class_name'],
985 985
             array('EE_Registry::create(addon)' => true)
986 986
         );
987 987
         // setter inject dep map if required
@@ -993,19 +993,19 @@  discard block
 block discarded – undo
993 993
             && $addon->domain() === null
994 994
         ) {
995 995
             // using supplied Domain object
996
-            $domain = self::$_settings[ $addon_name ]['domain'] instanceof DomainInterface
997
-                ? self::$_settings[ $addon_name ]['domain']
996
+            $domain = self::$_settings[$addon_name]['domain'] instanceof DomainInterface
997
+                ? self::$_settings[$addon_name]['domain']
998 998
                 : null;
999 999
             // or construct one using Domain FQCN
1000
-            if ($domain === null && self::$_settings[ $addon_name ]['domain_fqcn'] !== '') {
1000
+            if ($domain === null && self::$_settings[$addon_name]['domain_fqcn'] !== '') {
1001 1001
                 $domain = $loader->getShared(
1002
-                    self::$_settings[ $addon_name ]['domain_fqcn'],
1002
+                    self::$_settings[$addon_name]['domain_fqcn'],
1003 1003
                     array(
1004 1004
                         new EventEspresso\core\domain\values\FilePath(
1005
-                            self::$_settings[ $addon_name ]['main_file_path']
1005
+                            self::$_settings[$addon_name]['main_file_path']
1006 1006
                         ),
1007 1007
                         EventEspresso\core\domain\values\Version::fromString(
1008
-                            self::$_settings[ $addon_name ]['version']
1008
+                            self::$_settings[$addon_name]['version']
1009 1009
                         ),
1010 1010
                     )
1011 1011
                 );
@@ -1015,24 +1015,24 @@  discard block
 block discarded – undo
1015 1015
             }
1016 1016
         }
1017 1017
         $addon->set_name($addon_name);
1018
-        $addon->set_plugin_slug(self::$_settings[ $addon_name ]['plugin_slug']);
1019
-        $addon->set_plugin_basename(self::$_settings[ $addon_name ]['plugin_basename']);
1020
-        $addon->set_main_plugin_file(self::$_settings[ $addon_name ]['main_file_path']);
1021
-        $addon->set_plugin_action_slug(self::$_settings[ $addon_name ]['plugin_action_slug']);
1022
-        $addon->set_plugins_page_row(self::$_settings[ $addon_name ]['plugins_page_row']);
1023
-        $addon->set_version(self::$_settings[ $addon_name ]['version']);
1024
-        $addon->set_min_core_version(self::_effective_version(self::$_settings[ $addon_name ]['min_core_version']));
1025
-        $addon->set_config_section(self::$_settings[ $addon_name ]['config_section']);
1026
-        $addon->set_config_class(self::$_settings[ $addon_name ]['config_class']);
1027
-        $addon->set_config_name(self::$_settings[ $addon_name ]['config_name']);
1018
+        $addon->set_plugin_slug(self::$_settings[$addon_name]['plugin_slug']);
1019
+        $addon->set_plugin_basename(self::$_settings[$addon_name]['plugin_basename']);
1020
+        $addon->set_main_plugin_file(self::$_settings[$addon_name]['main_file_path']);
1021
+        $addon->set_plugin_action_slug(self::$_settings[$addon_name]['plugin_action_slug']);
1022
+        $addon->set_plugins_page_row(self::$_settings[$addon_name]['plugins_page_row']);
1023
+        $addon->set_version(self::$_settings[$addon_name]['version']);
1024
+        $addon->set_min_core_version(self::_effective_version(self::$_settings[$addon_name]['min_core_version']));
1025
+        $addon->set_config_section(self::$_settings[$addon_name]['config_section']);
1026
+        $addon->set_config_class(self::$_settings[$addon_name]['config_class']);
1027
+        $addon->set_config_name(self::$_settings[$addon_name]['config_name']);
1028 1028
         // unfortunately this can't be hooked in upon construction, because we don't have
1029 1029
         // the plugin mainfile's path upon construction.
1030 1030
         register_deactivation_hook($addon->get_main_plugin_file(), array($addon, 'deactivation'));
1031 1031
         // call any additional admin_callback functions during load_admin_controller hook
1032
-        if (! empty(self::$_settings[ $addon_name ]['admin_callback'])) {
1032
+        if ( ! empty(self::$_settings[$addon_name]['admin_callback'])) {
1033 1033
             add_action(
1034 1034
                 'AHEE__EE_System__load_controllers__load_admin_controllers',
1035
-                array($addon, self::$_settings[ $addon_name ]['admin_callback'])
1035
+                array($addon, self::$_settings[$addon_name]['admin_callback'])
1036 1036
             );
1037 1037
         }
1038 1038
         return $addon;
@@ -1050,10 +1050,10 @@  discard block
 block discarded – undo
1050 1050
     public static function load_pue_update()
1051 1051
     {
1052 1052
         // load PUE client
1053
-        require_once EE_THIRD_PARTY . 'pue' . DS . 'pue-client.php';
1053
+        require_once EE_THIRD_PARTY.'pue'.DS.'pue-client.php';
1054 1054
         // cycle thru settings
1055 1055
         foreach (self::$_settings as $settings) {
1056
-            if (! empty($settings['pue_options'])) {
1056
+            if ( ! empty($settings['pue_options'])) {
1057 1057
                 // initiate the class and start the plugin update engine!
1058 1058
                 new PluginUpdateEngineChecker(
1059 1059
                     // host file URL
@@ -1061,7 +1061,7 @@  discard block
 block discarded – undo
1061 1061
                     // plugin slug(s)
1062 1062
                     array(
1063 1063
                         'premium'    => array('p' => $settings['pue_options']['pue_plugin_slug']),
1064
-                        'prerelease' => array('beta' => $settings['pue_options']['pue_plugin_slug'] . '-pr'),
1064
+                        'prerelease' => array('beta' => $settings['pue_options']['pue_plugin_slug'].'-pr'),
1065 1065
                     ),
1066 1066
                     // options
1067 1067
                     array(
@@ -1090,7 +1090,7 @@  discard block
 block discarded – undo
1090 1090
     public static function register_message_types()
1091 1091
     {
1092 1092
         foreach (self::$_settings as $addon_name => $settings) {
1093
-            if (! empty($settings['message_types'])) {
1093
+            if ( ! empty($settings['message_types'])) {
1094 1094
                 foreach ((array) $settings['message_types'] as $message_type => $message_type_settings) {
1095 1095
                     EE_Register_Message_Type::register($message_type, $message_type_settings);
1096 1096
                 }
@@ -1112,70 +1112,70 @@  discard block
 block discarded – undo
1112 1112
      */
1113 1113
     public static function deregister($addon_name = null)
1114 1114
     {
1115
-        if (isset(self::$_settings[ $addon_name ]['class_name'])) {
1115
+        if (isset(self::$_settings[$addon_name]['class_name'])) {
1116 1116
             try {
1117 1117
                 do_action('AHEE__EE_Register_Addon__deregister__before', $addon_name);
1118
-                $class_name = self::$_settings[ $addon_name ]['class_name'];
1119
-                if (! empty(self::$_settings[ $addon_name ]['dms_paths'])) {
1118
+                $class_name = self::$_settings[$addon_name]['class_name'];
1119
+                if ( ! empty(self::$_settings[$addon_name]['dms_paths'])) {
1120 1120
                     // setup DMS
1121 1121
                     EE_Register_Data_Migration_Scripts::deregister($addon_name);
1122 1122
                 }
1123
-                if (! empty(self::$_settings[ $addon_name ]['admin_path'])) {
1123
+                if ( ! empty(self::$_settings[$addon_name]['admin_path'])) {
1124 1124
                     // register admin page
1125 1125
                     EE_Register_Admin_Page::deregister($addon_name);
1126 1126
                 }
1127
-                if (! empty(self::$_settings[ $addon_name ]['module_paths'])) {
1127
+                if ( ! empty(self::$_settings[$addon_name]['module_paths'])) {
1128 1128
                     // add to list of modules to be registered
1129 1129
                     EE_Register_Module::deregister($addon_name);
1130 1130
                 }
1131
-                if (! empty(self::$_settings[ $addon_name ]['shortcode_paths'])
1132
-                    || ! empty(self::$_settings[ $addon_name ]['shortcode_fqcns'])
1131
+                if ( ! empty(self::$_settings[$addon_name]['shortcode_paths'])
1132
+                    || ! empty(self::$_settings[$addon_name]['shortcode_fqcns'])
1133 1133
                 ) {
1134 1134
                     // add to list of shortcodes to be registered
1135 1135
                     EE_Register_Shortcode::deregister($addon_name);
1136 1136
                 }
1137
-                if (! empty(self::$_settings[ $addon_name ]['config_class'])) {
1137
+                if ( ! empty(self::$_settings[$addon_name]['config_class'])) {
1138 1138
                     // if config_class present let's register config.
1139
-                    EE_Register_Config::deregister(self::$_settings[ $addon_name ]['config_class']);
1139
+                    EE_Register_Config::deregister(self::$_settings[$addon_name]['config_class']);
1140 1140
                 }
1141
-                if (! empty(self::$_settings[ $addon_name ]['widget_paths'])) {
1141
+                if ( ! empty(self::$_settings[$addon_name]['widget_paths'])) {
1142 1142
                     // add to list of widgets to be registered
1143 1143
                     EE_Register_Widget::deregister($addon_name);
1144 1144
                 }
1145
-                if (! empty(self::$_settings[ $addon_name ]['model_paths'])
1146
-                    || ! empty(self::$_settings[ $addon_name ]['class_paths'])
1145
+                if ( ! empty(self::$_settings[$addon_name]['model_paths'])
1146
+                    || ! empty(self::$_settings[$addon_name]['class_paths'])
1147 1147
                 ) {
1148 1148
                     // add to list of shortcodes to be registered
1149 1149
                     EE_Register_Model::deregister($addon_name);
1150 1150
                 }
1151
-                if (! empty(self::$_settings[ $addon_name ]['model_extension_paths'])
1152
-                    || ! empty(self::$_settings[ $addon_name ]['class_extension_paths'])
1151
+                if ( ! empty(self::$_settings[$addon_name]['model_extension_paths'])
1152
+                    || ! empty(self::$_settings[$addon_name]['class_extension_paths'])
1153 1153
                 ) {
1154 1154
                     // add to list of shortcodes to be registered
1155 1155
                     EE_Register_Model_Extensions::deregister($addon_name);
1156 1156
                 }
1157
-                if (! empty(self::$_settings[ $addon_name ]['message_types'])) {
1158
-                    foreach ((array) self::$_settings[ $addon_name ]['message_types'] as $message_type => $message_type_settings) {
1157
+                if ( ! empty(self::$_settings[$addon_name]['message_types'])) {
1158
+                    foreach ((array) self::$_settings[$addon_name]['message_types'] as $message_type => $message_type_settings) {
1159 1159
                         EE_Register_Message_Type::deregister($message_type);
1160 1160
                     }
1161 1161
                 }
1162 1162
                 // deregister capabilities for addon
1163
-                if (! empty(self::$_settings[ $addon_name ]['capabilities'])
1164
-                    || ! empty(self::$_settings[ $addon_name ]['capability_maps'])
1163
+                if ( ! empty(self::$_settings[$addon_name]['capabilities'])
1164
+                    || ! empty(self::$_settings[$addon_name]['capability_maps'])
1165 1165
                 ) {
1166 1166
                     EE_Register_Capabilities::deregister($addon_name);
1167 1167
                 }
1168 1168
                 // deregister custom_post_types for addon
1169
-                if (! empty(self::$_settings[ $addon_name ]['custom_post_types'])) {
1169
+                if ( ! empty(self::$_settings[$addon_name]['custom_post_types'])) {
1170 1170
                     EE_Register_CPT::deregister($addon_name);
1171 1171
                 }
1172
-                if (! empty(self::$_settings[ $addon_name ]['payment_method_paths'])) {
1172
+                if ( ! empty(self::$_settings[$addon_name]['payment_method_paths'])) {
1173 1173
                     EE_Register_Payment_Method::deregister($addon_name);
1174 1174
                 }
1175 1175
                 $addon = EE_Registry::instance()->getAddon($class_name);
1176 1176
                 if ($addon instanceof EE_Addon) {
1177 1177
                     remove_action(
1178
-                        'deactivate_' . $addon->get_main_plugin_file_basename(),
1178
+                        'deactivate_'.$addon->get_main_plugin_file_basename(),
1179 1179
                         array($addon, 'deactivation')
1180 1180
                     );
1181 1181
                     remove_action(
@@ -1198,7 +1198,7 @@  discard block
 block discarded – undo
1198 1198
             } catch (Exception $e) {
1199 1199
                 new ExceptionLogger($e);
1200 1200
             }
1201
-            unset(self::$_settings[ $addon_name ]);
1201
+            unset(self::$_settings[$addon_name]);
1202 1202
             do_action('AHEE__EE_Register_Addon__deregister__after', $addon_name);
1203 1203
         }
1204 1204
     }
Please login to merge, or discard this patch.
core/libraries/plugin_api/EE_Register_Privacy_Policy.lib.php 2 patches
Indentation   +39 added lines, -39 removed lines patch added patch discarded remove patch
@@ -13,55 +13,55 @@
 block discarded – undo
13 13
 class EE_Register_Privacy_Policy implements EEI_Plugin_API
14 14
 {
15 15
 
16
-    /**
17
-     * FQCN for all privacy policy generators
18
-     *
19
-     * @var array keys are plugin_ids, and values are an array of FQCNs or FQCNs
20
-     */
21
-    protected static $privacy_policies = array();
16
+	/**
17
+	 * FQCN for all privacy policy generators
18
+	 *
19
+	 * @var array keys are plugin_ids, and values are an array of FQCNs or FQCNs
20
+	 */
21
+	protected static $privacy_policies = array();
22 22
 
23 23
 
24
-    /*
24
+	/*
25 25
      * @param string $plugin_id
26 26
      * @param array $FQNSs can be the fully qualified namespaces each containing only privacy policies,
27 27
      *              OR fully qualified class names of privacy policies
28 28
      */
29
-    public static function register($plugin_id = null, $FQCNs = array())
30
-    {
31
-        self::$privacy_policies[ $plugin_id ] = $FQCNs;
32
-        // add to list of modules to be registered
33
-        add_filter(
34
-            'FHEE__EventEspresso_core_services_privacy_policy_PrivacyPolicyManager__privacy_policies',
35
-            array('EE_Register_Privacy_Policy', 'addPrivacyPolicies')
36
-        );
37
-    }
29
+	public static function register($plugin_id = null, $FQCNs = array())
30
+	{
31
+		self::$privacy_policies[ $plugin_id ] = $FQCNs;
32
+		// add to list of modules to be registered
33
+		add_filter(
34
+			'FHEE__EventEspresso_core_services_privacy_policy_PrivacyPolicyManager__privacy_policies',
35
+			array('EE_Register_Privacy_Policy', 'addPrivacyPolicies')
36
+		);
37
+	}
38 38
 
39 39
 
40
-    /**
41
-     * @param null $ID
42
-     */
43
-    public static function deregister($ID = null)
44
-    {
45
-        unset(self::$privacy_policies[ $ID ]);
46
-    }
40
+	/**
41
+	 * @param null $ID
42
+	 */
43
+	public static function deregister($ID = null)
44
+	{
45
+		unset(self::$privacy_policies[ $ID ]);
46
+	}
47 47
 
48 48
 
49
-    /**
50
-     * Adds our privacy policiy generators registered by add-ons
51
-     *
52
-     * @param string[] $privacy_policies
53
-     * @return string[]
54
-     */
55
-    public static function addPrivacyPolicies(array $privacy_policies)
56
-    {
57
-        foreach (self::$privacy_policies as $privacy_policies_per_addon) {
58
-            $privacy_policies = array_merge(
59
-                $privacy_policies,
60
-                $privacy_policies_per_addon
61
-            );
62
-        }
63
-        return $privacy_policies;
64
-    }
49
+	/**
50
+	 * Adds our privacy policiy generators registered by add-ons
51
+	 *
52
+	 * @param string[] $privacy_policies
53
+	 * @return string[]
54
+	 */
55
+	public static function addPrivacyPolicies(array $privacy_policies)
56
+	{
57
+		foreach (self::$privacy_policies as $privacy_policies_per_addon) {
58
+			$privacy_policies = array_merge(
59
+				$privacy_policies,
60
+				$privacy_policies_per_addon
61
+			);
62
+		}
63
+		return $privacy_policies;
64
+	}
65 65
 }
66 66
 // End of file EE_Register_Privacy_Policy.lib.php
67 67
 // Location: ${NAMESPACE}/EE_Register_Privacy_Policy.lib.php
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -28,7 +28,7 @@  discard block
 block discarded – undo
28 28
      */
29 29
     public static function register($plugin_id = null, $FQCNs = array())
30 30
     {
31
-        self::$privacy_policies[ $plugin_id ] = $FQCNs;
31
+        self::$privacy_policies[$plugin_id] = $FQCNs;
32 32
         // add to list of modules to be registered
33 33
         add_filter(
34 34
             'FHEE__EventEspresso_core_services_privacy_policy_PrivacyPolicyManager__privacy_policies',
@@ -42,7 +42,7 @@  discard block
 block discarded – undo
42 42
      */
43 43
     public static function deregister($ID = null)
44 44
     {
45
-        unset(self::$privacy_policies[ $ID ]);
45
+        unset(self::$privacy_policies[$ID]);
46 46
     }
47 47
 
48 48
 
Please login to merge, or discard this patch.
core/domain/services/admin/privacy/policy/privacy_policy.template.php 2 patches
Indentation   +76 added lines, -76 removed lines patch added patch discarded remove patch
@@ -7,10 +7,10 @@  discard block
 block discarded – undo
7 7
 ?>
8 8
 <h2><?php esc_html_e('Event Registration Data', 'event_espresso'); ?></h2>
9 9
 <p><?php
10
-    esc_html_e(
11
-        'We collect information about you during event registration. This information may include but is not limited to:',
12
-        'event_espresso'
13
-    ); ?></p>
10
+	esc_html_e(
11
+		'We collect information about you during event registration. This information may include but is not limited to:',
12
+		'event_espresso'
13
+	); ?></p>
14 14
 <ul>
15 15
     <li><?php esc_html_e('Your names', 'event_espresso'); ?></li>
16 16
     <li><?php esc_html_e('Billing address', 'event_espresso'); ?></li>
@@ -19,10 +19,10 @@  discard block
 block discarded – undo
19 19
     <li><?php esc_html_e('Phone number', 'event_espresso'); ?></li>
20 20
     <li><?php esc_html_e('Location and traffic data (including IP address and browser type)', 'event_espresso'); ?></li>
21 21
     <li><?php
22
-        esc_html_e(
23
-            'Any other details that might be requested from you for the purpose of processing your registration or ticket purchase',
24
-            'event_espresso'
25
-        ); ?></li>
22
+		esc_html_e(
23
+			'Any other details that might be requested from you for the purpose of processing your registration or ticket purchase',
24
+			'event_espresso'
25
+		); ?></li>
26 26
 </ul>
27 27
 
28 28
 <p><?php esc_html_e('Handling this data also allows us to:', 'event_espresso'); ?></p>
@@ -30,103 +30,103 @@  discard block
 block discarded – undo
30 30
     <li><?php esc_html_e('Send you important account/purchase/service information.', 'event_espresso'); ?></li>
31 31
     <li><?php esc_html_e('Respond to your queries, refund requests, or complaints.', 'event_espresso'); ?></li>
32 32
     <li><?php
33
-        esc_html_e(
34
-            'Process payments and prevent fraudulent transactions. We do this on the basis of our legitimate business interests.',
35
-            'event_espresso'
36
-        ); ?></li>
33
+		esc_html_e(
34
+			'Process payments and prevent fraudulent transactions. We do this on the basis of our legitimate business interests.',
35
+			'event_espresso'
36
+		); ?></li>
37 37
     <li><?php
38
-        esc_html_e(
39
-            'Set up and administer your account, provide technical and customer support, and to verify your identity.',
40
-            'event_espresso'
41
-        ); ?></li>
38
+		esc_html_e(
39
+			'Set up and administer your account, provide technical and customer support, and to verify your identity.',
40
+			'event_espresso'
41
+		); ?></li>
42 42
 </ul>
43 43
 
44 44
 <?php if (! empty($active_onsite_payment_methods) || ! empty($active_offsite_payment_methods)) { ?>
45 45
     <h2><?php esc_html_e('Billing Information', 'event_espresso'); ?> </h2>
46 46
     <?php
47 47
 // if onsite or offsite payment methods are active
48
-    if (! empty($active_onsite_payment_methods)) { ?>
48
+	if (! empty($active_onsite_payment_methods)) { ?>
49 49
         <p><?php
50
-            esc_html_e(
51
-                'In order to process payments, we collect billing information on-site. Sensitive billing information is not stored on our server, but may be handled while in-transit to the payment processing server.',
52
-                'event_espresso'
53
-            ); ?></p>
50
+			esc_html_e(
51
+				'In order to process payments, we collect billing information on-site. Sensitive billing information is not stored on our server, but may be handled while in-transit to the payment processing server.',
52
+				'event_espresso'
53
+			); ?></p>
54 54
         <p><?php
55
-            printf(
56
-                esc_html_x(
57
-                    'Please see the privacy policy of %1$s.',
58
-                    'Please see the privacy policy of PayPal Pro',
59
-                    'event_espresso'
60
-                ),
61
-                implode(
62
-                    ', ',
63
-                    array_merge(
64
-                        $active_onsite_payment_methods,
65
-                        $active_offsite_payment_methods
66
-                    )
67
-                )
68
-            ); ?></p>
55
+			printf(
56
+				esc_html_x(
57
+					'Please see the privacy policy of %1$s.',
58
+					'Please see the privacy policy of PayPal Pro',
59
+					'event_espresso'
60
+				),
61
+				implode(
62
+					', ',
63
+					array_merge(
64
+						$active_onsite_payment_methods,
65
+						$active_offsite_payment_methods
66
+					)
67
+				)
68
+			); ?></p>
69 69
         <p><?php
70
-            esc_html_e(
71
-                'Masked billing information may be stored on our servers (eg only the last 4 digits of credit card numbers are stored: **** **** **** 1234).',
72
-                'event_espresso'
73
-            ); ?></p>
70
+			esc_html_e(
71
+				'Masked billing information may be stored on our servers (eg only the last 4 digits of credit card numbers are stored: **** **** **** 1234).',
72
+				'event_espresso'
73
+			); ?></p>
74 74
     <?php } // IF OFFSITE PAYMENT METHOD ACTIVE
75
-    elseif (! empty($active_onsite_payment_methods)) { ?>
75
+	elseif (! empty($active_onsite_payment_methods)) { ?>
76 76
         <p><?php
77
-            printf(
78
-                esc_html_x(
79
-                    'Billing information is sent directly to the payment processor, and is not handled by our servers. Please see the privacy policy of %1$s.',
80
-                    'Billing information is sent directly to the payment processor, and is not handled by our servers. Please see the privacy policy of PayPal Pro.',
81
-                    'event_espresso'
82
-                ),
83
-                implode(', ', $active_offsite_payment_methods)
84
-            ); ?></p>
77
+			printf(
78
+				esc_html_x(
79
+					'Billing information is sent directly to the payment processor, and is not handled by our servers. Please see the privacy policy of %1$s.',
80
+					'Billing information is sent directly to the payment processor, and is not handled by our servers. Please see the privacy policy of PayPal Pro.',
81
+					'event_espresso'
82
+				),
83
+				implode(', ', $active_offsite_payment_methods)
84
+			); ?></p>
85 85
     <?php } ?>
86 86
     <h2><?php esc_html_e('Payment Logging', 'event_espresso'); ?></h2>
87 87
     <p><?php
88
-        esc_html_e(
89
-            'Site administrators may keep a log of communications with the payment processors in order to verify payments are being processed correctly. These logs are automatically deleted after a week.',
90
-            'event_espresso'
91
-        ); ?></p>
88
+		esc_html_e(
89
+			'Site administrators may keep a log of communications with the payment processors in order to verify payments are being processed correctly. These logs are automatically deleted after a week.',
90
+			'event_espresso'
91
+		); ?></p>
92 92
 <?php } ?>
93 93
 
94 94
 <h2><?php esc_html_e('Event Registration Cookies', 'event_espresso'); ?></h2>
95 95
 <p><?php
96
-    printf(
97
-        esc_html_x(
98
-            'When you begin registering for an event and select a ticket quantity, a cookie will be used to track your registration. This cookie lasts %1$s.',
99
-            'When you begin registering for an event and select a ticket quantity, a cookie will be used to track your registration. This cookie lasts 2 hours.',
100
-            'event_espresso'
101
-        ),
102
-        $session_lifespan
103
-    ); ?></p>
96
+	printf(
97
+		esc_html_x(
98
+			'When you begin registering for an event and select a ticket quantity, a cookie will be used to track your registration. This cookie lasts %1$s.',
99
+			'When you begin registering for an event and select a ticket quantity, a cookie will be used to track your registration. This cookie lasts 2 hours.',
100
+			'event_espresso'
101
+		),
102
+		$session_lifespan
103
+	); ?></p>
104 104
 
105 105
 <h2><?php esc_html_e('Email History Data', 'event_espresso'); ?></h2>
106 106
 <p><?php
107
-    esc_html_e(
108
-        'We keep a record of the emails sent to you. This is to ensure communication is successfully sent and its information is accurate.',
109
-        'event_espresso'
110
-    ); ?></p>
107
+	esc_html_e(
108
+		'We keep a record of the emails sent to you. This is to ensure communication is successfully sent and its information is accurate.',
109
+		'event_espresso'
110
+	); ?></p>
111 111
 
112 112
 <h2><?php esc_html_e('Event Check-In Record', 'event_espresso'); ?></h2>
113 113
 <p><?php
114
-    esc_html_e(
115
-        'When you attend an event, an event manager may record the time you check in or out of the event.',
116
-        'event_espresso'
117
-    ); ?></p>
114
+	esc_html_e(
115
+		'When you attend an event, an event manager may record the time you check in or out of the event.',
116
+		'event_espresso'
117
+	); ?></p>
118 118
 
119 119
 <h2><?php esc_html_e('Event Registration Data Retention', 'event_espresso'); ?></h2>
120 120
 <p><?php
121
-    esc_html_e(
122
-        'Personal data is stored at least until the date of the event, and may be kept indefinitely in case of future registrations.',
123
-        'event_espresso'
124
-    ); ?></p>
121
+	esc_html_e(
122
+		'Personal data is stored at least until the date of the event, and may be kept indefinitely in case of future registrations.',
123
+		'event_espresso'
124
+	); ?></p>
125 125
 
126 126
 <h2><?php esc_html_e('Event Registration Data Erasure and Export', 'event_espresso'); ?></h2>
127 127
 <p><?php
128
-    esc_html_e(
129
-        'You have the right to request your personal data be sent to you electronically, and the right to request your registration data be erased after the event. To do so, please contact the event manager or site administrator.',
130
-        'event_espresso'
131
-    ); ?></p>
128
+	esc_html_e(
129
+		'You have the right to request your personal data be sent to you electronically, and the right to request your registration data be erased after the event. To do so, please contact the event manager or site administrator.',
130
+		'event_espresso'
131
+	); ?></p>
132 132
 
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -41,11 +41,11 @@  discard block
 block discarded – undo
41 41
         ); ?></li>
42 42
 </ul>
43 43
 
44
-<?php if (! empty($active_onsite_payment_methods) || ! empty($active_offsite_payment_methods)) { ?>
44
+<?php if ( ! empty($active_onsite_payment_methods) || ! empty($active_offsite_payment_methods)) { ?>
45 45
     <h2><?php esc_html_e('Billing Information', 'event_espresso'); ?> </h2>
46 46
     <?php
47 47
 // if onsite or offsite payment methods are active
48
-    if (! empty($active_onsite_payment_methods)) { ?>
48
+    if ( ! empty($active_onsite_payment_methods)) { ?>
49 49
         <p><?php
50 50
             esc_html_e(
51 51
                 'In order to process payments, we collect billing information on-site. Sensitive billing information is not stored on our server, but may be handled while in-transit to the payment processing server.',
@@ -72,7 +72,7 @@  discard block
 block discarded – undo
72 72
                 'event_espresso'
73 73
             ); ?></p>
74 74
     <?php } // IF OFFSITE PAYMENT METHOD ACTIVE
75
-    elseif (! empty($active_onsite_payment_methods)) { ?>
75
+    elseif ( ! empty($active_onsite_payment_methods)) { ?>
76 76
         <p><?php
77 77
             printf(
78 78
                 esc_html_x(
Please login to merge, or discard this patch.
core/services/privacy/policy/PrivacyPolicyManager.php 3 patches
Doc Comments   -1 removed lines patch added patch discarded remove patch
@@ -33,7 +33,6 @@
 block discarded – undo
33 33
     /**
34 34
      * For all the registered `PrivacyPolicyInterface`s, add their privacy policy content
35 35
      *
36
-     * @param WP_Post $post
37 36
      */
38 37
     public function addPrivacyPolicy()
39 38
     {
Please login to merge, or discard this patch.
Indentation   +54 added lines, -54 removed lines patch added patch discarded remove patch
@@ -24,64 +24,64 @@
 block discarded – undo
24 24
 class PrivacyPolicyManager
25 25
 {
26 26
 
27
-    public function __construct()
28
-    {
29
-        add_action('admin_init', array($this, 'addPrivacyPolicy'), 9);
30
-    }
27
+	public function __construct()
28
+	{
29
+		add_action('admin_init', array($this, 'addPrivacyPolicy'), 9);
30
+	}
31 31
 
32 32
 
33
-    /**
34
-     * For all the registered `PrivacyPolicyInterface`s, add their privacy policy content
35
-     *
36
-     * @param WP_Post $post
37
-     */
38
-    public function addPrivacyPolicy()
39
-    {
40
-        $policy_page_id = (int) get_option('wp_page_for_privacy_policy');
41
-        if (! $policy_page_id) {
42
-            return;
43
-        }
44
-        // load all the privacy policy stuff
45
-        // add post policy text
46
-        foreach ($this->loadPrivacyPolicyCollection() as $privacy_policy) {
47
-            wp_add_privacy_policy_content($privacy_policy->getName(), $privacy_policy->getContent());
48
-        }
49
-    }
33
+	/**
34
+	 * For all the registered `PrivacyPolicyInterface`s, add their privacy policy content
35
+	 *
36
+	 * @param WP_Post $post
37
+	 */
38
+	public function addPrivacyPolicy()
39
+	{
40
+		$policy_page_id = (int) get_option('wp_page_for_privacy_policy');
41
+		if (! $policy_page_id) {
42
+			return;
43
+		}
44
+		// load all the privacy policy stuff
45
+		// add post policy text
46
+		foreach ($this->loadPrivacyPolicyCollection() as $privacy_policy) {
47
+			wp_add_privacy_policy_content($privacy_policy->getName(), $privacy_policy->getContent());
48
+		}
49
+	}
50 50
 
51 51
 
52
-    /**
53
-     * @return CollectionInterface|PrivacyPolicyInterface[]
54
-     * @throws InvalidIdentifierException
55
-     * @throws InvalidInterfaceException
56
-     * @throws InvalidFilePathException
57
-     * @throws InvalidEntityException
58
-     * @throws InvalidDataTypeException
59
-     * @throws InvalidClassException
60
-     */
61
-    protected function loadPrivacyPolicyCollection()
62
-    {
63
-        $loader = new CollectionLoader(
64
-            new CollectionDetails(
65
-                // collection name
66
-                'privacy_policies',
67
-                // collection interface
68
-                'EventEspresso\core\services\privacy\policy\PrivacyPolicyInterface',
69
-                // FQCNs for classes to add (all classes within that namespace will be loaded)
70
-                apply_filters(
71
-                    'FHEE__EventEspresso_core_services_privacy_policy_PrivacyPolicyManager__privacy_policies',
72
-                    array('EventEspresso\core\domain\services\admin\privacy\policy\PrivacyPolicy')
73
-                ),
74
-                // filepaths to classes to add
75
-                array(),
76
-                // file mask to use if parsing folder for files to add
77
-                '',
78
-                // what to use as identifier for collection entities
79
-                // using CLASS NAME prevents duplicates (works like a singleton)
80
-                CollectionDetails::ID_CLASS_NAME
81
-            )
82
-        );
83
-        return $loader->getCollection();
84
-    }
52
+	/**
53
+	 * @return CollectionInterface|PrivacyPolicyInterface[]
54
+	 * @throws InvalidIdentifierException
55
+	 * @throws InvalidInterfaceException
56
+	 * @throws InvalidFilePathException
57
+	 * @throws InvalidEntityException
58
+	 * @throws InvalidDataTypeException
59
+	 * @throws InvalidClassException
60
+	 */
61
+	protected function loadPrivacyPolicyCollection()
62
+	{
63
+		$loader = new CollectionLoader(
64
+			new CollectionDetails(
65
+				// collection name
66
+				'privacy_policies',
67
+				// collection interface
68
+				'EventEspresso\core\services\privacy\policy\PrivacyPolicyInterface',
69
+				// FQCNs for classes to add (all classes within that namespace will be loaded)
70
+				apply_filters(
71
+					'FHEE__EventEspresso_core_services_privacy_policy_PrivacyPolicyManager__privacy_policies',
72
+					array('EventEspresso\core\domain\services\admin\privacy\policy\PrivacyPolicy')
73
+				),
74
+				// filepaths to classes to add
75
+				array(),
76
+				// file mask to use if parsing folder for files to add
77
+				'',
78
+				// what to use as identifier for collection entities
79
+				// using CLASS NAME prevents duplicates (works like a singleton)
80
+				CollectionDetails::ID_CLASS_NAME
81
+			)
82
+		);
83
+		return $loader->getCollection();
84
+	}
85 85
 }
86 86
 // End of file PrivacyPolicyManager.php
87 87
 // Location: EventEspresso\core\domain\services\admin/PrivacyPolicyManager.php
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -38,7 +38,7 @@
 block discarded – undo
38 38
     public function addPrivacyPolicy()
39 39
     {
40 40
         $policy_page_id = (int) get_option('wp_page_for_privacy_policy');
41
-        if (! $policy_page_id) {
41
+        if ( ! $policy_page_id) {
42 42
             return;
43 43
         }
44 44
         // load all the privacy policy stuff
Please login to merge, or discard this patch.
core/domain/services/assets/CoreAssetManager.php 1 patch
Indentation   +332 added lines, -332 removed lines patch added patch discarded remove patch
@@ -28,336 +28,336 @@
 block discarded – undo
28 28
 class CoreAssetManager extends AssetManager
29 29
 {
30 30
 
31
-    // WordPress core / Third party JS asset handles
32
-    const JS_HANDLE_JQUERY                = 'jquery';
33
-
34
-    const JS_HANDLE_JQUERY_VALIDATE       = 'jquery-validate';
35
-
36
-    const JS_HANDLE_JQUERY_VALIDATE_EXTRA = 'jquery-validate-extra-methods';
37
-
38
-    const JS_HANDLE_UNDERSCORE            = 'underscore';
39
-
40
-    const JS_HANDLE_ACCOUNTING_CORE       = 'ee-accounting-core';
41
-
42
-    // EE JS assets handles
43
-    const JS_HANDLE_EE_MANIFEST        = 'ee-manifest';
44
-
45
-    const JS_HANDLE_EE_JS_CORE         = 'eejs-core';
46
-
47
-    const JS_HANDLE_EE_VENDOR_REACT    = 'ee-vendor-react';
48
-
49
-    const JS_HANDLE_EE_JS_API          = 'eejs-api';
50
-
51
-    const JS_HANDLE_EE_CORE            = 'espresso_core';
52
-
53
-    const JS_HANDLE_EE_I18N            = 'eei18n';
54
-
55
-    const JS_HANDLE_EE_ACCOUNTING      = 'ee-accounting';
56
-
57
-    const JS_HANDLE_EE_WP_PLUGINS_PAGE = 'ee-wp-plugins-page';
58
-
59
-    // EE CSS assets handles
60
-    const CSS_HANDLE_EE_DEFAULT = 'espresso_default';
61
-
62
-    const CSS_HANDLE_EE_CUSTOM  = 'espresso_custom_css';
63
-
64
-    /**
65
-     * @var EE_Currency_Config $currency_config
66
-     */
67
-    protected $currency_config;
68
-
69
-    /**
70
-     * @var EE_Template_Config $template_config
71
-     */
72
-    protected $template_config;
73
-
74
-
75
-    /**
76
-     * CoreAssetRegister constructor.
77
-     *
78
-     * @param AssetCollection    $assets
79
-     * @param EE_Currency_Config $currency_config
80
-     * @param EE_Template_Config $template_config
81
-     * @param DomainInterface    $domain
82
-     * @param Registry           $registry
83
-     */
84
-    public function __construct(
85
-        AssetCollection $assets,
86
-        EE_Currency_Config $currency_config,
87
-        EE_Template_Config $template_config,
88
-        DomainInterface $domain,
89
-        Registry $registry
90
-    ) {
91
-        $this->currency_config = $currency_config;
92
-        $this->template_config = $template_config;
93
-        parent::__construct($domain, $assets, $registry);
94
-    }
95
-
96
-
97
-    /**
98
-     * @since $VID:$
99
-     * @throws DuplicateCollectionIdentifierException
100
-     * @throws InvalidArgumentException
101
-     * @throws InvalidDataTypeException
102
-     * @throws InvalidEntityException
103
-     */
104
-    public function addAssets()
105
-    {
106
-        $this->addJavascriptFiles();
107
-        $this->addStylesheetFiles();
108
-    }
109
-
110
-
111
-    /**
112
-     * @since $VID:$
113
-     * @throws DuplicateCollectionIdentifierException
114
-     * @throws InvalidArgumentException
115
-     * @throws InvalidDataTypeException
116
-     * @throws InvalidEntityException
117
-     */
118
-    public function addJavascriptFiles()
119
-    {
120
-        $this->loadCoreJs();
121
-        $this->loadJqueryValidate();
122
-        $this->loadAccountingJs();
123
-        add_action(
124
-            'AHEE__EventEspresso_core_services_assets_Registry__registerScripts__before_script',
125
-            array($this, 'loadQtipJs')
126
-        );
127
-        $this->registerAdminAssets();
128
-    }
129
-
130
-
131
-    /**
132
-     * @since $VID:$
133
-     * @throws DuplicateCollectionIdentifierException
134
-     * @throws InvalidDataTypeException
135
-     * @throws InvalidEntityException
136
-     */
137
-    public function addStylesheetFiles()
138
-    {
139
-        $this->loadCoreCss();
140
-    }
141
-
142
-
143
-    /**
144
-     * core default javascript
145
-     *
146
-     * @since $VID:$
147
-     * @throws DuplicateCollectionIdentifierException
148
-     * @throws InvalidArgumentException
149
-     * @throws InvalidDataTypeException
150
-     * @throws InvalidEntityException
151
-     */
152
-    private function loadCoreJs()
153
-    {
154
-        $this->addJavascript(
155
-            CoreAssetManager::JS_HANDLE_EE_MANIFEST,
156
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'manifest')
157
-        );
158
-
159
-        $this->addJavascript(
160
-            CoreAssetManager::JS_HANDLE_EE_JS_CORE,
161
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'eejs'),
162
-            array(CoreAssetManager::JS_HANDLE_EE_MANIFEST)
163
-        )
164
-        ->setRequiresTranslation()
165
-        ->setHasLocalizedData();
166
-
167
-        $this->addJavascript(
168
-            CoreAssetManager::JS_HANDLE_EE_VENDOR_REACT,
169
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'reactVendor'),
170
-            array(CoreAssetManager::JS_HANDLE_EE_JS_CORE)
171
-        );
172
-
173
-        global $wp_version;
174
-        if (version_compare($wp_version, '4.4.0', '>')) {
175
-            //js.api
176
-            $this->addJavascript(
177
-                CoreAssetManager::JS_HANDLE_EE_JS_API,
178
-                EE_LIBRARIES_URL . 'rest_api/assets/js/eejs-api.min.js',
179
-                array(
180
-                    CoreAssetManager::JS_HANDLE_UNDERSCORE,
181
-                    CoreAssetManager::JS_HANDLE_EE_JS_CORE
182
-                )
183
-            );
184
-            $this->registry->addData('eejs_api_nonce', wp_create_nonce('wp_rest'));
185
-            $this->registry->addData(
186
-                'paths',
187
-                array(
188
-                    'rest_route' => rest_url('ee/v4.8.36/'),
189
-                    'collection_endpoints' => EED_Core_Rest_Api::getCollectionRoutesIndexedByModelName(),
190
-                )
191
-            );
192
-        }
193
-
194
-        $this->addJavascript(
195
-            CoreAssetManager::JS_HANDLE_EE_CORE,
196
-            EE_GLOBAL_ASSETS_URL . 'scripts/espresso_core.js',
197
-            array(CoreAssetManager::JS_HANDLE_JQUERY)
198
-        )
199
-        ->setLocalizationCallback(
200
-            function () {
201
-                wp_localize_script(
202
-                    CoreAssetManager::JS_HANDLE_EE_CORE,
203
-                    CoreAssetManager::JS_HANDLE_EE_I18N,
204
-                    EE_Registry::$i18n_js_strings
205
-                );
206
-            }
207
-        );
208
-    }
209
-
210
-
211
-    /**
212
-     * @since $VID:$
213
-     * @throws DuplicateCollectionIdentifierException
214
-     * @throws InvalidDataTypeException
215
-     * @throws InvalidEntityException
216
-     */
217
-    private function loadCoreCss()
218
-    {
219
-        if ($this->template_config->enable_default_style && ! is_admin()) {
220
-            $this->addStylesheet(
221
-                CoreAssetManager::CSS_HANDLE_EE_DEFAULT,
222
-                is_readable(EVENT_ESPRESSO_UPLOAD_DIR . 'css/style.css')
223
-                    ? EVENT_ESPRESSO_UPLOAD_DIR . 'css/espresso_default.css'
224
-                    : EE_GLOBAL_ASSETS_URL . 'css/espresso_default.css',
225
-                array('dashicons')
226
-            );
227
-            //Load custom style sheet if available
228
-            if ($this->template_config->custom_style_sheet !== null) {
229
-                $this->addStylesheet(
230
-                    CoreAssetManager::CSS_HANDLE_EE_CUSTOM,
231
-                    EVENT_ESPRESSO_UPLOAD_URL . 'css/' . $this->template_config->custom_style_sheet,
232
-                    array(CoreAssetManager::CSS_HANDLE_EE_DEFAULT)
233
-                );
234
-            }
235
-        }
236
-    }
237
-
238
-
239
-    /**
240
-     * jQuery Validate for form validation
241
-     *
242
-     * @since $VID:$
243
-     * @throws DuplicateCollectionIdentifierException
244
-     * @throws InvalidDataTypeException
245
-     * @throws InvalidEntityException
246
-     */
247
-    private function loadJqueryValidate()
248
-    {
249
-        $this->addJavascript(
250
-            CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE,
251
-            EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.min.js',
252
-            array(CoreAssetManager::JS_HANDLE_JQUERY)
253
-        )
254
-        ->setVersion('1.15.0');
255
-
256
-        $this->addJavascript(
257
-            CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE_EXTRA,
258
-            EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.additional-methods.min.js',
259
-            array(CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE)
260
-        )
261
-        ->setVersion('1.15.0');
262
-    }
263
-
264
-
265
-    /**
266
-     * accounting.js for performing client-side calculations
267
-     *
268
-     * @since $VID:$
269
-     * @throws DuplicateCollectionIdentifierException
270
-     * @throws InvalidDataTypeException
271
-     * @throws InvalidEntityException
272
-     */
273
-    private function loadAccountingJs()
274
-    {
275
-        //accounting.js library
276
-        // @link http://josscrowcroft.github.io/accounting.js/
277
-        $this->addJavascript(
278
-            CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE,
279
-            EE_THIRD_PARTY_URL . 'accounting/accounting.js',
280
-            array(CoreAssetManager::JS_HANDLE_UNDERSCORE)
281
-        )
282
-        ->setVersion('0.3.2');
283
-
284
-        $currency_config = $this->currency_config;
285
-        $this->addJavascript(
286
-            CoreAssetManager::JS_HANDLE_EE_ACCOUNTING,
287
-            EE_GLOBAL_ASSETS_URL . 'scripts/ee-accounting-config.js',
288
-            array(CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE)
289
-        )
290
-        ->setLocalizationCallback(
291
-            function () use ($currency_config) {
292
-                 wp_localize_script(
293
-                     CoreAssetManager::JS_HANDLE_EE_ACCOUNTING,
294
-                     'EE_ACCOUNTING_CFG',
295
-                     array(
296
-                         'currency' => array(
297
-                             'symbol'    => $currency_config->sign,
298
-                             'format'    => array(
299
-                                 'pos'  => $currency_config->sign_b4 ? '%s%v' : '%v%s',
300
-                                 'neg'  => $currency_config->sign_b4 ? '- %s%v' : '- %v%s',
301
-                                 'zero' => $currency_config->sign_b4 ? '%s--' : '--%s',
302
-                             ),
303
-                             'decimal'   => $currency_config->dec_mrk,
304
-                             'thousand'  => $currency_config->thsnds,
305
-                             'precision' => $currency_config->dec_plc,
306
-                         ),
307
-                         'number'   => array(
308
-                             'precision' => $currency_config->dec_plc,
309
-                             'thousand'  => $currency_config->thsnds,
310
-                             'decimal'   => $currency_config->dec_mrk,
311
-                         ),
312
-                     )
313
-                 );
314
-            }
315
-        )
316
-        ->setVersion();
317
-    }
318
-
319
-
320
-    /**
321
-     * registers assets for cleaning your ears
322
-     *
323
-     * @param JavascriptAsset $script
324
-     */
325
-    public function loadQtipJs(JavascriptAsset $script)
326
-    {
327
-        // qtip is turned OFF by default, but prior to the wp_enqueue_scripts hook,
328
-        // can be turned back on again via: add_filter('FHEE_load_qtip', '__return_true' );
329
-        if (
330
-            $script->handle() === CoreAssetManager::JS_HANDLE_EE_WP_PLUGINS_PAGE
331
-            && apply_filters('FHEE_load_qtip', false)
332
-        ) {
333
-            EEH_Qtip_Loader::instance()->register_and_enqueue();
334
-        }
335
-    }
336
-
337
-
338
-    /**
339
-     * assets that are used in the WordPress admin
340
-     *
341
-     * @since $VID:$
342
-     * @throws DuplicateCollectionIdentifierException
343
-     * @throws InvalidDataTypeException
344
-     * @throws InvalidEntityException
345
-     */
346
-    private function registerAdminAssets()
347
-    {
348
-        $this->addJavascript(
349
-            CoreAssetManager::JS_HANDLE_EE_WP_PLUGINS_PAGE,
350
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'wp-plugins-page'),
351
-            array(
352
-                CoreAssetManager::JS_HANDLE_JQUERY,
353
-                CoreAssetManager::JS_HANDLE_EE_VENDOR_REACT,
354
-            )
355
-        )
356
-        ->setRequiresTranslation();
357
-
358
-        $this->addStylesheet(
359
-            CoreAssetManager::JS_HANDLE_EE_WP_PLUGINS_PAGE,
360
-            $this->registry->getCssUrl($this->domain->assetNamespace(), 'wp-plugins-page')
361
-        );
362
-    }
31
+	// WordPress core / Third party JS asset handles
32
+	const JS_HANDLE_JQUERY                = 'jquery';
33
+
34
+	const JS_HANDLE_JQUERY_VALIDATE       = 'jquery-validate';
35
+
36
+	const JS_HANDLE_JQUERY_VALIDATE_EXTRA = 'jquery-validate-extra-methods';
37
+
38
+	const JS_HANDLE_UNDERSCORE            = 'underscore';
39
+
40
+	const JS_HANDLE_ACCOUNTING_CORE       = 'ee-accounting-core';
41
+
42
+	// EE JS assets handles
43
+	const JS_HANDLE_EE_MANIFEST        = 'ee-manifest';
44
+
45
+	const JS_HANDLE_EE_JS_CORE         = 'eejs-core';
46
+
47
+	const JS_HANDLE_EE_VENDOR_REACT    = 'ee-vendor-react';
48
+
49
+	const JS_HANDLE_EE_JS_API          = 'eejs-api';
50
+
51
+	const JS_HANDLE_EE_CORE            = 'espresso_core';
52
+
53
+	const JS_HANDLE_EE_I18N            = 'eei18n';
54
+
55
+	const JS_HANDLE_EE_ACCOUNTING      = 'ee-accounting';
56
+
57
+	const JS_HANDLE_EE_WP_PLUGINS_PAGE = 'ee-wp-plugins-page';
58
+
59
+	// EE CSS assets handles
60
+	const CSS_HANDLE_EE_DEFAULT = 'espresso_default';
61
+
62
+	const CSS_HANDLE_EE_CUSTOM  = 'espresso_custom_css';
63
+
64
+	/**
65
+	 * @var EE_Currency_Config $currency_config
66
+	 */
67
+	protected $currency_config;
68
+
69
+	/**
70
+	 * @var EE_Template_Config $template_config
71
+	 */
72
+	protected $template_config;
73
+
74
+
75
+	/**
76
+	 * CoreAssetRegister constructor.
77
+	 *
78
+	 * @param AssetCollection    $assets
79
+	 * @param EE_Currency_Config $currency_config
80
+	 * @param EE_Template_Config $template_config
81
+	 * @param DomainInterface    $domain
82
+	 * @param Registry           $registry
83
+	 */
84
+	public function __construct(
85
+		AssetCollection $assets,
86
+		EE_Currency_Config $currency_config,
87
+		EE_Template_Config $template_config,
88
+		DomainInterface $domain,
89
+		Registry $registry
90
+	) {
91
+		$this->currency_config = $currency_config;
92
+		$this->template_config = $template_config;
93
+		parent::__construct($domain, $assets, $registry);
94
+	}
95
+
96
+
97
+	/**
98
+	 * @since $VID:$
99
+	 * @throws DuplicateCollectionIdentifierException
100
+	 * @throws InvalidArgumentException
101
+	 * @throws InvalidDataTypeException
102
+	 * @throws InvalidEntityException
103
+	 */
104
+	public function addAssets()
105
+	{
106
+		$this->addJavascriptFiles();
107
+		$this->addStylesheetFiles();
108
+	}
109
+
110
+
111
+	/**
112
+	 * @since $VID:$
113
+	 * @throws DuplicateCollectionIdentifierException
114
+	 * @throws InvalidArgumentException
115
+	 * @throws InvalidDataTypeException
116
+	 * @throws InvalidEntityException
117
+	 */
118
+	public function addJavascriptFiles()
119
+	{
120
+		$this->loadCoreJs();
121
+		$this->loadJqueryValidate();
122
+		$this->loadAccountingJs();
123
+		add_action(
124
+			'AHEE__EventEspresso_core_services_assets_Registry__registerScripts__before_script',
125
+			array($this, 'loadQtipJs')
126
+		);
127
+		$this->registerAdminAssets();
128
+	}
129
+
130
+
131
+	/**
132
+	 * @since $VID:$
133
+	 * @throws DuplicateCollectionIdentifierException
134
+	 * @throws InvalidDataTypeException
135
+	 * @throws InvalidEntityException
136
+	 */
137
+	public function addStylesheetFiles()
138
+	{
139
+		$this->loadCoreCss();
140
+	}
141
+
142
+
143
+	/**
144
+	 * core default javascript
145
+	 *
146
+	 * @since $VID:$
147
+	 * @throws DuplicateCollectionIdentifierException
148
+	 * @throws InvalidArgumentException
149
+	 * @throws InvalidDataTypeException
150
+	 * @throws InvalidEntityException
151
+	 */
152
+	private function loadCoreJs()
153
+	{
154
+		$this->addJavascript(
155
+			CoreAssetManager::JS_HANDLE_EE_MANIFEST,
156
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'manifest')
157
+		);
158
+
159
+		$this->addJavascript(
160
+			CoreAssetManager::JS_HANDLE_EE_JS_CORE,
161
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'eejs'),
162
+			array(CoreAssetManager::JS_HANDLE_EE_MANIFEST)
163
+		)
164
+		->setRequiresTranslation()
165
+		->setHasLocalizedData();
166
+
167
+		$this->addJavascript(
168
+			CoreAssetManager::JS_HANDLE_EE_VENDOR_REACT,
169
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'reactVendor'),
170
+			array(CoreAssetManager::JS_HANDLE_EE_JS_CORE)
171
+		);
172
+
173
+		global $wp_version;
174
+		if (version_compare($wp_version, '4.4.0', '>')) {
175
+			//js.api
176
+			$this->addJavascript(
177
+				CoreAssetManager::JS_HANDLE_EE_JS_API,
178
+				EE_LIBRARIES_URL . 'rest_api/assets/js/eejs-api.min.js',
179
+				array(
180
+					CoreAssetManager::JS_HANDLE_UNDERSCORE,
181
+					CoreAssetManager::JS_HANDLE_EE_JS_CORE
182
+				)
183
+			);
184
+			$this->registry->addData('eejs_api_nonce', wp_create_nonce('wp_rest'));
185
+			$this->registry->addData(
186
+				'paths',
187
+				array(
188
+					'rest_route' => rest_url('ee/v4.8.36/'),
189
+					'collection_endpoints' => EED_Core_Rest_Api::getCollectionRoutesIndexedByModelName(),
190
+				)
191
+			);
192
+		}
193
+
194
+		$this->addJavascript(
195
+			CoreAssetManager::JS_HANDLE_EE_CORE,
196
+			EE_GLOBAL_ASSETS_URL . 'scripts/espresso_core.js',
197
+			array(CoreAssetManager::JS_HANDLE_JQUERY)
198
+		)
199
+		->setLocalizationCallback(
200
+			function () {
201
+				wp_localize_script(
202
+					CoreAssetManager::JS_HANDLE_EE_CORE,
203
+					CoreAssetManager::JS_HANDLE_EE_I18N,
204
+					EE_Registry::$i18n_js_strings
205
+				);
206
+			}
207
+		);
208
+	}
209
+
210
+
211
+	/**
212
+	 * @since $VID:$
213
+	 * @throws DuplicateCollectionIdentifierException
214
+	 * @throws InvalidDataTypeException
215
+	 * @throws InvalidEntityException
216
+	 */
217
+	private function loadCoreCss()
218
+	{
219
+		if ($this->template_config->enable_default_style && ! is_admin()) {
220
+			$this->addStylesheet(
221
+				CoreAssetManager::CSS_HANDLE_EE_DEFAULT,
222
+				is_readable(EVENT_ESPRESSO_UPLOAD_DIR . 'css/style.css')
223
+					? EVENT_ESPRESSO_UPLOAD_DIR . 'css/espresso_default.css'
224
+					: EE_GLOBAL_ASSETS_URL . 'css/espresso_default.css',
225
+				array('dashicons')
226
+			);
227
+			//Load custom style sheet if available
228
+			if ($this->template_config->custom_style_sheet !== null) {
229
+				$this->addStylesheet(
230
+					CoreAssetManager::CSS_HANDLE_EE_CUSTOM,
231
+					EVENT_ESPRESSO_UPLOAD_URL . 'css/' . $this->template_config->custom_style_sheet,
232
+					array(CoreAssetManager::CSS_HANDLE_EE_DEFAULT)
233
+				);
234
+			}
235
+		}
236
+	}
237
+
238
+
239
+	/**
240
+	 * jQuery Validate for form validation
241
+	 *
242
+	 * @since $VID:$
243
+	 * @throws DuplicateCollectionIdentifierException
244
+	 * @throws InvalidDataTypeException
245
+	 * @throws InvalidEntityException
246
+	 */
247
+	private function loadJqueryValidate()
248
+	{
249
+		$this->addJavascript(
250
+			CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE,
251
+			EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.min.js',
252
+			array(CoreAssetManager::JS_HANDLE_JQUERY)
253
+		)
254
+		->setVersion('1.15.0');
255
+
256
+		$this->addJavascript(
257
+			CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE_EXTRA,
258
+			EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.additional-methods.min.js',
259
+			array(CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE)
260
+		)
261
+		->setVersion('1.15.0');
262
+	}
263
+
264
+
265
+	/**
266
+	 * accounting.js for performing client-side calculations
267
+	 *
268
+	 * @since $VID:$
269
+	 * @throws DuplicateCollectionIdentifierException
270
+	 * @throws InvalidDataTypeException
271
+	 * @throws InvalidEntityException
272
+	 */
273
+	private function loadAccountingJs()
274
+	{
275
+		//accounting.js library
276
+		// @link http://josscrowcroft.github.io/accounting.js/
277
+		$this->addJavascript(
278
+			CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE,
279
+			EE_THIRD_PARTY_URL . 'accounting/accounting.js',
280
+			array(CoreAssetManager::JS_HANDLE_UNDERSCORE)
281
+		)
282
+		->setVersion('0.3.2');
283
+
284
+		$currency_config = $this->currency_config;
285
+		$this->addJavascript(
286
+			CoreAssetManager::JS_HANDLE_EE_ACCOUNTING,
287
+			EE_GLOBAL_ASSETS_URL . 'scripts/ee-accounting-config.js',
288
+			array(CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE)
289
+		)
290
+		->setLocalizationCallback(
291
+			function () use ($currency_config) {
292
+				 wp_localize_script(
293
+					 CoreAssetManager::JS_HANDLE_EE_ACCOUNTING,
294
+					 'EE_ACCOUNTING_CFG',
295
+					 array(
296
+						 'currency' => array(
297
+							 'symbol'    => $currency_config->sign,
298
+							 'format'    => array(
299
+								 'pos'  => $currency_config->sign_b4 ? '%s%v' : '%v%s',
300
+								 'neg'  => $currency_config->sign_b4 ? '- %s%v' : '- %v%s',
301
+								 'zero' => $currency_config->sign_b4 ? '%s--' : '--%s',
302
+							 ),
303
+							 'decimal'   => $currency_config->dec_mrk,
304
+							 'thousand'  => $currency_config->thsnds,
305
+							 'precision' => $currency_config->dec_plc,
306
+						 ),
307
+						 'number'   => array(
308
+							 'precision' => $currency_config->dec_plc,
309
+							 'thousand'  => $currency_config->thsnds,
310
+							 'decimal'   => $currency_config->dec_mrk,
311
+						 ),
312
+					 )
313
+				 );
314
+			}
315
+		)
316
+		->setVersion();
317
+	}
318
+
319
+
320
+	/**
321
+	 * registers assets for cleaning your ears
322
+	 *
323
+	 * @param JavascriptAsset $script
324
+	 */
325
+	public function loadQtipJs(JavascriptAsset $script)
326
+	{
327
+		// qtip is turned OFF by default, but prior to the wp_enqueue_scripts hook,
328
+		// can be turned back on again via: add_filter('FHEE_load_qtip', '__return_true' );
329
+		if (
330
+			$script->handle() === CoreAssetManager::JS_HANDLE_EE_WP_PLUGINS_PAGE
331
+			&& apply_filters('FHEE_load_qtip', false)
332
+		) {
333
+			EEH_Qtip_Loader::instance()->register_and_enqueue();
334
+		}
335
+	}
336
+
337
+
338
+	/**
339
+	 * assets that are used in the WordPress admin
340
+	 *
341
+	 * @since $VID:$
342
+	 * @throws DuplicateCollectionIdentifierException
343
+	 * @throws InvalidDataTypeException
344
+	 * @throws InvalidEntityException
345
+	 */
346
+	private function registerAdminAssets()
347
+	{
348
+		$this->addJavascript(
349
+			CoreAssetManager::JS_HANDLE_EE_WP_PLUGINS_PAGE,
350
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'wp-plugins-page'),
351
+			array(
352
+				CoreAssetManager::JS_HANDLE_JQUERY,
353
+				CoreAssetManager::JS_HANDLE_EE_VENDOR_REACT,
354
+			)
355
+		)
356
+		->setRequiresTranslation();
357
+
358
+		$this->addStylesheet(
359
+			CoreAssetManager::JS_HANDLE_EE_WP_PLUGINS_PAGE,
360
+			$this->registry->getCssUrl($this->domain->assetNamespace(), 'wp-plugins-page')
361
+		);
362
+	}
363 363
 }
Please login to merge, or discard this patch.
espresso.php 1 patch
Indentation   +80 added lines, -80 removed lines patch added patch discarded remove patch
@@ -38,103 +38,103 @@
 block discarded – undo
38 38
  * @since           4.0
39 39
  */
40 40
 if (function_exists('espresso_version')) {
41
-    if (! function_exists('espresso_duplicate_plugin_error')) {
42
-        /**
43
-         *    espresso_duplicate_plugin_error
44
-         *    displays if more than one version of EE is activated at the same time
45
-         */
46
-        function espresso_duplicate_plugin_error()
47
-        {
48
-            ?>
41
+	if (! function_exists('espresso_duplicate_plugin_error')) {
42
+		/**
43
+		 *    espresso_duplicate_plugin_error
44
+		 *    displays if more than one version of EE is activated at the same time
45
+		 */
46
+		function espresso_duplicate_plugin_error()
47
+		{
48
+			?>
49 49
             <div class="error">
50 50
                 <p>
51 51
                     <?php
52
-                    echo esc_html__(
53
-                        'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
-                        'event_espresso'
55
-                    ); ?>
52
+					echo esc_html__(
53
+						'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
+						'event_espresso'
55
+					); ?>
56 56
                 </p>
57 57
             </div>
58 58
             <?php
59
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
60
-        }
61
-    }
62
-    add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
59
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
60
+		}
61
+	}
62
+	add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
63 63
 } else {
64
-    define('EE_MIN_PHP_VER_REQUIRED', '5.4.0');
65
-    if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
-        /**
67
-         * espresso_minimum_php_version_error
68
-         *
69
-         * @return void
70
-         */
71
-        function espresso_minimum_php_version_error()
72
-        {
73
-            ?>
64
+	define('EE_MIN_PHP_VER_REQUIRED', '5.4.0');
65
+	if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
+		/**
67
+		 * espresso_minimum_php_version_error
68
+		 *
69
+		 * @return void
70
+		 */
71
+		function espresso_minimum_php_version_error()
72
+		{
73
+			?>
74 74
             <div class="error">
75 75
                 <p>
76 76
                     <?php
77
-                    printf(
78
-                        esc_html__(
79
-                            'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
-                            'event_espresso'
81
-                        ),
82
-                        EE_MIN_PHP_VER_REQUIRED,
83
-                        PHP_VERSION,
84
-                        '<br/>',
85
-                        '<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
-                    );
87
-                    ?>
77
+					printf(
78
+						esc_html__(
79
+							'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
+							'event_espresso'
81
+						),
82
+						EE_MIN_PHP_VER_REQUIRED,
83
+						PHP_VERSION,
84
+						'<br/>',
85
+						'<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
+					);
87
+					?>
88 88
                 </p>
89 89
             </div>
90 90
             <?php
91
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
92
-        }
91
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
92
+		}
93 93
 
94
-        add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
-    } else {
96
-        define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
97
-        /**
98
-         * espresso_version
99
-         * Returns the plugin version
100
-         *
101
-         * @return string
102
-         */
103
-        function espresso_version()
104
-        {
105
-            return apply_filters('FHEE__espresso__espresso_version', '4.9.62.rc.057');
106
-        }
94
+		add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
+	} else {
96
+		define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
97
+		/**
98
+		 * espresso_version
99
+		 * Returns the plugin version
100
+		 *
101
+		 * @return string
102
+		 */
103
+		function espresso_version()
104
+		{
105
+			return apply_filters('FHEE__espresso__espresso_version', '4.9.62.rc.057');
106
+		}
107 107
 
108
-        /**
109
-         * espresso_plugin_activation
110
-         * adds a wp-option to indicate that EE has been activated via the WP admin plugins page
111
-         */
112
-        function espresso_plugin_activation()
113
-        {
114
-            update_option('ee_espresso_activation', true);
115
-        }
108
+		/**
109
+		 * espresso_plugin_activation
110
+		 * adds a wp-option to indicate that EE has been activated via the WP admin plugins page
111
+		 */
112
+		function espresso_plugin_activation()
113
+		{
114
+			update_option('ee_espresso_activation', true);
115
+		}
116 116
 
117
-        register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
117
+		register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
118 118
 
119
-        require_once __DIR__ . '/core/bootstrap_espresso.php';
120
-        bootstrap_espresso();
121
-    }
119
+		require_once __DIR__ . '/core/bootstrap_espresso.php';
120
+		bootstrap_espresso();
121
+	}
122 122
 }
123 123
 if (! function_exists('espresso_deactivate_plugin')) {
124
-    /**
125
-     *    deactivate_plugin
126
-     * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
127
-     *
128
-     * @access public
129
-     * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
130
-     * @return    void
131
-     */
132
-    function espresso_deactivate_plugin($plugin_basename = '')
133
-    {
134
-        if (! function_exists('deactivate_plugins')) {
135
-            require_once ABSPATH . 'wp-admin/includes/plugin.php';
136
-        }
137
-        unset($_GET['activate'], $_REQUEST['activate']);
138
-        deactivate_plugins($plugin_basename);
139
-    }
124
+	/**
125
+	 *    deactivate_plugin
126
+	 * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
127
+	 *
128
+	 * @access public
129
+	 * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
130
+	 * @return    void
131
+	 */
132
+	function espresso_deactivate_plugin($plugin_basename = '')
133
+	{
134
+		if (! function_exists('deactivate_plugins')) {
135
+			require_once ABSPATH . 'wp-admin/includes/plugin.php';
136
+		}
137
+		unset($_GET['activate'], $_REQUEST['activate']);
138
+		deactivate_plugins($plugin_basename);
139
+	}
140 140
 }
Please login to merge, or discard this patch.
core/EE_Dependency_Map.core.php 1 patch
Indentation   +963 added lines, -963 removed lines patch added patch discarded remove patch
@@ -20,967 +20,967 @@
 block discarded – undo
20 20
 class EE_Dependency_Map
21 21
 {
22 22
 
23
-    /**
24
-     * This means that the requested class dependency is not present in the dependency map
25
-     */
26
-    const not_registered = 0;
27
-
28
-    /**
29
-     * This instructs class loaders to ALWAYS return a newly instantiated object for the requested class.
30
-     */
31
-    const load_new_object = 1;
32
-
33
-    /**
34
-     * This instructs class loaders to return a previously instantiated and cached object for the requested class.
35
-     * IF a previously instantiated object does not exist, a new one will be created and added to the cache.
36
-     */
37
-    const load_from_cache = 2;
38
-
39
-    /**
40
-     * When registering a dependency,
41
-     * this indicates to keep any existing dependencies that already exist,
42
-     * and simply discard any new dependencies declared in the incoming data
43
-     */
44
-    const KEEP_EXISTING_DEPENDENCIES = 0;
45
-
46
-    /**
47
-     * When registering a dependency,
48
-     * this indicates to overwrite any existing dependencies that already exist using the incoming data
49
-     */
50
-    const OVERWRITE_DEPENDENCIES = 1;
51
-
52
-
53
-    /**
54
-     * @type EE_Dependency_Map $_instance
55
-     */
56
-    protected static $_instance;
57
-
58
-    /**
59
-     * @var ClassInterfaceCache $class_cache
60
-     */
61
-    private $class_cache;
62
-
63
-    /**
64
-     * @type RequestInterface $request
65
-     */
66
-    protected $request;
67
-
68
-    /**
69
-     * @type LegacyRequestInterface $legacy_request
70
-     */
71
-    protected $legacy_request;
72
-
73
-    /**
74
-     * @type ResponseInterface $response
75
-     */
76
-    protected $response;
77
-
78
-    /**
79
-     * @type LoaderInterface $loader
80
-     */
81
-    protected $loader;
82
-
83
-    /**
84
-     * @type array $_dependency_map
85
-     */
86
-    protected $_dependency_map = array();
87
-
88
-    /**
89
-     * @type array $_class_loaders
90
-     */
91
-    protected $_class_loaders = array();
92
-
93
-
94
-    /**
95
-     * EE_Dependency_Map constructor.
96
-     *
97
-     * @param ClassInterfaceCache $class_cache
98
-     */
99
-    protected function __construct(ClassInterfaceCache $class_cache)
100
-    {
101
-        $this->class_cache = $class_cache;
102
-        do_action('EE_Dependency_Map____construct', $this);
103
-    }
104
-
105
-
106
-    /**
107
-     * @return void
108
-     */
109
-    public function initialize()
110
-    {
111
-        $this->_register_core_dependencies();
112
-        $this->_register_core_class_loaders();
113
-        $this->_register_core_aliases();
114
-    }
115
-
116
-
117
-    /**
118
-     * @singleton method used to instantiate class object
119
-     * @param ClassInterfaceCache|null $class_cache
120
-     * @return EE_Dependency_Map
121
-     */
122
-    public static function instance(ClassInterfaceCache $class_cache = null)
123
-    {
124
-        // check if class object is instantiated, and instantiated properly
125
-        if (! self::$_instance instanceof EE_Dependency_Map
126
-            && $class_cache instanceof ClassInterfaceCache
127
-        ) {
128
-            self::$_instance = new EE_Dependency_Map($class_cache);
129
-        }
130
-        return self::$_instance;
131
-    }
132
-
133
-
134
-    /**
135
-     * @param RequestInterface $request
136
-     */
137
-    public function setRequest(RequestInterface $request)
138
-    {
139
-        $this->request = $request;
140
-    }
141
-
142
-
143
-    /**
144
-     * @param LegacyRequestInterface $legacy_request
145
-     */
146
-    public function setLegacyRequest(LegacyRequestInterface $legacy_request)
147
-    {
148
-        $this->legacy_request = $legacy_request;
149
-    }
150
-
151
-
152
-    /**
153
-     * @param ResponseInterface $response
154
-     */
155
-    public function setResponse(ResponseInterface $response)
156
-    {
157
-        $this->response = $response;
158
-    }
159
-
160
-
161
-    /**
162
-     * @param LoaderInterface $loader
163
-     */
164
-    public function setLoader(LoaderInterface $loader)
165
-    {
166
-        $this->loader = $loader;
167
-    }
168
-
169
-
170
-    /**
171
-     * @param string $class
172
-     * @param array  $dependencies
173
-     * @param int    $overwrite
174
-     * @return bool
175
-     */
176
-    public static function register_dependencies(
177
-        $class,
178
-        array $dependencies,
179
-        $overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
180
-    ) {
181
-        return self::$_instance->registerDependencies($class, $dependencies, $overwrite);
182
-    }
183
-
184
-
185
-    /**
186
-     * Assigns an array of class names and corresponding load sources (new or cached)
187
-     * to the class specified by the first parameter.
188
-     * IMPORTANT !!!
189
-     * The order of elements in the incoming $dependencies array MUST match
190
-     * the order of the constructor parameters for the class in question.
191
-     * This is especially important when overriding any existing dependencies that are registered.
192
-     * the third parameter controls whether any duplicate dependencies are overwritten or not.
193
-     *
194
-     * @param string $class
195
-     * @param array  $dependencies
196
-     * @param int    $overwrite
197
-     * @return bool
198
-     */
199
-    public function registerDependencies(
200
-        $class,
201
-        array $dependencies,
202
-        $overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
203
-    ) {
204
-        $class = trim($class, '\\');
205
-        $registered = false;
206
-        if (empty(self::$_instance->_dependency_map[ $class ])) {
207
-            self::$_instance->_dependency_map[ $class ] = array();
208
-        }
209
-        // we need to make sure that any aliases used when registering a dependency
210
-        // get resolved to the correct class name
211
-        foreach ($dependencies as $dependency => $load_source) {
212
-            $alias = self::$_instance->getFqnForAlias($dependency);
213
-            if ($overwrite === EE_Dependency_Map::OVERWRITE_DEPENDENCIES
214
-                || ! isset(self::$_instance->_dependency_map[ $class ][ $alias ])
215
-            ) {
216
-                unset($dependencies[ $dependency ]);
217
-                $dependencies[ $alias ] = $load_source;
218
-                $registered = true;
219
-            }
220
-        }
221
-        // now add our two lists of dependencies together.
222
-        // using Union (+=) favours the arrays in precedence from left to right,
223
-        // so $dependencies is NOT overwritten because it is listed first
224
-        // ie: with A = B + C, entries in B take precedence over duplicate entries in C
225
-        // Union is way faster than array_merge() but should be used with caution...
226
-        // especially with numerically indexed arrays
227
-        $dependencies += self::$_instance->_dependency_map[ $class ];
228
-        // now we need to ensure that the resulting dependencies
229
-        // array only has the entries that are required for the class
230
-        // so first count how many dependencies were originally registered for the class
231
-        $dependency_count = count(self::$_instance->_dependency_map[ $class ]);
232
-        // if that count is non-zero (meaning dependencies were already registered)
233
-        self::$_instance->_dependency_map[ $class ] = $dependency_count
234
-            // then truncate the  final array to match that count
235
-            ? array_slice($dependencies, 0, $dependency_count)
236
-            // otherwise just take the incoming array because nothing previously existed
237
-            : $dependencies;
238
-        return $registered;
239
-    }
240
-
241
-
242
-    /**
243
-     * @param string $class_name
244
-     * @param string $loader
245
-     * @return bool
246
-     * @throws DomainException
247
-     */
248
-    public static function register_class_loader($class_name, $loader = 'load_core')
249
-    {
250
-        if (! $loader instanceof Closure && strpos($class_name, '\\') !== false) {
251
-            throw new DomainException(
252
-                esc_html__('Don\'t use class loaders for FQCNs.', 'event_espresso')
253
-            );
254
-        }
255
-        // check that loader is callable or method starts with "load_" and exists in EE_Registry
256
-        if (! is_callable($loader)
257
-            && (
258
-                strpos($loader, 'load_') !== 0
259
-                || ! method_exists('EE_Registry', $loader)
260
-            )
261
-        ) {
262
-            throw new DomainException(
263
-                sprintf(
264
-                    esc_html__(
265
-                        '"%1$s" is not a valid loader method on EE_Registry.',
266
-                        'event_espresso'
267
-                    ),
268
-                    $loader
269
-                )
270
-            );
271
-        }
272
-        $class_name = self::$_instance->getFqnForAlias($class_name);
273
-        if (! isset(self::$_instance->_class_loaders[ $class_name ])) {
274
-            self::$_instance->_class_loaders[ $class_name ] = $loader;
275
-            return true;
276
-        }
277
-        return false;
278
-    }
279
-
280
-
281
-    /**
282
-     * @return array
283
-     */
284
-    public function dependency_map()
285
-    {
286
-        return $this->_dependency_map;
287
-    }
288
-
289
-
290
-    /**
291
-     * returns TRUE if dependency map contains a listing for the provided class name
292
-     *
293
-     * @param string $class_name
294
-     * @return boolean
295
-     */
296
-    public function has($class_name = '')
297
-    {
298
-        // all legacy models have the same dependencies
299
-        if (strpos($class_name, 'EEM_') === 0) {
300
-            $class_name = 'LEGACY_MODELS';
301
-        }
302
-        return isset($this->_dependency_map[ $class_name ]) ? true : false;
303
-    }
304
-
305
-
306
-    /**
307
-     * returns TRUE if dependency map contains a listing for the provided class name AND dependency
308
-     *
309
-     * @param string $class_name
310
-     * @param string $dependency
311
-     * @return bool
312
-     */
313
-    public function has_dependency_for_class($class_name = '', $dependency = '')
314
-    {
315
-        // all legacy models have the same dependencies
316
-        if (strpos($class_name, 'EEM_') === 0) {
317
-            $class_name = 'LEGACY_MODELS';
318
-        }
319
-        $dependency = $this->getFqnForAlias($dependency, $class_name);
320
-        return isset($this->_dependency_map[ $class_name ][ $dependency ])
321
-            ? true
322
-            : false;
323
-    }
324
-
325
-
326
-    /**
327
-     * returns loading strategy for whether a previously cached dependency should be loaded or a new instance returned
328
-     *
329
-     * @param string $class_name
330
-     * @param string $dependency
331
-     * @return int
332
-     */
333
-    public function loading_strategy_for_class_dependency($class_name = '', $dependency = '')
334
-    {
335
-        // all legacy models have the same dependencies
336
-        if (strpos($class_name, 'EEM_') === 0) {
337
-            $class_name = 'LEGACY_MODELS';
338
-        }
339
-        $dependency = $this->getFqnForAlias($dependency);
340
-        return $this->has_dependency_for_class($class_name, $dependency)
341
-            ? $this->_dependency_map[ $class_name ][ $dependency ]
342
-            : EE_Dependency_Map::not_registered;
343
-    }
344
-
345
-
346
-    /**
347
-     * @param string $class_name
348
-     * @return string | Closure
349
-     */
350
-    public function class_loader($class_name)
351
-    {
352
-        // all legacy models use load_model()
353
-        if (strpos($class_name, 'EEM_') === 0) {
354
-            return 'load_model';
355
-        }
356
-        $class_name = $this->getFqnForAlias($class_name);
357
-        return isset($this->_class_loaders[ $class_name ]) ? $this->_class_loaders[ $class_name ] : '';
358
-    }
359
-
360
-
361
-    /**
362
-     * @return array
363
-     */
364
-    public function class_loaders()
365
-    {
366
-        return $this->_class_loaders;
367
-    }
368
-
369
-
370
-    /**
371
-     * adds an alias for a classname
372
-     *
373
-     * @param string $fqcn      the class name that should be used (concrete class to replace interface)
374
-     * @param string $alias     the class name that would be type hinted for (abstract parent or interface)
375
-     * @param string $for_class the class that has the dependency (is type hinting for the interface)
376
-     */
377
-    public function add_alias($fqcn, $alias, $for_class = '')
378
-    {
379
-        $this->class_cache->addAlias($fqcn, $alias, $for_class);
380
-    }
381
-
382
-
383
-    /**
384
-     * Returns TRUE if the provided fully qualified name IS an alias
385
-     * WHY?
386
-     * Because if a class is type hinting for a concretion,
387
-     * then why would we need to find another class to supply it?
388
-     * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`,
389
-     * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`.
390
-     * Don't go looking for some substitute.
391
-     * Whereas if a class is type hinting for an interface...
392
-     * then we need to find an actual class to use.
393
-     * So the interface IS the alias for some other FQN,
394
-     * and we need to find out if `Fully/Qualified/Namespace/SomeInterface`
395
-     * represents some other class.
396
-     *
397
-     * @param string $fqn
398
-     * @param string $for_class
399
-     * @return bool
400
-     */
401
-    public function isAlias($fqn = '', $for_class = '')
402
-    {
403
-        return $this->class_cache->isAlias($fqn, $for_class);
404
-    }
405
-
406
-
407
-    /**
408
-     * Returns a FQN for provided alias if one exists, otherwise returns the original $alias
409
-     * functions recursively, so that multiple aliases can be used to drill down to a FQN
410
-     *  for example:
411
-     *      if the following two entries were added to the _aliases array:
412
-     *          array(
413
-     *              'interface_alias'           => 'some\namespace\interface'
414
-     *              'some\namespace\interface'  => 'some\namespace\classname'
415
-     *          )
416
-     *      then one could use EE_Registry::instance()->create( 'interface_alias' )
417
-     *      to load an instance of 'some\namespace\classname'
418
-     *
419
-     * @param string $alias
420
-     * @param string $for_class
421
-     * @return string
422
-     */
423
-    public function getFqnForAlias($alias = '', $for_class = '')
424
-    {
425
-        return (string) $this->class_cache->getFqnForAlias($alias, $for_class);
426
-    }
427
-
428
-
429
-    /**
430
-     * Registers the core dependencies and whether a previously instantiated object should be loaded from the cache,
431
-     * if one exists, or whether a new object should be generated every time the requested class is loaded.
432
-     * This is done by using the following class constants:
433
-     *        EE_Dependency_Map::load_from_cache - loads previously instantiated object
434
-     *        EE_Dependency_Map::load_new_object - generates a new object every time
435
-     */
436
-    protected function _register_core_dependencies()
437
-    {
438
-        $this->_dependency_map = array(
439
-            'EE_Request_Handler'                                                                                          => array(
440
-                'EE_Request' => EE_Dependency_Map::load_from_cache,
441
-            ),
442
-            'EE_System'                                                                                                   => array(
443
-                'EE_Registry'                                 => EE_Dependency_Map::load_from_cache,
444
-                'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
445
-                'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
446
-                'EE_Maintenance_Mode'                         => EE_Dependency_Map::load_from_cache,
447
-            ),
448
-            'EE_Session'                                                                                                  => array(
449
-                'EventEspresso\core\services\cache\TransientCacheStorage'  => EE_Dependency_Map::load_from_cache,
450
-                'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache,
451
-                'EventEspresso\core\services\request\Request'              => EE_Dependency_Map::load_from_cache,
452
-                'EE_Encryption'                                            => EE_Dependency_Map::load_from_cache,
453
-            ),
454
-            'EE_Cart'                                                                                                     => array(
455
-                'EE_Session' => EE_Dependency_Map::load_from_cache,
456
-            ),
457
-            'EE_Front_Controller'                                                                                         => array(
458
-                'EE_Registry'              => EE_Dependency_Map::load_from_cache,
459
-                'EE_Request_Handler'       => EE_Dependency_Map::load_from_cache,
460
-                'EE_Module_Request_Router' => EE_Dependency_Map::load_from_cache,
461
-            ),
462
-            'EE_Messenger_Collection_Loader'                                                                              => array(
463
-                'EE_Messenger_Collection' => EE_Dependency_Map::load_new_object,
464
-            ),
465
-            'EE_Message_Type_Collection_Loader'                                                                           => array(
466
-                'EE_Message_Type_Collection' => EE_Dependency_Map::load_new_object,
467
-            ),
468
-            'EE_Message_Resource_Manager'                                                                                 => array(
469
-                'EE_Messenger_Collection_Loader'    => EE_Dependency_Map::load_new_object,
470
-                'EE_Message_Type_Collection_Loader' => EE_Dependency_Map::load_new_object,
471
-                'EEM_Message_Template_Group'        => EE_Dependency_Map::load_from_cache,
472
-            ),
473
-            'EE_Message_Factory'                                                                                          => array(
474
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
475
-            ),
476
-            'EE_messages'                                                                                                 => array(
477
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
478
-            ),
479
-            'EE_Messages_Generator'                                                                                       => array(
480
-                'EE_Messages_Queue'                    => EE_Dependency_Map::load_new_object,
481
-                'EE_Messages_Data_Handler_Collection'  => EE_Dependency_Map::load_new_object,
482
-                'EE_Message_Template_Group_Collection' => EE_Dependency_Map::load_new_object,
483
-                'EEH_Parse_Shortcodes'                 => EE_Dependency_Map::load_from_cache,
484
-            ),
485
-            'EE_Messages_Processor'                                                                                       => array(
486
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
487
-            ),
488
-            'EE_Messages_Queue'                                                                                           => array(
489
-                'EE_Message_Repository' => EE_Dependency_Map::load_new_object,
490
-            ),
491
-            'EE_Messages_Template_Defaults'                                                                               => array(
492
-                'EEM_Message_Template_Group' => EE_Dependency_Map::load_from_cache,
493
-                'EEM_Message_Template'       => EE_Dependency_Map::load_from_cache,
494
-            ),
495
-            'EE_Message_To_Generate_From_Request'                                                                         => array(
496
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
497
-                'EE_Request_Handler'          => EE_Dependency_Map::load_from_cache,
498
-            ),
499
-            'EventEspresso\core\services\commands\CommandBus'                                                             => array(
500
-                'EventEspresso\core\services\commands\CommandHandlerManager' => EE_Dependency_Map::load_from_cache,
501
-            ),
502
-            'EventEspresso\services\commands\CommandHandler'                                                              => array(
503
-                'EE_Registry'         => EE_Dependency_Map::load_from_cache,
504
-                'CommandBusInterface' => EE_Dependency_Map::load_from_cache,
505
-            ),
506
-            'EventEspresso\core\services\commands\CommandHandlerManager'                                                  => array(
507
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
508
-            ),
509
-            'EventEspresso\core\services\commands\CompositeCommandHandler'                                                => array(
510
-                'EventEspresso\core\services\commands\CommandBus'     => EE_Dependency_Map::load_from_cache,
511
-                'EventEspresso\core\services\commands\CommandFactory' => EE_Dependency_Map::load_from_cache,
512
-            ),
513
-            'EventEspresso\core\services\commands\CommandFactory'                                                         => array(
514
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
515
-            ),
516
-            'EventEspresso\core\services\commands\middleware\CapChecker'                                                  => array(
517
-                'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
518
-            ),
519
-            'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker'                                         => array(
520
-                'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
521
-            ),
522
-            'EventEspresso\core\domain\services\capabilities\RegistrationsCapChecker'                                     => array(
523
-                'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
524
-            ),
525
-            'EventEspresso\core\services\commands\registration\CreateRegistrationCommandHandler'                          => array(
526
-                'EventEspresso\core\domain\services\registration\CreateRegistrationService' => EE_Dependency_Map::load_from_cache,
527
-            ),
528
-            'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommandHandler'                     => array(
529
-                'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
530
-            ),
531
-            'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommandHandler'                    => array(
532
-                'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
533
-            ),
534
-            'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler'         => array(
535
-                'EventEspresso\core\domain\services\registration\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
536
-            ),
537
-            'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler' => array(
538
-                'EventEspresso\core\domain\services\registration\UpdateRegistrationService' => EE_Dependency_Map::load_from_cache,
539
-            ),
540
-            'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommandHandler'                              => array(
541
-                'EventEspresso\core\domain\services\ticket\CreateTicketLineItemService' => EE_Dependency_Map::load_from_cache,
542
-            ),
543
-            'EventEspresso\core\services\commands\ticket\CancelTicketLineItemCommandHandler'                              => array(
544
-                'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
545
-            ),
546
-            'EventEspresso\core\domain\services\registration\CancelRegistrationService'                                   => array(
547
-                'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
548
-            ),
549
-            'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler'                                  => array(
550
-                'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
551
-            ),
552
-            'EventEspresso\core\services\database\TableManager'                                                           => array(
553
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
554
-            ),
555
-            'EE_Data_Migration_Class_Base'                                                                                => array(
556
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
557
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
558
-            ),
559
-            'EE_DMS_Core_4_1_0'                                                                                           => array(
560
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
561
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
562
-            ),
563
-            'EE_DMS_Core_4_2_0'                                                                                           => array(
564
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
565
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
566
-            ),
567
-            'EE_DMS_Core_4_3_0'                                                                                           => array(
568
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
569
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
570
-            ),
571
-            'EE_DMS_Core_4_4_0'                                                                                           => array(
572
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
573
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
574
-            ),
575
-            'EE_DMS_Core_4_5_0'                                                                                           => array(
576
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
577
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
578
-            ),
579
-            'EE_DMS_Core_4_6_0'                                                                                           => array(
580
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
581
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
582
-            ),
583
-            'EE_DMS_Core_4_7_0'                                                                                           => array(
584
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
585
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
586
-            ),
587
-            'EE_DMS_Core_4_8_0'                                                                                           => array(
588
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
589
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
590
-            ),
591
-            'EE_DMS_Core_4_9_0'                                                                                           => array(
592
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
593
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
594
-            ),
595
-            'EventEspresso\core\services\assets\I18nRegistry'                                                             => array(
596
-                array(),
597
-                'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
598
-            ),
599
-            'EventEspresso\core\services\assets\Registry'                                                                 => array(
600
-                'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache,
601
-                'EventEspresso\core\services\assets\I18nRegistry'    => EE_Dependency_Map::load_from_cache,
602
-            ),
603
-            'EventEspresso\core\domain\entities\shortcodes\EspressoCancelled'                                             => array(
604
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
605
-            ),
606
-            'EventEspresso\core\domain\entities\shortcodes\EspressoCheckout'                                              => array(
607
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
608
-            ),
609
-            'EventEspresso\core\domain\entities\shortcodes\EspressoEventAttendees'                                        => array(
610
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
611
-            ),
612
-            'EventEspresso\core\domain\entities\shortcodes\EspressoEvents'                                                => array(
613
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
614
-            ),
615
-            'EventEspresso\core\domain\entities\shortcodes\EspressoThankYou'                                              => array(
616
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
617
-            ),
618
-            'EventEspresso\core\domain\entities\shortcodes\EspressoTicketSelector'                                        => array(
619
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
620
-            ),
621
-            'EventEspresso\core\domain\entities\shortcodes\EspressoTxnPage'                                               => array(
622
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
623
-            ),
624
-            'EventEspresso\core\services\cache\BasicCacheManager'                                                         => array(
625
-                'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
626
-            ),
627
-            'EventEspresso\core\services\cache\PostRelatedCacheManager'                                                   => array(
628
-                'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
629
-            ),
630
-            'EventEspresso\core\domain\services\validation\email\EmailValidationService'                                  => array(
631
-                'EE_Registration_Config'                     => EE_Dependency_Map::load_from_cache,
632
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
633
-            ),
634
-            'EventEspresso\core\domain\values\EmailAddress'                                                               => array(
635
-                null,
636
-                'EventEspresso\core\domain\services\validation\email\EmailValidationService' => EE_Dependency_Map::load_from_cache,
637
-            ),
638
-            'EventEspresso\core\services\orm\ModelFieldFactory'                                                           => array(
639
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
640
-            ),
641
-            'LEGACY_MODELS'                                                                                               => array(
642
-                null,
643
-                'EventEspresso\core\services\database\ModelFieldFactory' => EE_Dependency_Map::load_from_cache,
644
-            ),
645
-            'EE_Module_Request_Router'                                                                                    => array(
646
-                'EE_Request' => EE_Dependency_Map::load_from_cache,
647
-            ),
648
-            'EE_Registration_Processor'                                                                                   => array(
649
-                'EE_Request' => EE_Dependency_Map::load_from_cache,
650
-            ),
651
-            'EventEspresso\core\services\notifications\PersistentAdminNoticeManager'                                      => array(
652
-                null,
653
-                'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
654
-                'EE_Request'                                                          => EE_Dependency_Map::load_from_cache,
655
-            ),
656
-            'EventEspresso\core\services\licensing\LicenseService'                                                        => array(
657
-                'EventEspresso\core\domain\services\pue\Stats'  => EE_Dependency_Map::load_from_cache,
658
-                'EventEspresso\core\domain\services\pue\Config' => EE_Dependency_Map::load_from_cache,
659
-            ),
660
-            'EE_Admin_Transactions_List_Table'                                                                            => array(
661
-                null,
662
-                'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache,
663
-            ),
664
-            'EventEspresso\core\domain\services\pue\Stats'                                                                => array(
665
-                'EventEspresso\core\domain\services\pue\Config'        => EE_Dependency_Map::load_from_cache,
666
-                'EE_Maintenance_Mode'                                  => EE_Dependency_Map::load_from_cache,
667
-                'EventEspresso\core\domain\services\pue\StatsGatherer' => EE_Dependency_Map::load_from_cache,
668
-            ),
669
-            'EventEspresso\core\domain\services\pue\Config'                                                               => array(
670
-                'EE_Network_Config' => EE_Dependency_Map::load_from_cache,
671
-                'EE_Config'         => EE_Dependency_Map::load_from_cache,
672
-            ),
673
-            'EventEspresso\core\domain\services\pue\StatsGatherer'                                                        => array(
674
-                'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache,
675
-                'EEM_Event'          => EE_Dependency_Map::load_from_cache,
676
-                'EEM_Datetime'       => EE_Dependency_Map::load_from_cache,
677
-                'EEM_Ticket'         => EE_Dependency_Map::load_from_cache,
678
-                'EEM_Registration'   => EE_Dependency_Map::load_from_cache,
679
-                'EEM_Transaction'    => EE_Dependency_Map::load_from_cache,
680
-                'EE_Config'          => EE_Dependency_Map::load_from_cache,
681
-            ),
682
-            'EventEspresso\core\domain\services\admin\ExitModal'                                                          => array(
683
-                'EventEspresso\core\services\assets\Registry' => EE_Dependency_Map::load_from_cache,
684
-            ),
685
-            'EventEspresso\core\domain\services\admin\PluginUpsells'                                                      => array(
686
-                'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
687
-            ),
688
-            'EventEspresso\caffeinated\modules\recaptcha_invisible\InvisibleRecaptcha'                                    => array(
689
-                'EE_Registration_Config' => EE_Dependency_Map::load_from_cache,
690
-                'EE_Session'             => EE_Dependency_Map::load_from_cache,
691
-            ),
692
-            'EventEspresso\caffeinated\modules\recaptcha_invisible\RecaptchaAdminSettings'                                => array(
693
-                'EE_Registration_Config' => EE_Dependency_Map::load_from_cache,
694
-            ),
695
-            'EventEspresso\modules\ticket_selector\ProcessTicketSelector'                                                 => array(
696
-                'EE_Core_Config'                                                          => EE_Dependency_Map::load_from_cache,
697
-                'EventEspresso\core\services\request\Request'                             => EE_Dependency_Map::load_from_cache,
698
-                'EE_Session'                                                              => EE_Dependency_Map::load_from_cache,
699
-                'EEM_Ticket'                                                              => EE_Dependency_Map::load_from_cache,
700
-                'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker' => EE_Dependency_Map::load_from_cache,
701
-            ),
702
-            'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker'                                     => array(
703
-                'EEM_Datetime' => EE_Dependency_Map::load_from_cache,
704
-            ),
705
-            'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions'                              => array(
706
-                'EE_Core_Config'                             => EE_Dependency_Map::load_from_cache,
707
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
708
-            ),
709
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes'                                => array(
710
-                'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache,
711
-            ),
712
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies'                               => array(
713
-                'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache,
714
-            ),
715
-            'EE_CPT_Strategy'                                                                                             => array(
716
-                'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache,
717
-                'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache,
718
-            ),
719
-            'EventEspresso\core\services\loaders\ObjectIdentifier'                                                        => array(
720
-                'EventEspresso\core\services\loaders\ClassInterfaceCache' => EE_Dependency_Map::load_from_cache,
721
-            ),
722
-            'EventEspresso\core\domain\services\admin\privacy\policy\PrivacyPolicy' => array(
723
-                'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache,
724
-                'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache
725
-            ),
726
-            'EventEspresso\core\domain\entities\editor\blocks\CoreBlocksAssetManager'                                     => array(
727
-                'EventEspresso\core\domain\Domain'            => EE_Dependency_Map::load_from_cache,
728
-                'EventEspresso\core\services\assets\Registry' => EE_Dependency_Map::load_from_cache,
729
-            ),
730
-            'EventEspresso\core\services\assets\AssetManager'                                                             => array(
731
-                'EventEspresso\core\domain\Domain'                   => EE_Dependency_Map::load_from_cache,
732
-                'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache,
733
-                'EventEspresso\core\services\assets\Registry'        => EE_Dependency_Map::load_from_cache,
734
-            ),
735
-            'EventEspresso\core\domain\services\assets\CoreAssetManager'                                                  => array(
736
-                'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache,
737
-                'EE_Currency_Config'                                 => EE_Dependency_Map::load_from_cache,
738
-                'EE_Template_Config'                                 => EE_Dependency_Map::load_from_cache,
739
-                'EventEspresso\core\domain\Domain'                   => EE_Dependency_Map::load_from_cache,
740
-                'EventEspresso\core\services\assets\Registry'        => EE_Dependency_Map::load_from_cache,
741
-            ),
742
-            'EventEspresso\core\services\editor\BlockRegistrationManager'                                                 => array(
743
-                'EventEspresso\core\services\assets\BlockAssetManagerCollection' => EE_Dependency_Map::load_from_cache,
744
-                'EventEspresso\core\domain\entities\editor\BlockCollection'      => EE_Dependency_Map::load_from_cache,
745
-                'EventEspresso\core\services\request\Request'                    => EE_Dependency_Map::load_from_cache,
746
-            ),
747
-        );
748
-    }
749
-
750
-
751
-    /**
752
-     * Registers how core classes are loaded.
753
-     * This can either be done by simply providing the name of one of the EE_Registry loader methods such as:
754
-     *        'EE_Request_Handler' => 'load_core'
755
-     *        'EE_Messages_Queue'  => 'load_lib'
756
-     *        'EEH_Debug_Tools'    => 'load_helper'
757
-     * or, if greater control is required, by providing a custom closure. For example:
758
-     *        'Some_Class' => function () {
759
-     *            return new Some_Class();
760
-     *        },
761
-     * This is required for instantiating dependencies
762
-     * where an interface has been type hinted in a class constructor. For example:
763
-     *        'Required_Interface' => function () {
764
-     *            return new A_Class_That_Implements_Required_Interface();
765
-     *        },
766
-     */
767
-    protected function _register_core_class_loaders()
768
-    {
769
-        // for PHP5.3 compat, we need to register any properties called here in a variable because `$this` cannot
770
-        // be used in a closure.
771
-        $request = &$this->request;
772
-        $response = &$this->response;
773
-        $legacy_request = &$this->legacy_request;
774
-        // $loader = &$this->loader;
775
-        $this->_class_loaders = array(
776
-            // load_core
777
-            'EE_Capabilities'                              => 'load_core',
778
-            'EE_Encryption'                                => 'load_core',
779
-            'EE_Front_Controller'                          => 'load_core',
780
-            'EE_Module_Request_Router'                     => 'load_core',
781
-            'EE_Registry'                                  => 'load_core',
782
-            'EE_Request'                                   => function () use (&$legacy_request) {
783
-                return $legacy_request;
784
-            },
785
-            'EventEspresso\core\services\request\Request'  => function () use (&$request) {
786
-                return $request;
787
-            },
788
-            'EventEspresso\core\services\request\Response' => function () use (&$response) {
789
-                return $response;
790
-            },
791
-            'EE_Base'                                      => 'load_core',
792
-            'EE_Request_Handler'                           => 'load_core',
793
-            'EE_Session'                                   => 'load_core',
794
-            'EE_Cron_Tasks'                                => 'load_core',
795
-            'EE_System'                                    => 'load_core',
796
-            'EE_Maintenance_Mode'                          => 'load_core',
797
-            'EE_Register_CPTs'                             => 'load_core',
798
-            'EE_Admin'                                     => 'load_core',
799
-            'EE_CPT_Strategy'                              => 'load_core',
800
-            // load_lib
801
-            'EE_Message_Resource_Manager'                  => 'load_lib',
802
-            'EE_Message_Type_Collection'                   => 'load_lib',
803
-            'EE_Message_Type_Collection_Loader'            => 'load_lib',
804
-            'EE_Messenger_Collection'                      => 'load_lib',
805
-            'EE_Messenger_Collection_Loader'               => 'load_lib',
806
-            'EE_Messages_Processor'                        => 'load_lib',
807
-            'EE_Message_Repository'                        => 'load_lib',
808
-            'EE_Messages_Queue'                            => 'load_lib',
809
-            'EE_Messages_Data_Handler_Collection'          => 'load_lib',
810
-            'EE_Message_Template_Group_Collection'         => 'load_lib',
811
-            'EE_Payment_Method_Manager'                    => 'load_lib',
812
-            'EE_Messages_Generator'                        => function () {
813
-                return EE_Registry::instance()->load_lib(
814
-                    'Messages_Generator',
815
-                    array(),
816
-                    false,
817
-                    false
818
-                );
819
-            },
820
-            'EE_Messages_Template_Defaults'                => function ($arguments = array()) {
821
-                return EE_Registry::instance()->load_lib(
822
-                    'Messages_Template_Defaults',
823
-                    $arguments,
824
-                    false,
825
-                    false
826
-                );
827
-            },
828
-            // load_helper
829
-            'EEH_Parse_Shortcodes'                         => function () {
830
-                if (EE_Registry::instance()->load_helper('Parse_Shortcodes')) {
831
-                    return new EEH_Parse_Shortcodes();
832
-                }
833
-                return null;
834
-            },
835
-            'EE_Template_Config'                           => function () {
836
-                return EE_Config::instance()->template_settings;
837
-            },
838
-            'EE_Currency_Config'                           => function () {
839
-                return EE_Config::instance()->currency;
840
-            },
841
-            'EE_Registration_Config'                       => function () {
842
-                return EE_Config::instance()->registration;
843
-            },
844
-            'EE_Core_Config'                               => function () {
845
-                return EE_Config::instance()->core;
846
-            },
847
-            'EventEspresso\core\services\loaders\Loader'   => function () {
848
-                return LoaderFactory::getLoader();
849
-            },
850
-            'EE_Network_Config'                            => function () {
851
-                return EE_Network_Config::instance();
852
-            },
853
-            'EE_Config'                                    => function () {
854
-                return EE_Config::instance();
855
-            },
856
-            'EventEspresso\core\domain\Domain'             => function () {
857
-                return DomainFactory::getEventEspressoCoreDomain();
858
-            },
859
-        );
860
-    }
861
-
862
-
863
-    /**
864
-     * can be used for supplying alternate names for classes,
865
-     * or for connecting interface names to instantiable classes
866
-     */
867
-    protected function _register_core_aliases()
868
-    {
869
-        $aliases = array(
870
-            'CommandBusInterface'                                                          => 'EventEspresso\core\services\commands\CommandBusInterface',
871
-            'EventEspresso\core\services\commands\CommandBusInterface'                     => 'EventEspresso\core\services\commands\CommandBus',
872
-            'CommandHandlerManagerInterface'                                               => 'EventEspresso\core\services\commands\CommandHandlerManagerInterface',
873
-            'EventEspresso\core\services\commands\CommandHandlerManagerInterface'          => 'EventEspresso\core\services\commands\CommandHandlerManager',
874
-            'CapChecker'                                                                   => 'EventEspresso\core\services\commands\middleware\CapChecker',
875
-            'AddActionHook'                                                                => 'EventEspresso\core\services\commands\middleware\AddActionHook',
876
-            'CapabilitiesChecker'                                                          => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
877
-            'CapabilitiesCheckerInterface'                                                 => 'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface',
878
-            'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface' => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
879
-            'CreateRegistrationService'                                                    => 'EventEspresso\core\domain\services\registration\CreateRegistrationService',
880
-            'CreateRegistrationCommandHandler'                                             => 'EventEspresso\core\services\commands\registration\CreateRegistrationCommand',
881
-            'CopyRegistrationDetailsCommandHandler'                                        => 'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommand',
882
-            'CopyRegistrationPaymentsCommandHandler'                                       => 'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommand',
883
-            'CancelRegistrationAndTicketLineItemCommandHandler'                            => 'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler',
884
-            'UpdateRegistrationAndTransactionAfterChangeCommandHandler'                    => 'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler',
885
-            'CreateTicketLineItemCommandHandler'                                           => 'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommand',
886
-            'CreateTransactionCommandHandler'                                              => 'EventEspresso\core\services\commands\transaction\CreateTransactionCommandHandler',
887
-            'CreateAttendeeCommandHandler'                                                 => 'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler',
888
-            'TableManager'                                                                 => 'EventEspresso\core\services\database\TableManager',
889
-            'TableAnalysis'                                                                => 'EventEspresso\core\services\database\TableAnalysis',
890
-            'EspressoShortcode'                                                            => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
891
-            'ShortcodeInterface'                                                           => 'EventEspresso\core\services\shortcodes\ShortcodeInterface',
892
-            'EventEspresso\core\services\shortcodes\ShortcodeInterface'                    => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
893
-            'EventEspresso\core\services\cache\CacheStorageInterface'                      => 'EventEspresso\core\services\cache\TransientCacheStorage',
894
-            'LoaderInterface'                                                              => 'EventEspresso\core\services\loaders\LoaderInterface',
895
-            'EventEspresso\core\services\loaders\LoaderInterface'                          => 'EventEspresso\core\services\loaders\Loader',
896
-            'CommandFactoryInterface'                                                      => 'EventEspresso\core\services\commands\CommandFactoryInterface',
897
-            'EventEspresso\core\services\commands\CommandFactoryInterface'                 => 'EventEspresso\core\services\commands\CommandFactory',
898
-            'EventEspresso\core\domain\services\session\SessionIdentifierInterface'        => 'EE_Session',
899
-            'EmailValidatorInterface'                                                      => 'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface',
900
-            'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface'  => 'EventEspresso\core\domain\services\validation\email\EmailValidationService',
901
-            'NoticeConverterInterface'                                                     => 'EventEspresso\core\services\notices\NoticeConverterInterface',
902
-            'EventEspresso\core\services\notices\NoticeConverterInterface'                 => 'EventEspresso\core\services\notices\ConvertNoticesToEeErrors',
903
-            'NoticesContainerInterface'                                                    => 'EventEspresso\core\services\notices\NoticesContainerInterface',
904
-            'EventEspresso\core\services\notices\NoticesContainerInterface'                => 'EventEspresso\core\services\notices\NoticesContainer',
905
-            'EventEspresso\core\services\request\RequestInterface'                         => 'EventEspresso\core\services\request\Request',
906
-            'EventEspresso\core\services\request\ResponseInterface'                        => 'EventEspresso\core\services\request\Response',
907
-            'EventEspresso\core\domain\DomainInterface'                                    => 'EventEspresso\core\domain\Domain',
908
-        );
909
-        foreach ($aliases as $alias => $fqn) {
910
-            if (is_array($fqn)) {
911
-                foreach ($fqn as $class => $for_class) {
912
-                    $this->class_cache->addAlias($class, $alias, $for_class);
913
-                }
914
-                continue;
915
-            }
916
-            $this->class_cache->addAlias($fqn, $alias);
917
-        }
918
-        if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
919
-            $this->class_cache->addAlias(
920
-                'EventEspresso\core\services\notices\ConvertNoticesToAdminNotices',
921
-                'EventEspresso\core\services\notices\NoticeConverterInterface'
922
-            );
923
-        }
924
-    }
925
-
926
-
927
-    /**
928
-     * This is used to reset the internal map and class_loaders to their original default state at the beginning of the
929
-     * request Primarily used by unit tests.
930
-     */
931
-    public function reset()
932
-    {
933
-        $this->_register_core_class_loaders();
934
-        $this->_register_core_dependencies();
935
-    }
936
-
937
-
938
-    /**
939
-     * PLZ NOTE: a better name for this method would be is_alias()
940
-     * because it returns TRUE if the provided fully qualified name IS an alias
941
-     * WHY?
942
-     * Because if a class is type hinting for a concretion,
943
-     * then why would we need to find another class to supply it?
944
-     * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`,
945
-     * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`.
946
-     * Don't go looking for some substitute.
947
-     * Whereas if a class is type hinting for an interface...
948
-     * then we need to find an actual class to use.
949
-     * So the interface IS the alias for some other FQN,
950
-     * and we need to find out if `Fully/Qualified/Namespace/SomeInterface`
951
-     * represents some other class.
952
-     *
953
-     * @deprecated $VID:$
954
-     * @param string $fqn
955
-     * @param string $for_class
956
-     * @return bool
957
-     */
958
-    public function has_alias($fqn = '', $for_class = '')
959
-    {
960
-        return $this->isAlias($fqn, $for_class);
961
-    }
962
-
963
-
964
-    /**
965
-     * PLZ NOTE: a better name for this method would be get_fqn_for_alias()
966
-     * because it returns a FQN for provided alias if one exists, otherwise returns the original $alias
967
-     * functions recursively, so that multiple aliases can be used to drill down to a FQN
968
-     *  for example:
969
-     *      if the following two entries were added to the _aliases array:
970
-     *          array(
971
-     *              'interface_alias'           => 'some\namespace\interface'
972
-     *              'some\namespace\interface'  => 'some\namespace\classname'
973
-     *          )
974
-     *      then one could use EE_Registry::instance()->create( 'interface_alias' )
975
-     *      to load an instance of 'some\namespace\classname'
976
-     *
977
-     * @deprecated $VID:$
978
-     * @param string $alias
979
-     * @param string $for_class
980
-     * @return string
981
-     */
982
-    public function get_alias($alias = '', $for_class = '')
983
-    {
984
-        return $this->getFqnForAlias($alias, $for_class);
985
-    }
23
+	/**
24
+	 * This means that the requested class dependency is not present in the dependency map
25
+	 */
26
+	const not_registered = 0;
27
+
28
+	/**
29
+	 * This instructs class loaders to ALWAYS return a newly instantiated object for the requested class.
30
+	 */
31
+	const load_new_object = 1;
32
+
33
+	/**
34
+	 * This instructs class loaders to return a previously instantiated and cached object for the requested class.
35
+	 * IF a previously instantiated object does not exist, a new one will be created and added to the cache.
36
+	 */
37
+	const load_from_cache = 2;
38
+
39
+	/**
40
+	 * When registering a dependency,
41
+	 * this indicates to keep any existing dependencies that already exist,
42
+	 * and simply discard any new dependencies declared in the incoming data
43
+	 */
44
+	const KEEP_EXISTING_DEPENDENCIES = 0;
45
+
46
+	/**
47
+	 * When registering a dependency,
48
+	 * this indicates to overwrite any existing dependencies that already exist using the incoming data
49
+	 */
50
+	const OVERWRITE_DEPENDENCIES = 1;
51
+
52
+
53
+	/**
54
+	 * @type EE_Dependency_Map $_instance
55
+	 */
56
+	protected static $_instance;
57
+
58
+	/**
59
+	 * @var ClassInterfaceCache $class_cache
60
+	 */
61
+	private $class_cache;
62
+
63
+	/**
64
+	 * @type RequestInterface $request
65
+	 */
66
+	protected $request;
67
+
68
+	/**
69
+	 * @type LegacyRequestInterface $legacy_request
70
+	 */
71
+	protected $legacy_request;
72
+
73
+	/**
74
+	 * @type ResponseInterface $response
75
+	 */
76
+	protected $response;
77
+
78
+	/**
79
+	 * @type LoaderInterface $loader
80
+	 */
81
+	protected $loader;
82
+
83
+	/**
84
+	 * @type array $_dependency_map
85
+	 */
86
+	protected $_dependency_map = array();
87
+
88
+	/**
89
+	 * @type array $_class_loaders
90
+	 */
91
+	protected $_class_loaders = array();
92
+
93
+
94
+	/**
95
+	 * EE_Dependency_Map constructor.
96
+	 *
97
+	 * @param ClassInterfaceCache $class_cache
98
+	 */
99
+	protected function __construct(ClassInterfaceCache $class_cache)
100
+	{
101
+		$this->class_cache = $class_cache;
102
+		do_action('EE_Dependency_Map____construct', $this);
103
+	}
104
+
105
+
106
+	/**
107
+	 * @return void
108
+	 */
109
+	public function initialize()
110
+	{
111
+		$this->_register_core_dependencies();
112
+		$this->_register_core_class_loaders();
113
+		$this->_register_core_aliases();
114
+	}
115
+
116
+
117
+	/**
118
+	 * @singleton method used to instantiate class object
119
+	 * @param ClassInterfaceCache|null $class_cache
120
+	 * @return EE_Dependency_Map
121
+	 */
122
+	public static function instance(ClassInterfaceCache $class_cache = null)
123
+	{
124
+		// check if class object is instantiated, and instantiated properly
125
+		if (! self::$_instance instanceof EE_Dependency_Map
126
+			&& $class_cache instanceof ClassInterfaceCache
127
+		) {
128
+			self::$_instance = new EE_Dependency_Map($class_cache);
129
+		}
130
+		return self::$_instance;
131
+	}
132
+
133
+
134
+	/**
135
+	 * @param RequestInterface $request
136
+	 */
137
+	public function setRequest(RequestInterface $request)
138
+	{
139
+		$this->request = $request;
140
+	}
141
+
142
+
143
+	/**
144
+	 * @param LegacyRequestInterface $legacy_request
145
+	 */
146
+	public function setLegacyRequest(LegacyRequestInterface $legacy_request)
147
+	{
148
+		$this->legacy_request = $legacy_request;
149
+	}
150
+
151
+
152
+	/**
153
+	 * @param ResponseInterface $response
154
+	 */
155
+	public function setResponse(ResponseInterface $response)
156
+	{
157
+		$this->response = $response;
158
+	}
159
+
160
+
161
+	/**
162
+	 * @param LoaderInterface $loader
163
+	 */
164
+	public function setLoader(LoaderInterface $loader)
165
+	{
166
+		$this->loader = $loader;
167
+	}
168
+
169
+
170
+	/**
171
+	 * @param string $class
172
+	 * @param array  $dependencies
173
+	 * @param int    $overwrite
174
+	 * @return bool
175
+	 */
176
+	public static function register_dependencies(
177
+		$class,
178
+		array $dependencies,
179
+		$overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
180
+	) {
181
+		return self::$_instance->registerDependencies($class, $dependencies, $overwrite);
182
+	}
183
+
184
+
185
+	/**
186
+	 * Assigns an array of class names and corresponding load sources (new or cached)
187
+	 * to the class specified by the first parameter.
188
+	 * IMPORTANT !!!
189
+	 * The order of elements in the incoming $dependencies array MUST match
190
+	 * the order of the constructor parameters for the class in question.
191
+	 * This is especially important when overriding any existing dependencies that are registered.
192
+	 * the third parameter controls whether any duplicate dependencies are overwritten or not.
193
+	 *
194
+	 * @param string $class
195
+	 * @param array  $dependencies
196
+	 * @param int    $overwrite
197
+	 * @return bool
198
+	 */
199
+	public function registerDependencies(
200
+		$class,
201
+		array $dependencies,
202
+		$overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
203
+	) {
204
+		$class = trim($class, '\\');
205
+		$registered = false;
206
+		if (empty(self::$_instance->_dependency_map[ $class ])) {
207
+			self::$_instance->_dependency_map[ $class ] = array();
208
+		}
209
+		// we need to make sure that any aliases used when registering a dependency
210
+		// get resolved to the correct class name
211
+		foreach ($dependencies as $dependency => $load_source) {
212
+			$alias = self::$_instance->getFqnForAlias($dependency);
213
+			if ($overwrite === EE_Dependency_Map::OVERWRITE_DEPENDENCIES
214
+				|| ! isset(self::$_instance->_dependency_map[ $class ][ $alias ])
215
+			) {
216
+				unset($dependencies[ $dependency ]);
217
+				$dependencies[ $alias ] = $load_source;
218
+				$registered = true;
219
+			}
220
+		}
221
+		// now add our two lists of dependencies together.
222
+		// using Union (+=) favours the arrays in precedence from left to right,
223
+		// so $dependencies is NOT overwritten because it is listed first
224
+		// ie: with A = B + C, entries in B take precedence over duplicate entries in C
225
+		// Union is way faster than array_merge() but should be used with caution...
226
+		// especially with numerically indexed arrays
227
+		$dependencies += self::$_instance->_dependency_map[ $class ];
228
+		// now we need to ensure that the resulting dependencies
229
+		// array only has the entries that are required for the class
230
+		// so first count how many dependencies were originally registered for the class
231
+		$dependency_count = count(self::$_instance->_dependency_map[ $class ]);
232
+		// if that count is non-zero (meaning dependencies were already registered)
233
+		self::$_instance->_dependency_map[ $class ] = $dependency_count
234
+			// then truncate the  final array to match that count
235
+			? array_slice($dependencies, 0, $dependency_count)
236
+			// otherwise just take the incoming array because nothing previously existed
237
+			: $dependencies;
238
+		return $registered;
239
+	}
240
+
241
+
242
+	/**
243
+	 * @param string $class_name
244
+	 * @param string $loader
245
+	 * @return bool
246
+	 * @throws DomainException
247
+	 */
248
+	public static function register_class_loader($class_name, $loader = 'load_core')
249
+	{
250
+		if (! $loader instanceof Closure && strpos($class_name, '\\') !== false) {
251
+			throw new DomainException(
252
+				esc_html__('Don\'t use class loaders for FQCNs.', 'event_espresso')
253
+			);
254
+		}
255
+		// check that loader is callable or method starts with "load_" and exists in EE_Registry
256
+		if (! is_callable($loader)
257
+			&& (
258
+				strpos($loader, 'load_') !== 0
259
+				|| ! method_exists('EE_Registry', $loader)
260
+			)
261
+		) {
262
+			throw new DomainException(
263
+				sprintf(
264
+					esc_html__(
265
+						'"%1$s" is not a valid loader method on EE_Registry.',
266
+						'event_espresso'
267
+					),
268
+					$loader
269
+				)
270
+			);
271
+		}
272
+		$class_name = self::$_instance->getFqnForAlias($class_name);
273
+		if (! isset(self::$_instance->_class_loaders[ $class_name ])) {
274
+			self::$_instance->_class_loaders[ $class_name ] = $loader;
275
+			return true;
276
+		}
277
+		return false;
278
+	}
279
+
280
+
281
+	/**
282
+	 * @return array
283
+	 */
284
+	public function dependency_map()
285
+	{
286
+		return $this->_dependency_map;
287
+	}
288
+
289
+
290
+	/**
291
+	 * returns TRUE if dependency map contains a listing for the provided class name
292
+	 *
293
+	 * @param string $class_name
294
+	 * @return boolean
295
+	 */
296
+	public function has($class_name = '')
297
+	{
298
+		// all legacy models have the same dependencies
299
+		if (strpos($class_name, 'EEM_') === 0) {
300
+			$class_name = 'LEGACY_MODELS';
301
+		}
302
+		return isset($this->_dependency_map[ $class_name ]) ? true : false;
303
+	}
304
+
305
+
306
+	/**
307
+	 * returns TRUE if dependency map contains a listing for the provided class name AND dependency
308
+	 *
309
+	 * @param string $class_name
310
+	 * @param string $dependency
311
+	 * @return bool
312
+	 */
313
+	public function has_dependency_for_class($class_name = '', $dependency = '')
314
+	{
315
+		// all legacy models have the same dependencies
316
+		if (strpos($class_name, 'EEM_') === 0) {
317
+			$class_name = 'LEGACY_MODELS';
318
+		}
319
+		$dependency = $this->getFqnForAlias($dependency, $class_name);
320
+		return isset($this->_dependency_map[ $class_name ][ $dependency ])
321
+			? true
322
+			: false;
323
+	}
324
+
325
+
326
+	/**
327
+	 * returns loading strategy for whether a previously cached dependency should be loaded or a new instance returned
328
+	 *
329
+	 * @param string $class_name
330
+	 * @param string $dependency
331
+	 * @return int
332
+	 */
333
+	public function loading_strategy_for_class_dependency($class_name = '', $dependency = '')
334
+	{
335
+		// all legacy models have the same dependencies
336
+		if (strpos($class_name, 'EEM_') === 0) {
337
+			$class_name = 'LEGACY_MODELS';
338
+		}
339
+		$dependency = $this->getFqnForAlias($dependency);
340
+		return $this->has_dependency_for_class($class_name, $dependency)
341
+			? $this->_dependency_map[ $class_name ][ $dependency ]
342
+			: EE_Dependency_Map::not_registered;
343
+	}
344
+
345
+
346
+	/**
347
+	 * @param string $class_name
348
+	 * @return string | Closure
349
+	 */
350
+	public function class_loader($class_name)
351
+	{
352
+		// all legacy models use load_model()
353
+		if (strpos($class_name, 'EEM_') === 0) {
354
+			return 'load_model';
355
+		}
356
+		$class_name = $this->getFqnForAlias($class_name);
357
+		return isset($this->_class_loaders[ $class_name ]) ? $this->_class_loaders[ $class_name ] : '';
358
+	}
359
+
360
+
361
+	/**
362
+	 * @return array
363
+	 */
364
+	public function class_loaders()
365
+	{
366
+		return $this->_class_loaders;
367
+	}
368
+
369
+
370
+	/**
371
+	 * adds an alias for a classname
372
+	 *
373
+	 * @param string $fqcn      the class name that should be used (concrete class to replace interface)
374
+	 * @param string $alias     the class name that would be type hinted for (abstract parent or interface)
375
+	 * @param string $for_class the class that has the dependency (is type hinting for the interface)
376
+	 */
377
+	public function add_alias($fqcn, $alias, $for_class = '')
378
+	{
379
+		$this->class_cache->addAlias($fqcn, $alias, $for_class);
380
+	}
381
+
382
+
383
+	/**
384
+	 * Returns TRUE if the provided fully qualified name IS an alias
385
+	 * WHY?
386
+	 * Because if a class is type hinting for a concretion,
387
+	 * then why would we need to find another class to supply it?
388
+	 * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`,
389
+	 * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`.
390
+	 * Don't go looking for some substitute.
391
+	 * Whereas if a class is type hinting for an interface...
392
+	 * then we need to find an actual class to use.
393
+	 * So the interface IS the alias for some other FQN,
394
+	 * and we need to find out if `Fully/Qualified/Namespace/SomeInterface`
395
+	 * represents some other class.
396
+	 *
397
+	 * @param string $fqn
398
+	 * @param string $for_class
399
+	 * @return bool
400
+	 */
401
+	public function isAlias($fqn = '', $for_class = '')
402
+	{
403
+		return $this->class_cache->isAlias($fqn, $for_class);
404
+	}
405
+
406
+
407
+	/**
408
+	 * Returns a FQN for provided alias if one exists, otherwise returns the original $alias
409
+	 * functions recursively, so that multiple aliases can be used to drill down to a FQN
410
+	 *  for example:
411
+	 *      if the following two entries were added to the _aliases array:
412
+	 *          array(
413
+	 *              'interface_alias'           => 'some\namespace\interface'
414
+	 *              'some\namespace\interface'  => 'some\namespace\classname'
415
+	 *          )
416
+	 *      then one could use EE_Registry::instance()->create( 'interface_alias' )
417
+	 *      to load an instance of 'some\namespace\classname'
418
+	 *
419
+	 * @param string $alias
420
+	 * @param string $for_class
421
+	 * @return string
422
+	 */
423
+	public function getFqnForAlias($alias = '', $for_class = '')
424
+	{
425
+		return (string) $this->class_cache->getFqnForAlias($alias, $for_class);
426
+	}
427
+
428
+
429
+	/**
430
+	 * Registers the core dependencies and whether a previously instantiated object should be loaded from the cache,
431
+	 * if one exists, or whether a new object should be generated every time the requested class is loaded.
432
+	 * This is done by using the following class constants:
433
+	 *        EE_Dependency_Map::load_from_cache - loads previously instantiated object
434
+	 *        EE_Dependency_Map::load_new_object - generates a new object every time
435
+	 */
436
+	protected function _register_core_dependencies()
437
+	{
438
+		$this->_dependency_map = array(
439
+			'EE_Request_Handler'                                                                                          => array(
440
+				'EE_Request' => EE_Dependency_Map::load_from_cache,
441
+			),
442
+			'EE_System'                                                                                                   => array(
443
+				'EE_Registry'                                 => EE_Dependency_Map::load_from_cache,
444
+				'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
445
+				'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
446
+				'EE_Maintenance_Mode'                         => EE_Dependency_Map::load_from_cache,
447
+			),
448
+			'EE_Session'                                                                                                  => array(
449
+				'EventEspresso\core\services\cache\TransientCacheStorage'  => EE_Dependency_Map::load_from_cache,
450
+				'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache,
451
+				'EventEspresso\core\services\request\Request'              => EE_Dependency_Map::load_from_cache,
452
+				'EE_Encryption'                                            => EE_Dependency_Map::load_from_cache,
453
+			),
454
+			'EE_Cart'                                                                                                     => array(
455
+				'EE_Session' => EE_Dependency_Map::load_from_cache,
456
+			),
457
+			'EE_Front_Controller'                                                                                         => array(
458
+				'EE_Registry'              => EE_Dependency_Map::load_from_cache,
459
+				'EE_Request_Handler'       => EE_Dependency_Map::load_from_cache,
460
+				'EE_Module_Request_Router' => EE_Dependency_Map::load_from_cache,
461
+			),
462
+			'EE_Messenger_Collection_Loader'                                                                              => array(
463
+				'EE_Messenger_Collection' => EE_Dependency_Map::load_new_object,
464
+			),
465
+			'EE_Message_Type_Collection_Loader'                                                                           => array(
466
+				'EE_Message_Type_Collection' => EE_Dependency_Map::load_new_object,
467
+			),
468
+			'EE_Message_Resource_Manager'                                                                                 => array(
469
+				'EE_Messenger_Collection_Loader'    => EE_Dependency_Map::load_new_object,
470
+				'EE_Message_Type_Collection_Loader' => EE_Dependency_Map::load_new_object,
471
+				'EEM_Message_Template_Group'        => EE_Dependency_Map::load_from_cache,
472
+			),
473
+			'EE_Message_Factory'                                                                                          => array(
474
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
475
+			),
476
+			'EE_messages'                                                                                                 => array(
477
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
478
+			),
479
+			'EE_Messages_Generator'                                                                                       => array(
480
+				'EE_Messages_Queue'                    => EE_Dependency_Map::load_new_object,
481
+				'EE_Messages_Data_Handler_Collection'  => EE_Dependency_Map::load_new_object,
482
+				'EE_Message_Template_Group_Collection' => EE_Dependency_Map::load_new_object,
483
+				'EEH_Parse_Shortcodes'                 => EE_Dependency_Map::load_from_cache,
484
+			),
485
+			'EE_Messages_Processor'                                                                                       => array(
486
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
487
+			),
488
+			'EE_Messages_Queue'                                                                                           => array(
489
+				'EE_Message_Repository' => EE_Dependency_Map::load_new_object,
490
+			),
491
+			'EE_Messages_Template_Defaults'                                                                               => array(
492
+				'EEM_Message_Template_Group' => EE_Dependency_Map::load_from_cache,
493
+				'EEM_Message_Template'       => EE_Dependency_Map::load_from_cache,
494
+			),
495
+			'EE_Message_To_Generate_From_Request'                                                                         => array(
496
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
497
+				'EE_Request_Handler'          => EE_Dependency_Map::load_from_cache,
498
+			),
499
+			'EventEspresso\core\services\commands\CommandBus'                                                             => array(
500
+				'EventEspresso\core\services\commands\CommandHandlerManager' => EE_Dependency_Map::load_from_cache,
501
+			),
502
+			'EventEspresso\services\commands\CommandHandler'                                                              => array(
503
+				'EE_Registry'         => EE_Dependency_Map::load_from_cache,
504
+				'CommandBusInterface' => EE_Dependency_Map::load_from_cache,
505
+			),
506
+			'EventEspresso\core\services\commands\CommandHandlerManager'                                                  => array(
507
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
508
+			),
509
+			'EventEspresso\core\services\commands\CompositeCommandHandler'                                                => array(
510
+				'EventEspresso\core\services\commands\CommandBus'     => EE_Dependency_Map::load_from_cache,
511
+				'EventEspresso\core\services\commands\CommandFactory' => EE_Dependency_Map::load_from_cache,
512
+			),
513
+			'EventEspresso\core\services\commands\CommandFactory'                                                         => array(
514
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
515
+			),
516
+			'EventEspresso\core\services\commands\middleware\CapChecker'                                                  => array(
517
+				'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
518
+			),
519
+			'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker'                                         => array(
520
+				'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
521
+			),
522
+			'EventEspresso\core\domain\services\capabilities\RegistrationsCapChecker'                                     => array(
523
+				'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
524
+			),
525
+			'EventEspresso\core\services\commands\registration\CreateRegistrationCommandHandler'                          => array(
526
+				'EventEspresso\core\domain\services\registration\CreateRegistrationService' => EE_Dependency_Map::load_from_cache,
527
+			),
528
+			'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommandHandler'                     => array(
529
+				'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
530
+			),
531
+			'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommandHandler'                    => array(
532
+				'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
533
+			),
534
+			'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler'         => array(
535
+				'EventEspresso\core\domain\services\registration\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
536
+			),
537
+			'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler' => array(
538
+				'EventEspresso\core\domain\services\registration\UpdateRegistrationService' => EE_Dependency_Map::load_from_cache,
539
+			),
540
+			'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommandHandler'                              => array(
541
+				'EventEspresso\core\domain\services\ticket\CreateTicketLineItemService' => EE_Dependency_Map::load_from_cache,
542
+			),
543
+			'EventEspresso\core\services\commands\ticket\CancelTicketLineItemCommandHandler'                              => array(
544
+				'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
545
+			),
546
+			'EventEspresso\core\domain\services\registration\CancelRegistrationService'                                   => array(
547
+				'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
548
+			),
549
+			'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler'                                  => array(
550
+				'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
551
+			),
552
+			'EventEspresso\core\services\database\TableManager'                                                           => array(
553
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
554
+			),
555
+			'EE_Data_Migration_Class_Base'                                                                                => array(
556
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
557
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
558
+			),
559
+			'EE_DMS_Core_4_1_0'                                                                                           => array(
560
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
561
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
562
+			),
563
+			'EE_DMS_Core_4_2_0'                                                                                           => array(
564
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
565
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
566
+			),
567
+			'EE_DMS_Core_4_3_0'                                                                                           => array(
568
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
569
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
570
+			),
571
+			'EE_DMS_Core_4_4_0'                                                                                           => array(
572
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
573
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
574
+			),
575
+			'EE_DMS_Core_4_5_0'                                                                                           => array(
576
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
577
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
578
+			),
579
+			'EE_DMS_Core_4_6_0'                                                                                           => array(
580
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
581
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
582
+			),
583
+			'EE_DMS_Core_4_7_0'                                                                                           => array(
584
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
585
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
586
+			),
587
+			'EE_DMS_Core_4_8_0'                                                                                           => array(
588
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
589
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
590
+			),
591
+			'EE_DMS_Core_4_9_0'                                                                                           => array(
592
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
593
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
594
+			),
595
+			'EventEspresso\core\services\assets\I18nRegistry'                                                             => array(
596
+				array(),
597
+				'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
598
+			),
599
+			'EventEspresso\core\services\assets\Registry'                                                                 => array(
600
+				'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache,
601
+				'EventEspresso\core\services\assets\I18nRegistry'    => EE_Dependency_Map::load_from_cache,
602
+			),
603
+			'EventEspresso\core\domain\entities\shortcodes\EspressoCancelled'                                             => array(
604
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
605
+			),
606
+			'EventEspresso\core\domain\entities\shortcodes\EspressoCheckout'                                              => array(
607
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
608
+			),
609
+			'EventEspresso\core\domain\entities\shortcodes\EspressoEventAttendees'                                        => array(
610
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
611
+			),
612
+			'EventEspresso\core\domain\entities\shortcodes\EspressoEvents'                                                => array(
613
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
614
+			),
615
+			'EventEspresso\core\domain\entities\shortcodes\EspressoThankYou'                                              => array(
616
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
617
+			),
618
+			'EventEspresso\core\domain\entities\shortcodes\EspressoTicketSelector'                                        => array(
619
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
620
+			),
621
+			'EventEspresso\core\domain\entities\shortcodes\EspressoTxnPage'                                               => array(
622
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
623
+			),
624
+			'EventEspresso\core\services\cache\BasicCacheManager'                                                         => array(
625
+				'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
626
+			),
627
+			'EventEspresso\core\services\cache\PostRelatedCacheManager'                                                   => array(
628
+				'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
629
+			),
630
+			'EventEspresso\core\domain\services\validation\email\EmailValidationService'                                  => array(
631
+				'EE_Registration_Config'                     => EE_Dependency_Map::load_from_cache,
632
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
633
+			),
634
+			'EventEspresso\core\domain\values\EmailAddress'                                                               => array(
635
+				null,
636
+				'EventEspresso\core\domain\services\validation\email\EmailValidationService' => EE_Dependency_Map::load_from_cache,
637
+			),
638
+			'EventEspresso\core\services\orm\ModelFieldFactory'                                                           => array(
639
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
640
+			),
641
+			'LEGACY_MODELS'                                                                                               => array(
642
+				null,
643
+				'EventEspresso\core\services\database\ModelFieldFactory' => EE_Dependency_Map::load_from_cache,
644
+			),
645
+			'EE_Module_Request_Router'                                                                                    => array(
646
+				'EE_Request' => EE_Dependency_Map::load_from_cache,
647
+			),
648
+			'EE_Registration_Processor'                                                                                   => array(
649
+				'EE_Request' => EE_Dependency_Map::load_from_cache,
650
+			),
651
+			'EventEspresso\core\services\notifications\PersistentAdminNoticeManager'                                      => array(
652
+				null,
653
+				'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
654
+				'EE_Request'                                                          => EE_Dependency_Map::load_from_cache,
655
+			),
656
+			'EventEspresso\core\services\licensing\LicenseService'                                                        => array(
657
+				'EventEspresso\core\domain\services\pue\Stats'  => EE_Dependency_Map::load_from_cache,
658
+				'EventEspresso\core\domain\services\pue\Config' => EE_Dependency_Map::load_from_cache,
659
+			),
660
+			'EE_Admin_Transactions_List_Table'                                                                            => array(
661
+				null,
662
+				'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache,
663
+			),
664
+			'EventEspresso\core\domain\services\pue\Stats'                                                                => array(
665
+				'EventEspresso\core\domain\services\pue\Config'        => EE_Dependency_Map::load_from_cache,
666
+				'EE_Maintenance_Mode'                                  => EE_Dependency_Map::load_from_cache,
667
+				'EventEspresso\core\domain\services\pue\StatsGatherer' => EE_Dependency_Map::load_from_cache,
668
+			),
669
+			'EventEspresso\core\domain\services\pue\Config'                                                               => array(
670
+				'EE_Network_Config' => EE_Dependency_Map::load_from_cache,
671
+				'EE_Config'         => EE_Dependency_Map::load_from_cache,
672
+			),
673
+			'EventEspresso\core\domain\services\pue\StatsGatherer'                                                        => array(
674
+				'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache,
675
+				'EEM_Event'          => EE_Dependency_Map::load_from_cache,
676
+				'EEM_Datetime'       => EE_Dependency_Map::load_from_cache,
677
+				'EEM_Ticket'         => EE_Dependency_Map::load_from_cache,
678
+				'EEM_Registration'   => EE_Dependency_Map::load_from_cache,
679
+				'EEM_Transaction'    => EE_Dependency_Map::load_from_cache,
680
+				'EE_Config'          => EE_Dependency_Map::load_from_cache,
681
+			),
682
+			'EventEspresso\core\domain\services\admin\ExitModal'                                                          => array(
683
+				'EventEspresso\core\services\assets\Registry' => EE_Dependency_Map::load_from_cache,
684
+			),
685
+			'EventEspresso\core\domain\services\admin\PluginUpsells'                                                      => array(
686
+				'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
687
+			),
688
+			'EventEspresso\caffeinated\modules\recaptcha_invisible\InvisibleRecaptcha'                                    => array(
689
+				'EE_Registration_Config' => EE_Dependency_Map::load_from_cache,
690
+				'EE_Session'             => EE_Dependency_Map::load_from_cache,
691
+			),
692
+			'EventEspresso\caffeinated\modules\recaptcha_invisible\RecaptchaAdminSettings'                                => array(
693
+				'EE_Registration_Config' => EE_Dependency_Map::load_from_cache,
694
+			),
695
+			'EventEspresso\modules\ticket_selector\ProcessTicketSelector'                                                 => array(
696
+				'EE_Core_Config'                                                          => EE_Dependency_Map::load_from_cache,
697
+				'EventEspresso\core\services\request\Request'                             => EE_Dependency_Map::load_from_cache,
698
+				'EE_Session'                                                              => EE_Dependency_Map::load_from_cache,
699
+				'EEM_Ticket'                                                              => EE_Dependency_Map::load_from_cache,
700
+				'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker' => EE_Dependency_Map::load_from_cache,
701
+			),
702
+			'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker'                                     => array(
703
+				'EEM_Datetime' => EE_Dependency_Map::load_from_cache,
704
+			),
705
+			'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions'                              => array(
706
+				'EE_Core_Config'                             => EE_Dependency_Map::load_from_cache,
707
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
708
+			),
709
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes'                                => array(
710
+				'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache,
711
+			),
712
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies'                               => array(
713
+				'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache,
714
+			),
715
+			'EE_CPT_Strategy'                                                                                             => array(
716
+				'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache,
717
+				'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache,
718
+			),
719
+			'EventEspresso\core\services\loaders\ObjectIdentifier'                                                        => array(
720
+				'EventEspresso\core\services\loaders\ClassInterfaceCache' => EE_Dependency_Map::load_from_cache,
721
+			),
722
+			'EventEspresso\core\domain\services\admin\privacy\policy\PrivacyPolicy' => array(
723
+				'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache,
724
+				'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache
725
+			),
726
+			'EventEspresso\core\domain\entities\editor\blocks\CoreBlocksAssetManager'                                     => array(
727
+				'EventEspresso\core\domain\Domain'            => EE_Dependency_Map::load_from_cache,
728
+				'EventEspresso\core\services\assets\Registry' => EE_Dependency_Map::load_from_cache,
729
+			),
730
+			'EventEspresso\core\services\assets\AssetManager'                                                             => array(
731
+				'EventEspresso\core\domain\Domain'                   => EE_Dependency_Map::load_from_cache,
732
+				'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache,
733
+				'EventEspresso\core\services\assets\Registry'        => EE_Dependency_Map::load_from_cache,
734
+			),
735
+			'EventEspresso\core\domain\services\assets\CoreAssetManager'                                                  => array(
736
+				'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache,
737
+				'EE_Currency_Config'                                 => EE_Dependency_Map::load_from_cache,
738
+				'EE_Template_Config'                                 => EE_Dependency_Map::load_from_cache,
739
+				'EventEspresso\core\domain\Domain'                   => EE_Dependency_Map::load_from_cache,
740
+				'EventEspresso\core\services\assets\Registry'        => EE_Dependency_Map::load_from_cache,
741
+			),
742
+			'EventEspresso\core\services\editor\BlockRegistrationManager'                                                 => array(
743
+				'EventEspresso\core\services\assets\BlockAssetManagerCollection' => EE_Dependency_Map::load_from_cache,
744
+				'EventEspresso\core\domain\entities\editor\BlockCollection'      => EE_Dependency_Map::load_from_cache,
745
+				'EventEspresso\core\services\request\Request'                    => EE_Dependency_Map::load_from_cache,
746
+			),
747
+		);
748
+	}
749
+
750
+
751
+	/**
752
+	 * Registers how core classes are loaded.
753
+	 * This can either be done by simply providing the name of one of the EE_Registry loader methods such as:
754
+	 *        'EE_Request_Handler' => 'load_core'
755
+	 *        'EE_Messages_Queue'  => 'load_lib'
756
+	 *        'EEH_Debug_Tools'    => 'load_helper'
757
+	 * or, if greater control is required, by providing a custom closure. For example:
758
+	 *        'Some_Class' => function () {
759
+	 *            return new Some_Class();
760
+	 *        },
761
+	 * This is required for instantiating dependencies
762
+	 * where an interface has been type hinted in a class constructor. For example:
763
+	 *        'Required_Interface' => function () {
764
+	 *            return new A_Class_That_Implements_Required_Interface();
765
+	 *        },
766
+	 */
767
+	protected function _register_core_class_loaders()
768
+	{
769
+		// for PHP5.3 compat, we need to register any properties called here in a variable because `$this` cannot
770
+		// be used in a closure.
771
+		$request = &$this->request;
772
+		$response = &$this->response;
773
+		$legacy_request = &$this->legacy_request;
774
+		// $loader = &$this->loader;
775
+		$this->_class_loaders = array(
776
+			// load_core
777
+			'EE_Capabilities'                              => 'load_core',
778
+			'EE_Encryption'                                => 'load_core',
779
+			'EE_Front_Controller'                          => 'load_core',
780
+			'EE_Module_Request_Router'                     => 'load_core',
781
+			'EE_Registry'                                  => 'load_core',
782
+			'EE_Request'                                   => function () use (&$legacy_request) {
783
+				return $legacy_request;
784
+			},
785
+			'EventEspresso\core\services\request\Request'  => function () use (&$request) {
786
+				return $request;
787
+			},
788
+			'EventEspresso\core\services\request\Response' => function () use (&$response) {
789
+				return $response;
790
+			},
791
+			'EE_Base'                                      => 'load_core',
792
+			'EE_Request_Handler'                           => 'load_core',
793
+			'EE_Session'                                   => 'load_core',
794
+			'EE_Cron_Tasks'                                => 'load_core',
795
+			'EE_System'                                    => 'load_core',
796
+			'EE_Maintenance_Mode'                          => 'load_core',
797
+			'EE_Register_CPTs'                             => 'load_core',
798
+			'EE_Admin'                                     => 'load_core',
799
+			'EE_CPT_Strategy'                              => 'load_core',
800
+			// load_lib
801
+			'EE_Message_Resource_Manager'                  => 'load_lib',
802
+			'EE_Message_Type_Collection'                   => 'load_lib',
803
+			'EE_Message_Type_Collection_Loader'            => 'load_lib',
804
+			'EE_Messenger_Collection'                      => 'load_lib',
805
+			'EE_Messenger_Collection_Loader'               => 'load_lib',
806
+			'EE_Messages_Processor'                        => 'load_lib',
807
+			'EE_Message_Repository'                        => 'load_lib',
808
+			'EE_Messages_Queue'                            => 'load_lib',
809
+			'EE_Messages_Data_Handler_Collection'          => 'load_lib',
810
+			'EE_Message_Template_Group_Collection'         => 'load_lib',
811
+			'EE_Payment_Method_Manager'                    => 'load_lib',
812
+			'EE_Messages_Generator'                        => function () {
813
+				return EE_Registry::instance()->load_lib(
814
+					'Messages_Generator',
815
+					array(),
816
+					false,
817
+					false
818
+				);
819
+			},
820
+			'EE_Messages_Template_Defaults'                => function ($arguments = array()) {
821
+				return EE_Registry::instance()->load_lib(
822
+					'Messages_Template_Defaults',
823
+					$arguments,
824
+					false,
825
+					false
826
+				);
827
+			},
828
+			// load_helper
829
+			'EEH_Parse_Shortcodes'                         => function () {
830
+				if (EE_Registry::instance()->load_helper('Parse_Shortcodes')) {
831
+					return new EEH_Parse_Shortcodes();
832
+				}
833
+				return null;
834
+			},
835
+			'EE_Template_Config'                           => function () {
836
+				return EE_Config::instance()->template_settings;
837
+			},
838
+			'EE_Currency_Config'                           => function () {
839
+				return EE_Config::instance()->currency;
840
+			},
841
+			'EE_Registration_Config'                       => function () {
842
+				return EE_Config::instance()->registration;
843
+			},
844
+			'EE_Core_Config'                               => function () {
845
+				return EE_Config::instance()->core;
846
+			},
847
+			'EventEspresso\core\services\loaders\Loader'   => function () {
848
+				return LoaderFactory::getLoader();
849
+			},
850
+			'EE_Network_Config'                            => function () {
851
+				return EE_Network_Config::instance();
852
+			},
853
+			'EE_Config'                                    => function () {
854
+				return EE_Config::instance();
855
+			},
856
+			'EventEspresso\core\domain\Domain'             => function () {
857
+				return DomainFactory::getEventEspressoCoreDomain();
858
+			},
859
+		);
860
+	}
861
+
862
+
863
+	/**
864
+	 * can be used for supplying alternate names for classes,
865
+	 * or for connecting interface names to instantiable classes
866
+	 */
867
+	protected function _register_core_aliases()
868
+	{
869
+		$aliases = array(
870
+			'CommandBusInterface'                                                          => 'EventEspresso\core\services\commands\CommandBusInterface',
871
+			'EventEspresso\core\services\commands\CommandBusInterface'                     => 'EventEspresso\core\services\commands\CommandBus',
872
+			'CommandHandlerManagerInterface'                                               => 'EventEspresso\core\services\commands\CommandHandlerManagerInterface',
873
+			'EventEspresso\core\services\commands\CommandHandlerManagerInterface'          => 'EventEspresso\core\services\commands\CommandHandlerManager',
874
+			'CapChecker'                                                                   => 'EventEspresso\core\services\commands\middleware\CapChecker',
875
+			'AddActionHook'                                                                => 'EventEspresso\core\services\commands\middleware\AddActionHook',
876
+			'CapabilitiesChecker'                                                          => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
877
+			'CapabilitiesCheckerInterface'                                                 => 'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface',
878
+			'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface' => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
879
+			'CreateRegistrationService'                                                    => 'EventEspresso\core\domain\services\registration\CreateRegistrationService',
880
+			'CreateRegistrationCommandHandler'                                             => 'EventEspresso\core\services\commands\registration\CreateRegistrationCommand',
881
+			'CopyRegistrationDetailsCommandHandler'                                        => 'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommand',
882
+			'CopyRegistrationPaymentsCommandHandler'                                       => 'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommand',
883
+			'CancelRegistrationAndTicketLineItemCommandHandler'                            => 'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler',
884
+			'UpdateRegistrationAndTransactionAfterChangeCommandHandler'                    => 'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler',
885
+			'CreateTicketLineItemCommandHandler'                                           => 'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommand',
886
+			'CreateTransactionCommandHandler'                                              => 'EventEspresso\core\services\commands\transaction\CreateTransactionCommandHandler',
887
+			'CreateAttendeeCommandHandler'                                                 => 'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler',
888
+			'TableManager'                                                                 => 'EventEspresso\core\services\database\TableManager',
889
+			'TableAnalysis'                                                                => 'EventEspresso\core\services\database\TableAnalysis',
890
+			'EspressoShortcode'                                                            => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
891
+			'ShortcodeInterface'                                                           => 'EventEspresso\core\services\shortcodes\ShortcodeInterface',
892
+			'EventEspresso\core\services\shortcodes\ShortcodeInterface'                    => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
893
+			'EventEspresso\core\services\cache\CacheStorageInterface'                      => 'EventEspresso\core\services\cache\TransientCacheStorage',
894
+			'LoaderInterface'                                                              => 'EventEspresso\core\services\loaders\LoaderInterface',
895
+			'EventEspresso\core\services\loaders\LoaderInterface'                          => 'EventEspresso\core\services\loaders\Loader',
896
+			'CommandFactoryInterface'                                                      => 'EventEspresso\core\services\commands\CommandFactoryInterface',
897
+			'EventEspresso\core\services\commands\CommandFactoryInterface'                 => 'EventEspresso\core\services\commands\CommandFactory',
898
+			'EventEspresso\core\domain\services\session\SessionIdentifierInterface'        => 'EE_Session',
899
+			'EmailValidatorInterface'                                                      => 'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface',
900
+			'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface'  => 'EventEspresso\core\domain\services\validation\email\EmailValidationService',
901
+			'NoticeConverterInterface'                                                     => 'EventEspresso\core\services\notices\NoticeConverterInterface',
902
+			'EventEspresso\core\services\notices\NoticeConverterInterface'                 => 'EventEspresso\core\services\notices\ConvertNoticesToEeErrors',
903
+			'NoticesContainerInterface'                                                    => 'EventEspresso\core\services\notices\NoticesContainerInterface',
904
+			'EventEspresso\core\services\notices\NoticesContainerInterface'                => 'EventEspresso\core\services\notices\NoticesContainer',
905
+			'EventEspresso\core\services\request\RequestInterface'                         => 'EventEspresso\core\services\request\Request',
906
+			'EventEspresso\core\services\request\ResponseInterface'                        => 'EventEspresso\core\services\request\Response',
907
+			'EventEspresso\core\domain\DomainInterface'                                    => 'EventEspresso\core\domain\Domain',
908
+		);
909
+		foreach ($aliases as $alias => $fqn) {
910
+			if (is_array($fqn)) {
911
+				foreach ($fqn as $class => $for_class) {
912
+					$this->class_cache->addAlias($class, $alias, $for_class);
913
+				}
914
+				continue;
915
+			}
916
+			$this->class_cache->addAlias($fqn, $alias);
917
+		}
918
+		if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
919
+			$this->class_cache->addAlias(
920
+				'EventEspresso\core\services\notices\ConvertNoticesToAdminNotices',
921
+				'EventEspresso\core\services\notices\NoticeConverterInterface'
922
+			);
923
+		}
924
+	}
925
+
926
+
927
+	/**
928
+	 * This is used to reset the internal map and class_loaders to their original default state at the beginning of the
929
+	 * request Primarily used by unit tests.
930
+	 */
931
+	public function reset()
932
+	{
933
+		$this->_register_core_class_loaders();
934
+		$this->_register_core_dependencies();
935
+	}
936
+
937
+
938
+	/**
939
+	 * PLZ NOTE: a better name for this method would be is_alias()
940
+	 * because it returns TRUE if the provided fully qualified name IS an alias
941
+	 * WHY?
942
+	 * Because if a class is type hinting for a concretion,
943
+	 * then why would we need to find another class to supply it?
944
+	 * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`,
945
+	 * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`.
946
+	 * Don't go looking for some substitute.
947
+	 * Whereas if a class is type hinting for an interface...
948
+	 * then we need to find an actual class to use.
949
+	 * So the interface IS the alias for some other FQN,
950
+	 * and we need to find out if `Fully/Qualified/Namespace/SomeInterface`
951
+	 * represents some other class.
952
+	 *
953
+	 * @deprecated $VID:$
954
+	 * @param string $fqn
955
+	 * @param string $for_class
956
+	 * @return bool
957
+	 */
958
+	public function has_alias($fqn = '', $for_class = '')
959
+	{
960
+		return $this->isAlias($fqn, $for_class);
961
+	}
962
+
963
+
964
+	/**
965
+	 * PLZ NOTE: a better name for this method would be get_fqn_for_alias()
966
+	 * because it returns a FQN for provided alias if one exists, otherwise returns the original $alias
967
+	 * functions recursively, so that multiple aliases can be used to drill down to a FQN
968
+	 *  for example:
969
+	 *      if the following two entries were added to the _aliases array:
970
+	 *          array(
971
+	 *              'interface_alias'           => 'some\namespace\interface'
972
+	 *              'some\namespace\interface'  => 'some\namespace\classname'
973
+	 *          )
974
+	 *      then one could use EE_Registry::instance()->create( 'interface_alias' )
975
+	 *      to load an instance of 'some\namespace\classname'
976
+	 *
977
+	 * @deprecated $VID:$
978
+	 * @param string $alias
979
+	 * @param string $for_class
980
+	 * @return string
981
+	 */
982
+	public function get_alias($alias = '', $for_class = '')
983
+	{
984
+		return $this->getFqnForAlias($alias, $for_class);
985
+	}
986 986
 }
Please login to merge, or discard this patch.
core/EE_System.core.php 1 patch
Indentation   +1268 added lines, -1268 removed lines patch added patch discarded remove patch
@@ -27,1272 +27,1272 @@
 block discarded – undo
27 27
 final class EE_System implements ResettableInterface
28 28
 {
29 29
 
30
-    /**
31
-     * indicates this is a 'normal' request. Ie, not activation, nor upgrade, nor activation.
32
-     * So examples of this would be a normal GET request on the frontend or backend, or a POST, etc
33
-     */
34
-    const req_type_normal = 0;
35
-
36
-    /**
37
-     * Indicates this is a brand new installation of EE so we should install
38
-     * tables and default data etc
39
-     */
40
-    const req_type_new_activation = 1;
41
-
42
-    /**
43
-     * we've detected that EE has been reactivated (or EE was activated during maintenance mode,
44
-     * and we just exited maintenance mode). We MUST check the database is setup properly
45
-     * and that default data is setup too
46
-     */
47
-    const req_type_reactivation = 2;
48
-
49
-    /**
50
-     * indicates that EE has been upgraded since its previous request.
51
-     * We may have data migration scripts to call and will want to trigger maintenance mode
52
-     */
53
-    const req_type_upgrade = 3;
54
-
55
-    /**
56
-     * TODO  will detect that EE has been DOWNGRADED. We probably don't want to run in this case...
57
-     */
58
-    const req_type_downgrade = 4;
59
-
60
-    /**
61
-     * @deprecated since version 4.6.0.dev.006
62
-     * Now whenever a new_activation is detected the request type is still just
63
-     * new_activation (same for reactivation, upgrade, downgrade etc), but if we'r ein maintenance mode
64
-     * EE_System::initialize_db_if_no_migrations_required and EE_Addon::initialize_db_if_no_migrations_required
65
-     * will instead enqueue that EE plugin's db initialization for when we're taken out of maintenance mode.
66
-     * (Specifically, when the migration manager indicates migrations are finished
67
-     * EE_Data_Migration_Manager::initialize_db_for_enqueued_ee_plugins() will be called)
68
-     */
69
-    const req_type_activation_but_not_installed = 5;
70
-
71
-    /**
72
-     * option prefix for recording the activation history (like core's "espresso_db_update") of addons
73
-     */
74
-    const addon_activation_history_option_prefix = 'ee_addon_activation_history_';
75
-
76
-    /**
77
-     * @var EE_System $_instance
78
-     */
79
-    private static $_instance;
80
-
81
-    /**
82
-     * @var EE_Registry $registry
83
-     */
84
-    private $registry;
85
-
86
-    /**
87
-     * @var LoaderInterface $loader
88
-     */
89
-    private $loader;
90
-
91
-    /**
92
-     * @var EE_Capabilities $capabilities
93
-     */
94
-    private $capabilities;
95
-
96
-    /**
97
-     * @var RequestInterface $request
98
-     */
99
-    private $request;
100
-
101
-    /**
102
-     * @var EE_Maintenance_Mode $maintenance_mode
103
-     */
104
-    private $maintenance_mode;
105
-
106
-    /**
107
-     * Stores which type of request this is, options being one of the constants on EE_System starting with req_type_*.
108
-     * It can be a brand-new activation, a reactivation, an upgrade, a downgrade, or a normal request.
109
-     *
110
-     * @var int $_req_type
111
-     */
112
-    private $_req_type;
113
-
114
-    /**
115
-     * Whether or not there was a non-micro version change in EE core version during this request
116
-     *
117
-     * @var boolean $_major_version_change
118
-     */
119
-    private $_major_version_change = false;
120
-
121
-    /**
122
-     * A Context DTO dedicated solely to identifying the current request type.
123
-     *
124
-     * @var RequestTypeContextCheckerInterface $request_type
125
-     */
126
-    private $request_type;
127
-
128
-
129
-    /**
130
-     * @singleton method used to instantiate class object
131
-     * @param EE_Registry|null         $registry
132
-     * @param LoaderInterface|null     $loader
133
-     * @param RequestInterface|null    $request
134
-     * @param EE_Maintenance_Mode|null $maintenance_mode
135
-     * @return EE_System
136
-     */
137
-    public static function instance(
138
-        EE_Registry $registry = null,
139
-        LoaderInterface $loader = null,
140
-        RequestInterface $request = null,
141
-        EE_Maintenance_Mode $maintenance_mode = null
142
-    ) {
143
-        // check if class object is instantiated
144
-        if (! self::$_instance instanceof EE_System) {
145
-            self::$_instance = new self($registry, $loader, $request, $maintenance_mode);
146
-        }
147
-        return self::$_instance;
148
-    }
149
-
150
-
151
-    /**
152
-     * resets the instance and returns it
153
-     *
154
-     * @return EE_System
155
-     */
156
-    public static function reset()
157
-    {
158
-        self::$_instance->_req_type = null;
159
-        // make sure none of the old hooks are left hanging around
160
-        remove_all_actions('AHEE__EE_System__perform_activations_upgrades_and_migrations');
161
-        // we need to reset the migration manager in order for it to detect DMSs properly
162
-        EE_Data_Migration_Manager::reset();
163
-        self::instance()->detect_activations_or_upgrades();
164
-        self::instance()->perform_activations_upgrades_and_migrations();
165
-        return self::instance();
166
-    }
167
-
168
-
169
-    /**
170
-     * sets hooks for running rest of system
171
-     * provides "AHEE__EE_System__construct__complete" hook for EE Addons to use as their starting point
172
-     * starting EE Addons from any other point may lead to problems
173
-     *
174
-     * @param EE_Registry         $registry
175
-     * @param LoaderInterface     $loader
176
-     * @param RequestInterface    $request
177
-     * @param EE_Maintenance_Mode $maintenance_mode
178
-     */
179
-    private function __construct(
180
-        EE_Registry $registry,
181
-        LoaderInterface $loader,
182
-        RequestInterface $request,
183
-        EE_Maintenance_Mode $maintenance_mode
184
-    ) {
185
-        $this->registry = $registry;
186
-        $this->loader = $loader;
187
-        $this->request = $request;
188
-        $this->maintenance_mode = $maintenance_mode;
189
-        do_action('AHEE__EE_System__construct__begin', $this);
190
-        add_action(
191
-            'AHEE__EE_Bootstrap__load_espresso_addons',
192
-            array($this, 'loadCapabilities'),
193
-            5
194
-        );
195
-        add_action(
196
-            'AHEE__EE_Bootstrap__load_espresso_addons',
197
-            array($this, 'loadCommandBus'),
198
-            7
199
-        );
200
-        add_action(
201
-            'AHEE__EE_Bootstrap__load_espresso_addons',
202
-            array($this, 'loadPluginApi'),
203
-            9
204
-        );
205
-        // allow addons to load first so that they can register autoloaders, set hooks for running DMS's, etc
206
-        add_action(
207
-            'AHEE__EE_Bootstrap__load_espresso_addons',
208
-            array($this, 'load_espresso_addons')
209
-        );
210
-        // when an ee addon is activated, we want to call the core hook(s) again
211
-        // because the newly-activated addon didn't get a chance to run at all
212
-        add_action('activate_plugin', array($this, 'load_espresso_addons'), 1);
213
-        // detect whether install or upgrade
214
-        add_action(
215
-            'AHEE__EE_Bootstrap__detect_activations_or_upgrades',
216
-            array($this, 'detect_activations_or_upgrades'),
217
-            3
218
-        );
219
-        // load EE_Config, EE_Textdomain, etc
220
-        add_action(
221
-            'AHEE__EE_Bootstrap__load_core_configuration',
222
-            array($this, 'load_core_configuration'),
223
-            5
224
-        );
225
-        // load EE_Config, EE_Textdomain, etc
226
-        add_action(
227
-            'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets',
228
-            array($this, 'register_shortcodes_modules_and_widgets'),
229
-            7
230
-        );
231
-        // you wanna get going? I wanna get going... let's get going!
232
-        add_action(
233
-            'AHEE__EE_Bootstrap__brew_espresso',
234
-            array($this, 'brew_espresso'),
235
-            9
236
-        );
237
-        // other housekeeping
238
-        // exclude EE critical pages from wp_list_pages
239
-        add_filter(
240
-            'wp_list_pages_excludes',
241
-            array($this, 'remove_pages_from_wp_list_pages'),
242
-            10
243
-        );
244
-        // ALL EE Addons should use the following hook point to attach their initial setup too
245
-        // it's extremely important for EE Addons to register any class autoloaders so that they can be available when the EE_Config loads
246
-        do_action('AHEE__EE_System__construct__complete', $this);
247
-    }
248
-
249
-
250
-    /**
251
-     * load and setup EE_Capabilities
252
-     *
253
-     * @return void
254
-     * @throws EE_Error
255
-     */
256
-    public function loadCapabilities()
257
-    {
258
-        $this->capabilities = $this->loader->getShared('EE_Capabilities');
259
-        add_action(
260
-            'AHEE__EE_Capabilities__init_caps__before_initialization',
261
-            function () {
262
-                LoaderFactory::getLoader()->getShared('EE_Payment_Method_Manager');
263
-            }
264
-        );
265
-    }
266
-
267
-
268
-    /**
269
-     * create and cache the CommandBus, and also add middleware
270
-     * The CapChecker middleware requires the use of EE_Capabilities
271
-     * which is why we need to load the CommandBus after Caps are set up
272
-     *
273
-     * @return void
274
-     * @throws EE_Error
275
-     */
276
-    public function loadCommandBus()
277
-    {
278
-        $this->loader->getShared(
279
-            'CommandBusInterface',
280
-            array(
281
-                null,
282
-                apply_filters(
283
-                    'FHEE__EE_Load_Espresso_Core__handle_request__CommandBus_middleware',
284
-                    array(
285
-                        $this->loader->getShared('EventEspresso\core\services\commands\middleware\CapChecker'),
286
-                        $this->loader->getShared('EventEspresso\core\services\commands\middleware\AddActionHook'),
287
-                    )
288
-                ),
289
-            )
290
-        );
291
-    }
292
-
293
-
294
-    /**
295
-     * @return void
296
-     * @throws EE_Error
297
-     */
298
-    public function loadPluginApi()
299
-    {
300
-        // set autoloaders for all of the classes implementing EEI_Plugin_API
301
-        // which provide helpers for EE plugin authors to more easily register certain components with EE.
302
-        EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
303
-        $this->loader->getShared('EE_Request_Handler');
304
-    }
305
-
306
-
307
-    /**
308
-     * @param string $addon_name
309
-     * @param string $version_constant
310
-     * @param string $min_version_required
311
-     * @param string $load_callback
312
-     * @param string $plugin_file_constant
313
-     * @return void
314
-     */
315
-    private function deactivateIncompatibleAddon(
316
-        $addon_name,
317
-        $version_constant,
318
-        $min_version_required,
319
-        $load_callback,
320
-        $plugin_file_constant
321
-    ) {
322
-        if (! defined($version_constant)) {
323
-            return;
324
-        }
325
-        $addon_version = constant($version_constant);
326
-        if ($addon_version && version_compare($addon_version, $min_version_required, '<')) {
327
-            remove_action('AHEE__EE_System__load_espresso_addons', $load_callback);
328
-            if (! function_exists('deactivate_plugins')) {
329
-                require_once ABSPATH . 'wp-admin/includes/plugin.php';
330
-            }
331
-            deactivate_plugins(plugin_basename(constant($plugin_file_constant)));
332
-            unset($_GET['activate'], $_REQUEST['activate'], $_GET['activate-multi'], $_REQUEST['activate-multi']);
333
-            EE_Error::add_error(
334
-                sprintf(
335
-                    esc_html__(
336
-                        'We\'re sorry, but the Event Espresso %1$s addon was deactivated because version %2$s or higher is required with this version of Event Espresso core.',
337
-                        'event_espresso'
338
-                    ),
339
-                    $addon_name,
340
-                    $min_version_required
341
-                ),
342
-                __FILE__,
343
-                __FUNCTION__ . "({$addon_name})",
344
-                __LINE__
345
-            );
346
-            EE_Error::get_notices(false, true);
347
-        }
348
-    }
349
-
350
-
351
-    /**
352
-     * load_espresso_addons
353
-     * allow addons to load first so that they can set hooks for running DMS's, etc
354
-     * this is hooked into both:
355
-     *    'AHEE__EE_Bootstrap__load_core_configuration'
356
-     *        which runs during the WP 'plugins_loaded' action at priority 5
357
-     *    and the WP 'activate_plugin' hook point
358
-     *
359
-     * @access public
360
-     * @return void
361
-     */
362
-    public function load_espresso_addons()
363
-    {
364
-        $this->deactivateIncompatibleAddon(
365
-            'Wait Lists',
366
-            'EE_WAIT_LISTS_VERSION',
367
-            '1.0.0.beta.074',
368
-            'load_espresso_wait_lists',
369
-            'EE_WAIT_LISTS_PLUGIN_FILE'
370
-        );
371
-        $this->deactivateIncompatibleAddon(
372
-            'Automated Upcoming Event Notifications',
373
-            'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_VERSION',
374
-            '1.0.0.beta.091',
375
-            'load_espresso_automated_upcoming_event_notification',
376
-            'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_PLUGIN_FILE'
377
-        );
378
-        do_action('AHEE__EE_System__load_espresso_addons');
379
-        // if the WP API basic auth plugin isn't already loaded, load it now.
380
-        // We want it for mobile apps. Just include the entire plugin
381
-        // also, don't load the basic auth when a plugin is getting activated, because
382
-        // it could be the basic auth plugin, and it doesn't check if its methods are already defined
383
-        // and causes a fatal error
384
-        if ($this->request->getRequestParam('activate') !== 'true'
385
-            && ! function_exists('json_basic_auth_handler')
386
-            && ! function_exists('json_basic_auth_error')
387
-            && ! in_array(
388
-                $this->request->getRequestParam('action'),
389
-                array('activate', 'activate-selected'),
390
-                true
391
-            )
392
-        ) {
393
-            include_once EE_THIRD_PARTY . 'wp-api-basic-auth' . DS . 'basic-auth.php';
394
-        }
395
-        do_action('AHEE__EE_System__load_espresso_addons__complete');
396
-    }
397
-
398
-
399
-    /**
400
-     * detect_activations_or_upgrades
401
-     * Checks for activation or upgrade of core first;
402
-     * then also checks if any registered addons have been activated or upgraded
403
-     * This is hooked into 'AHEE__EE_Bootstrap__detect_activations_or_upgrades'
404
-     * which runs during the WP 'plugins_loaded' action at priority 3
405
-     *
406
-     * @access public
407
-     * @return void
408
-     */
409
-    public function detect_activations_or_upgrades()
410
-    {
411
-        // first off: let's make sure to handle core
412
-        $this->detect_if_activation_or_upgrade();
413
-        foreach ($this->registry->addons as $addon) {
414
-            if ($addon instanceof EE_Addon) {
415
-                // detect teh request type for that addon
416
-                $addon->detect_activation_or_upgrade();
417
-            }
418
-        }
419
-    }
420
-
421
-
422
-    /**
423
-     * detect_if_activation_or_upgrade
424
-     * Takes care of detecting whether this is a brand new install or code upgrade,
425
-     * and either setting up the DB or setting up maintenance mode etc.
426
-     *
427
-     * @access public
428
-     * @return void
429
-     */
430
-    public function detect_if_activation_or_upgrade()
431
-    {
432
-        do_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin');
433
-        // check if db has been updated, or if its a brand-new installation
434
-        $espresso_db_update = $this->fix_espresso_db_upgrade_option();
435
-        $request_type = $this->detect_req_type($espresso_db_update);
436
-        // EEH_Debug_Tools::printr( $request_type, '$request_type', __FILE__, __LINE__ );
437
-        switch ($request_type) {
438
-            case EE_System::req_type_new_activation:
439
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__new_activation');
440
-                $this->_handle_core_version_change($espresso_db_update);
441
-                break;
442
-            case EE_System::req_type_reactivation:
443
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__reactivation');
444
-                $this->_handle_core_version_change($espresso_db_update);
445
-                break;
446
-            case EE_System::req_type_upgrade:
447
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__upgrade');
448
-                // migrations may be required now that we've upgraded
449
-                $this->maintenance_mode->set_maintenance_mode_if_db_old();
450
-                $this->_handle_core_version_change($espresso_db_update);
451
-                break;
452
-            case EE_System::req_type_downgrade:
453
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__downgrade');
454
-                // its possible migrations are no longer required
455
-                $this->maintenance_mode->set_maintenance_mode_if_db_old();
456
-                $this->_handle_core_version_change($espresso_db_update);
457
-                break;
458
-            case EE_System::req_type_normal:
459
-            default:
460
-                break;
461
-        }
462
-        do_action('AHEE__EE_System__detect_if_activation_or_upgrade__complete');
463
-    }
464
-
465
-
466
-    /**
467
-     * Updates the list of installed versions and sets hooks for
468
-     * initializing the database later during the request
469
-     *
470
-     * @param array $espresso_db_update
471
-     */
472
-    private function _handle_core_version_change($espresso_db_update)
473
-    {
474
-        $this->update_list_of_installed_versions($espresso_db_update);
475
-        // get ready to verify the DB is ok (provided we aren't in maintenance mode, of course)
476
-        add_action(
477
-            'AHEE__EE_System__perform_activations_upgrades_and_migrations',
478
-            array($this, 'initialize_db_if_no_migrations_required')
479
-        );
480
-    }
481
-
482
-
483
-    /**
484
-     * standardizes the wp option 'espresso_db_upgrade' which actually stores
485
-     * information about what versions of EE have been installed and activated,
486
-     * NOT necessarily the state of the database
487
-     *
488
-     * @param mixed $espresso_db_update           the value of the WordPress option.
489
-     *                                            If not supplied, fetches it from the options table
490
-     * @return array the correct value of 'espresso_db_upgrade', after saving it, if it needed correction
491
-     */
492
-    private function fix_espresso_db_upgrade_option($espresso_db_update = null)
493
-    {
494
-        do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__begin', $espresso_db_update);
495
-        if (! $espresso_db_update) {
496
-            $espresso_db_update = get_option('espresso_db_update');
497
-        }
498
-        // check that option is an array
499
-        if (! is_array($espresso_db_update)) {
500
-            // if option is FALSE, then it never existed
501
-            if ($espresso_db_update === false) {
502
-                // make $espresso_db_update an array and save option with autoload OFF
503
-                $espresso_db_update = array();
504
-                add_option('espresso_db_update', $espresso_db_update, '', 'no');
505
-            } else {
506
-                // option is NOT FALSE but also is NOT an array, so make it an array and save it
507
-                $espresso_db_update = array($espresso_db_update => array());
508
-                update_option('espresso_db_update', $espresso_db_update);
509
-            }
510
-        } else {
511
-            $corrected_db_update = array();
512
-            // if IS an array, but is it an array where KEYS are version numbers, and values are arrays?
513
-            foreach ($espresso_db_update as $should_be_version_string => $should_be_array) {
514
-                if (is_int($should_be_version_string) && ! is_array($should_be_array)) {
515
-                    // the key is an int, and the value IS NOT an array
516
-                    // so it must be numerically-indexed, where values are versions installed...
517
-                    // fix it!
518
-                    $version_string = $should_be_array;
519
-                    $corrected_db_update[ $version_string ] = array('unknown-date');
520
-                } else {
521
-                    // ok it checks out
522
-                    $corrected_db_update[ $should_be_version_string ] = $should_be_array;
523
-                }
524
-            }
525
-            $espresso_db_update = $corrected_db_update;
526
-            update_option('espresso_db_update', $espresso_db_update);
527
-        }
528
-        do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__complete', $espresso_db_update);
529
-        return $espresso_db_update;
530
-    }
531
-
532
-
533
-    /**
534
-     * Does the traditional work of setting up the plugin's database and adding default data.
535
-     * If migration script/process did not exist, this is what would happen on every activation/reactivation/upgrade.
536
-     * NOTE: if we're in maintenance mode (which would be the case if we detect there are data
537
-     * migration scripts that need to be run and a version change happens), enqueues core for database initialization,
538
-     * so that it will be done when migrations are finished
539
-     *
540
-     * @param boolean $initialize_addons_too if true, we double-check addons' database tables etc too;
541
-     * @param boolean $verify_schema         if true will re-check the database tables have the correct schema.
542
-     *                                       This is a resource-intensive job
543
-     *                                       so we prefer to only do it when necessary
544
-     * @return void
545
-     * @throws EE_Error
546
-     */
547
-    public function initialize_db_if_no_migrations_required($initialize_addons_too = false, $verify_schema = true)
548
-    {
549
-        $request_type = $this->detect_req_type();
550
-        // only initialize system if we're not in maintenance mode.
551
-        if ($this->maintenance_mode->level() !== EE_Maintenance_Mode::level_2_complete_maintenance) {
552
-            /** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
553
-            $rewrite_rules = $this->loader->getShared(
554
-                'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
555
-            );
556
-            $rewrite_rules->flush();
557
-            if ($verify_schema) {
558
-                EEH_Activation::initialize_db_and_folders();
559
-            }
560
-            EEH_Activation::initialize_db_content();
561
-            EEH_Activation::system_initialization();
562
-            if ($initialize_addons_too) {
563
-                $this->initialize_addons();
564
-            }
565
-        } else {
566
-            EE_Data_Migration_Manager::instance()->enqueue_db_initialization_for('Core');
567
-        }
568
-        if ($request_type === EE_System::req_type_new_activation
569
-            || $request_type === EE_System::req_type_reactivation
570
-            || (
571
-                $request_type === EE_System::req_type_upgrade
572
-                && $this->is_major_version_change()
573
-            )
574
-        ) {
575
-            add_action('AHEE__EE_System__initialize_last', array($this, 'redirect_to_about_ee'), 9);
576
-        }
577
-    }
578
-
579
-
580
-    /**
581
-     * Initializes the db for all registered addons
582
-     *
583
-     * @throws EE_Error
584
-     */
585
-    public function initialize_addons()
586
-    {
587
-        // foreach registered addon, make sure its db is up-to-date too
588
-        foreach ($this->registry->addons as $addon) {
589
-            if ($addon instanceof EE_Addon) {
590
-                $addon->initialize_db_if_no_migrations_required();
591
-            }
592
-        }
593
-    }
594
-
595
-
596
-    /**
597
-     * Adds the current code version to the saved wp option which stores a list of all ee versions ever installed.
598
-     *
599
-     * @param    array  $version_history
600
-     * @param    string $current_version_to_add version to be added to the version history
601
-     * @return    boolean success as to whether or not this option was changed
602
-     */
603
-    public function update_list_of_installed_versions($version_history = null, $current_version_to_add = null)
604
-    {
605
-        if (! $version_history) {
606
-            $version_history = $this->fix_espresso_db_upgrade_option($version_history);
607
-        }
608
-        if ($current_version_to_add === null) {
609
-            $current_version_to_add = espresso_version();
610
-        }
611
-        $version_history[ $current_version_to_add ][] = date('Y-m-d H:i:s', time());
612
-        // re-save
613
-        return update_option('espresso_db_update', $version_history);
614
-    }
615
-
616
-
617
-    /**
618
-     * Detects if the current version indicated in the has existed in the list of
619
-     * previously-installed versions of EE (espresso_db_update). Does NOT modify it (ie, no side-effect)
620
-     *
621
-     * @param array $espresso_db_update array from the wp option stored under the name 'espresso_db_update'.
622
-     *                                  If not supplied, fetches it from the options table.
623
-     *                                  Also, caches its result so later parts of the code can also know whether
624
-     *                                  there's been an update or not. This way we can add the current version to
625
-     *                                  espresso_db_update, but still know if this is a new install or not
626
-     * @return int one of the constants on EE_System::req_type_
627
-     */
628
-    public function detect_req_type($espresso_db_update = null)
629
-    {
630
-        if ($this->_req_type === null) {
631
-            $espresso_db_update = ! empty($espresso_db_update)
632
-                ? $espresso_db_update
633
-                : $this->fix_espresso_db_upgrade_option();
634
-            $this->_req_type = EE_System::detect_req_type_given_activation_history(
635
-                $espresso_db_update,
636
-                'ee_espresso_activation',
637
-                espresso_version()
638
-            );
639
-            $this->_major_version_change = $this->_detect_major_version_change($espresso_db_update);
640
-            $this->request->setIsActivation($this->_req_type !== EE_System::req_type_normal);
641
-        }
642
-        return $this->_req_type;
643
-    }
644
-
645
-
646
-    /**
647
-     * Returns whether or not there was a non-micro version change (ie, change in either
648
-     * the first or second number in the version. Eg 4.9.0.rc.001 to 4.10.0.rc.000,
649
-     * but not 4.9.0.rc.0001 to 4.9.1.rc.0001
650
-     *
651
-     * @param $activation_history
652
-     * @return bool
653
-     */
654
-    private function _detect_major_version_change($activation_history)
655
-    {
656
-        $previous_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history);
657
-        $previous_version_parts = explode('.', $previous_version);
658
-        $current_version_parts = explode('.', espresso_version());
659
-        return isset($previous_version_parts[0], $previous_version_parts[1], $current_version_parts[0], $current_version_parts[1])
660
-               && ($previous_version_parts[0] !== $current_version_parts[0]
661
-                   || $previous_version_parts[1] !== $current_version_parts[1]
662
-               );
663
-    }
664
-
665
-
666
-    /**
667
-     * Returns true if either the major or minor version of EE changed during this request.
668
-     * Eg 4.9.0.rc.001 to 4.10.0.rc.000, but not 4.9.0.rc.0001 to 4.9.1.rc.0001
669
-     *
670
-     * @return bool
671
-     */
672
-    public function is_major_version_change()
673
-    {
674
-        return $this->_major_version_change;
675
-    }
676
-
677
-
678
-    /**
679
-     * Determines the request type for any ee addon, given three piece of info: the current array of activation
680
-     * histories (for core that' 'espresso_db_update' wp option); the name of the WordPress option which is temporarily
681
-     * set upon activation of the plugin (for core it's 'ee_espresso_activation'); and the version that this plugin was
682
-     * just activated to (for core that will always be espresso_version())
683
-     *
684
-     * @param array  $activation_history_for_addon     the option's value which stores the activation history for this
685
-     *                                                 ee plugin. for core that's 'espresso_db_update'
686
-     * @param string $activation_indicator_option_name the name of the WordPress option that is temporarily set to
687
-     *                                                 indicate that this plugin was just activated
688
-     * @param string $version_to_upgrade_to            the version that was just upgraded to (for core that will be
689
-     *                                                 espresso_version())
690
-     * @return int one of the constants on EE_System::req_type_*
691
-     */
692
-    public static function detect_req_type_given_activation_history(
693
-        $activation_history_for_addon,
694
-        $activation_indicator_option_name,
695
-        $version_to_upgrade_to
696
-    ) {
697
-        $version_is_higher = self::_new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to);
698
-        if ($activation_history_for_addon) {
699
-            // it exists, so this isn't a completely new install
700
-            // check if this version already in that list of previously installed versions
701
-            if (! isset($activation_history_for_addon[ $version_to_upgrade_to ])) {
702
-                // it a version we haven't seen before
703
-                if ($version_is_higher === 1) {
704
-                    $req_type = EE_System::req_type_upgrade;
705
-                } else {
706
-                    $req_type = EE_System::req_type_downgrade;
707
-                }
708
-                delete_option($activation_indicator_option_name);
709
-            } else {
710
-                // its not an update. maybe a reactivation?
711
-                if (get_option($activation_indicator_option_name, false)) {
712
-                    if ($version_is_higher === -1) {
713
-                        $req_type = EE_System::req_type_downgrade;
714
-                    } elseif ($version_is_higher === 0) {
715
-                        // we've seen this version before, but it's an activation. must be a reactivation
716
-                        $req_type = EE_System::req_type_reactivation;
717
-                    } else {// $version_is_higher === 1
718
-                        $req_type = EE_System::req_type_upgrade;
719
-                    }
720
-                    delete_option($activation_indicator_option_name);
721
-                } else {
722
-                    // we've seen this version before and the activation indicate doesn't show it was just activated
723
-                    if ($version_is_higher === -1) {
724
-                        $req_type = EE_System::req_type_downgrade;
725
-                    } elseif ($version_is_higher === 0) {
726
-                        // we've seen this version before and it's not an activation. its normal request
727
-                        $req_type = EE_System::req_type_normal;
728
-                    } else {// $version_is_higher === 1
729
-                        $req_type = EE_System::req_type_upgrade;
730
-                    }
731
-                }
732
-            }
733
-        } else {
734
-            // brand new install
735
-            $req_type = EE_System::req_type_new_activation;
736
-            delete_option($activation_indicator_option_name);
737
-        }
738
-        return $req_type;
739
-    }
740
-
741
-
742
-    /**
743
-     * Detects if the $version_to_upgrade_to is higher than the most recent version in
744
-     * the $activation_history_for_addon
745
-     *
746
-     * @param array  $activation_history_for_addon (keys are versions, values are arrays of times activated,
747
-     *                                             sometimes containing 'unknown-date'
748
-     * @param string $version_to_upgrade_to        (current version)
749
-     * @return int results of version_compare( $version_to_upgrade_to, $most_recently_active_version ).
750
-     *                                             ie, -1 if $version_to_upgrade_to is LOWER (downgrade);
751
-     *                                             0 if $version_to_upgrade_to MATCHES (reactivation or normal request);
752
-     *                                             1 if $version_to_upgrade_to is HIGHER (upgrade) ;
753
-     */
754
-    private static function _new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to)
755
-    {
756
-        // find the most recently-activated version
757
-        $most_recently_active_version =
758
-            EE_System::_get_most_recently_active_version_from_activation_history($activation_history_for_addon);
759
-        return version_compare($version_to_upgrade_to, $most_recently_active_version);
760
-    }
761
-
762
-
763
-    /**
764
-     * Gets the most recently active version listed in the activation history,
765
-     * and if none are found (ie, it's a brand new install) returns '0.0.0.dev.000'.
766
-     *
767
-     * @param array $activation_history  (keys are versions, values are arrays of times activated,
768
-     *                                   sometimes containing 'unknown-date'
769
-     * @return string
770
-     */
771
-    private static function _get_most_recently_active_version_from_activation_history($activation_history)
772
-    {
773
-        $most_recently_active_version_activation = '1970-01-01 00:00:00';
774
-        $most_recently_active_version = '0.0.0.dev.000';
775
-        if (is_array($activation_history)) {
776
-            foreach ($activation_history as $version => $times_activated) {
777
-                // check there is a record of when this version was activated. Otherwise,
778
-                // mark it as unknown
779
-                if (! $times_activated) {
780
-                    $times_activated = array('unknown-date');
781
-                }
782
-                if (is_string($times_activated)) {
783
-                    $times_activated = array($times_activated);
784
-                }
785
-                foreach ($times_activated as $an_activation) {
786
-                    if ($an_activation !== 'unknown-date'
787
-                        && $an_activation
788
-                           > $most_recently_active_version_activation) {
789
-                        $most_recently_active_version = $version;
790
-                        $most_recently_active_version_activation = $an_activation === 'unknown-date'
791
-                            ? '1970-01-01 00:00:00'
792
-                            : $an_activation;
793
-                    }
794
-                }
795
-            }
796
-        }
797
-        return $most_recently_active_version;
798
-    }
799
-
800
-
801
-    /**
802
-     * This redirects to the about EE page after activation
803
-     *
804
-     * @return void
805
-     */
806
-    public function redirect_to_about_ee()
807
-    {
808
-        $notices = EE_Error::get_notices(false);
809
-        // if current user is an admin and it's not an ajax or rest request
810
-        if (! isset($notices['errors'])
811
-            && $this->request->isAdmin()
812
-            && apply_filters(
813
-                'FHEE__EE_System__redirect_to_about_ee__do_redirect',
814
-                $this->capabilities->current_user_can('manage_options', 'espresso_about_default')
815
-            )
816
-        ) {
817
-            $query_params = array('page' => 'espresso_about');
818
-            if (EE_System::instance()->detect_req_type() === EE_System::req_type_new_activation) {
819
-                $query_params['new_activation'] = true;
820
-            }
821
-            if (EE_System::instance()->detect_req_type() === EE_System::req_type_reactivation) {
822
-                $query_params['reactivation'] = true;
823
-            }
824
-            $url = add_query_arg($query_params, admin_url('admin.php'));
825
-            wp_safe_redirect($url);
826
-            exit();
827
-        }
828
-    }
829
-
830
-
831
-    /**
832
-     * load_core_configuration
833
-     * this is hooked into 'AHEE__EE_Bootstrap__load_core_configuration'
834
-     * which runs during the WP 'plugins_loaded' action at priority 5
835
-     *
836
-     * @return void
837
-     * @throws ReflectionException
838
-     */
839
-    public function load_core_configuration()
840
-    {
841
-        do_action('AHEE__EE_System__load_core_configuration__begin', $this);
842
-        $this->loader->getShared('EE_Load_Textdomain');
843
-        // load textdomain
844
-        EE_Load_Textdomain::load_textdomain();
845
-        // load and setup EE_Config and EE_Network_Config
846
-        $config = $this->loader->getShared('EE_Config');
847
-        $this->loader->getShared('EE_Network_Config');
848
-        // setup autoloaders
849
-        // enable logging?
850
-        if ($config->admin->use_full_logging) {
851
-            $this->loader->getShared('EE_Log');
852
-        }
853
-        // check for activation errors
854
-        $activation_errors = get_option('ee_plugin_activation_errors', false);
855
-        if ($activation_errors) {
856
-            EE_Error::add_error($activation_errors, __FILE__, __FUNCTION__, __LINE__);
857
-            update_option('ee_plugin_activation_errors', false);
858
-        }
859
-        // get model names
860
-        $this->_parse_model_names();
861
-        // load caf stuff a chance to play during the activation process too.
862
-        $this->_maybe_brew_regular();
863
-        // configure custom post type definitions
864
-        $this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions');
865
-        $this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions');
866
-        do_action('AHEE__EE_System__load_core_configuration__complete', $this);
867
-    }
868
-
869
-
870
-    /**
871
-     * cycles through all of the models/*.model.php files, and assembles an array of model names
872
-     *
873
-     * @return void
874
-     * @throws ReflectionException
875
-     */
876
-    private function _parse_model_names()
877
-    {
878
-        // get all the files in the EE_MODELS folder that end in .model.php
879
-        $models = glob(EE_MODELS . '*.model.php');
880
-        $model_names = array();
881
-        $non_abstract_db_models = array();
882
-        foreach ($models as $model) {
883
-            // get model classname
884
-            $classname = EEH_File::get_classname_from_filepath_with_standard_filename($model);
885
-            $short_name = str_replace('EEM_', '', $classname);
886
-            $reflectionClass = new ReflectionClass($classname);
887
-            if ($reflectionClass->isSubclassOf('EEM_Base') && ! $reflectionClass->isAbstract()) {
888
-                $non_abstract_db_models[ $short_name ] = $classname;
889
-            }
890
-            $model_names[ $short_name ] = $classname;
891
-        }
892
-        $this->registry->models = apply_filters('FHEE__EE_System__parse_model_names', $model_names);
893
-        $this->registry->non_abstract_db_models = apply_filters(
894
-            'FHEE__EE_System__parse_implemented_model_names',
895
-            $non_abstract_db_models
896
-        );
897
-    }
898
-
899
-
900
-    /**
901
-     * The purpose of this method is to simply check for a file named "caffeinated/brewing_regular.php" for any hooks
902
-     * that need to be setup before our EE_System launches.
903
-     *
904
-     * @return void
905
-     * @throws DomainException
906
-     * @throws InvalidArgumentException
907
-     * @throws InvalidDataTypeException
908
-     * @throws InvalidInterfaceException
909
-     * @throws InvalidClassException
910
-     * @throws InvalidFilePathException
911
-     */
912
-    private function _maybe_brew_regular()
913
-    {
914
-        /** @var Domain $domain */
915
-        $domain = DomainFactory::getShared(
916
-            new FullyQualifiedName(
917
-                'EventEspresso\core\domain\Domain'
918
-            ),
919
-            array(
920
-                new FilePath(EVENT_ESPRESSO_MAIN_FILE),
921
-                Version::fromString(espresso_version()),
922
-            )
923
-        );
924
-        if ($domain->isCaffeinated()) {
925
-            require_once EE_CAFF_PATH . 'brewing_regular.php';
926
-        }
927
-    }
928
-
929
-
930
-    /**
931
-     * register_shortcodes_modules_and_widgets
932
-     * generate lists of shortcodes and modules, then verify paths and classes
933
-     * This is hooked into 'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets'
934
-     * which runs during the WP 'plugins_loaded' action at priority 7
935
-     *
936
-     * @access public
937
-     * @return void
938
-     * @throws Exception
939
-     */
940
-    public function register_shortcodes_modules_and_widgets()
941
-    {
942
-        try {
943
-            // load, register, and add shortcodes the new way
944
-            if ($this->request->isFrontend() || $this->request->isIframe()) {
945
-                $this->loader->getShared(
946
-                    'EventEspresso\core\services\shortcodes\ShortcodesManager',
947
-                    array(
948
-                        // and the old way, but we'll put it under control of the new system
949
-                        EE_Config::getLegacyShortcodesManager(),
950
-                    )
951
-                );
952
-            }
953
-        } catch (Exception $exception) {
954
-            new ExceptionStackTraceDisplay($exception);
955
-        }
956
-        do_action('AHEE__EE_System__register_shortcodes_modules_and_widgets');
957
-        // check for addons using old hook point
958
-        if (has_action('AHEE__EE_System__register_shortcodes_modules_and_addons')) {
959
-            $this->_incompatible_addon_error();
960
-        }
961
-    }
962
-
963
-
964
-    /**
965
-     * _incompatible_addon_error
966
-     *
967
-     * @access public
968
-     * @return void
969
-     */
970
-    private function _incompatible_addon_error()
971
-    {
972
-        // get array of classes hooking into here
973
-        $class_names = EEH_Class_Tools::get_class_names_for_all_callbacks_on_hook(
974
-            'AHEE__EE_System__register_shortcodes_modules_and_addons'
975
-        );
976
-        if (! empty($class_names)) {
977
-            $msg = __(
978
-                'The following plugins, addons, or modules appear to be incompatible with this version of Event Espresso and were automatically deactivated to avoid fatal errors:',
979
-                'event_espresso'
980
-            );
981
-            $msg .= '<ul>';
982
-            foreach ($class_names as $class_name) {
983
-                $msg .= '<li><b>Event Espresso - '
984
-                        . str_replace(
985
-                            array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'),
986
-                            '',
987
-                            $class_name
988
-                        ) . '</b></li>';
989
-            }
990
-            $msg .= '</ul>';
991
-            $msg .= __(
992
-                'Compatibility issues can be avoided and/or resolved by keeping addons and plugins updated to the latest version.',
993
-                'event_espresso'
994
-            );
995
-            // save list of incompatible addons to wp-options for later use
996
-            add_option('ee_incompatible_addons', $class_names, '', 'no');
997
-            if (is_admin()) {
998
-                EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
999
-            }
1000
-        }
1001
-    }
1002
-
1003
-
1004
-    /**
1005
-     * brew_espresso
1006
-     * begins the process of setting hooks for initializing EE in the correct order
1007
-     * This is happening on the 'AHEE__EE_Bootstrap__brew_espresso' hook point
1008
-     * which runs during the WP 'plugins_loaded' action at priority 9
1009
-     *
1010
-     * @return void
1011
-     */
1012
-    public function brew_espresso()
1013
-    {
1014
-        do_action('AHEE__EE_System__brew_espresso__begin', $this);
1015
-        // load some final core systems
1016
-        add_action('init', array($this, 'set_hooks_for_core'), 1);
1017
-        add_action('init', array($this, 'perform_activations_upgrades_and_migrations'), 3);
1018
-        add_action('init', array($this, 'load_CPTs_and_session'), 5);
1019
-        add_action('init', array($this, 'load_controllers'), 7);
1020
-        add_action('init', array($this, 'core_loaded_and_ready'), 9);
1021
-        add_action('init', array($this, 'initialize'), 10);
1022
-        add_action('init', array($this, 'initialize_last'), 100);
1023
-        if (is_admin() && apply_filters('FHEE__EE_System__brew_espresso__load_pue', true)) {
1024
-            // pew pew pew
1025
-            $this->loader->getShared('EventEspresso\core\services\licensing\LicenseService');
1026
-            do_action('AHEE__EE_System__brew_espresso__after_pue_init');
1027
-        }
1028
-        do_action('AHEE__EE_System__brew_espresso__complete', $this);
1029
-    }
1030
-
1031
-
1032
-    /**
1033
-     *    set_hooks_for_core
1034
-     *
1035
-     * @access public
1036
-     * @return    void
1037
-     * @throws EE_Error
1038
-     */
1039
-    public function set_hooks_for_core()
1040
-    {
1041
-        $this->_deactivate_incompatible_addons();
1042
-        do_action('AHEE__EE_System__set_hooks_for_core');
1043
-        $this->loader->getShared('EventEspresso\core\domain\values\session\SessionLifespan');
1044
-        // caps need to be initialized on every request so that capability maps are set.
1045
-        // @see https://events.codebasehq.com/projects/event-espresso/tickets/8674
1046
-        $this->registry->CAP->init_caps();
1047
-    }
1048
-
1049
-
1050
-    /**
1051
-     * Using the information gathered in EE_System::_incompatible_addon_error,
1052
-     * deactivates any addons considered incompatible with the current version of EE
1053
-     */
1054
-    private function _deactivate_incompatible_addons()
1055
-    {
1056
-        $incompatible_addons = get_option('ee_incompatible_addons', array());
1057
-        if (! empty($incompatible_addons)) {
1058
-            $active_plugins = get_option('active_plugins', array());
1059
-            foreach ($active_plugins as $active_plugin) {
1060
-                foreach ($incompatible_addons as $incompatible_addon) {
1061
-                    if (strpos($active_plugin, $incompatible_addon) !== false) {
1062
-                        unset($_GET['activate']);
1063
-                        espresso_deactivate_plugin($active_plugin);
1064
-                    }
1065
-                }
1066
-            }
1067
-        }
1068
-    }
1069
-
1070
-
1071
-    /**
1072
-     *    perform_activations_upgrades_and_migrations
1073
-     *
1074
-     * @access public
1075
-     * @return    void
1076
-     */
1077
-    public function perform_activations_upgrades_and_migrations()
1078
-    {
1079
-        do_action('AHEE__EE_System__perform_activations_upgrades_and_migrations');
1080
-    }
1081
-
1082
-
1083
-    /**
1084
-     * @return void
1085
-     * @throws DomainException
1086
-     */
1087
-    public function load_CPTs_and_session()
1088
-    {
1089
-        do_action('AHEE__EE_System__load_CPTs_and_session__start');
1090
-        /** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies $register_custom_taxonomies */
1091
-        $register_custom_taxonomies = $this->loader->getShared(
1092
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies'
1093
-        );
1094
-        $register_custom_taxonomies->registerCustomTaxonomies();
1095
-        /** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes $register_custom_post_types */
1096
-        $register_custom_post_types = $this->loader->getShared(
1097
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes'
1098
-        );
1099
-        $register_custom_post_types->registerCustomPostTypes();
1100
-        /** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms $register_custom_taxonomy_terms */
1101
-        $register_custom_taxonomy_terms = $this->loader->getShared(
1102
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms'
1103
-        );
1104
-        $register_custom_taxonomy_terms->registerCustomTaxonomyTerms();
1105
-        // load legacy Custom Post Types and Taxonomies
1106
-        $this->loader->getShared('EE_Register_CPTs');
1107
-        do_action('AHEE__EE_System__load_CPTs_and_session__complete');
1108
-    }
1109
-
1110
-
1111
-    /**
1112
-     * load_controllers
1113
-     * this is the best place to load any additional controllers that needs access to EE core.
1114
-     * it is expected that all basic core EE systems, that are not dependant on the current request are loaded at this
1115
-     * time
1116
-     *
1117
-     * @access public
1118
-     * @return void
1119
-     */
1120
-    public function load_controllers()
1121
-    {
1122
-        do_action('AHEE__EE_System__load_controllers__start');
1123
-        // let's get it started
1124
-        if (! $this->maintenance_mode->level()
1125
-            && ($this->request->isFrontend() || $this->request->isFrontAjax())
1126
-        ) {
1127
-            do_action('AHEE__EE_System__load_controllers__load_front_controllers');
1128
-            $this->loader->getShared('EE_Front_Controller');
1129
-        } elseif ($this->request->isAdmin() || $this->request->isAdminAjax()) {
1130
-            do_action('AHEE__EE_System__load_controllers__load_admin_controllers');
1131
-            $this->loader->getShared('EE_Admin');
1132
-        }
1133
-        do_action('AHEE__EE_System__load_controllers__complete');
1134
-    }
1135
-
1136
-
1137
-    /**
1138
-     * core_loaded_and_ready
1139
-     * all of the basic EE core should be loaded at this point and available regardless of M-Mode
1140
-     *
1141
-     * @access public
1142
-     * @return void
1143
-     * @throws Exception
1144
-     */
1145
-    public function core_loaded_and_ready()
1146
-    {
1147
-        if ($this->request->isAdmin() || $this->request->isFrontend() || $this->request->isIframe()) {
1148
-            try {
1149
-                $this->loader->getShared('EventEspresso\core\services\assets\Registry');
1150
-                $this->loader->getShared('EventEspresso\core\domain\services\assets\CoreAssetManager');
1151
-                if (function_exists('register_block_type')) {
1152
-                    $this->loader->getShared(
1153
-                        'EventEspresso\core\services\editor\BlockRegistrationManager'
1154
-                    );
1155
-                }
1156
-            } catch (Exception $exception) {
1157
-                new ExceptionStackTraceDisplay($exception);
1158
-            }
1159
-        }
1160
-        if ($this->request->isAdmin()
1161
-            || $this->request->isEeAjax()
1162
-            || $this->request->isFrontend()
1163
-        ) {
1164
-            $this->loader->getShared('EE_Session');
1165
-        }
1166
-        do_action('AHEE__EE_System__core_loaded_and_ready');
1167
-        // load_espresso_template_tags
1168
-        if (is_readable(EE_PUBLIC . 'template_tags.php')
1169
-            && ($this->request->isFrontend()
1170
-                || $this->request->isAdmin()
1171
-                || $this->request->isIframe()
1172
-                || $this->request->isFeed()
1173
-            )
1174
-        ) {
1175
-            require_once EE_PUBLIC . 'template_tags.php';
1176
-        }
1177
-        do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
1178
-    }
1179
-
1180
-
1181
-    /**
1182
-     * initialize
1183
-     * this is the best place to begin initializing client code
1184
-     *
1185
-     * @access public
1186
-     * @return void
1187
-     */
1188
-    public function initialize()
1189
-    {
1190
-        do_action('AHEE__EE_System__initialize');
1191
-    }
1192
-
1193
-
1194
-    /**
1195
-     * initialize_last
1196
-     * this is run really late during the WP init hook point, and ensures that mostly everything else that needs to
1197
-     * initialize has done so
1198
-     *
1199
-     * @access public
1200
-     * @return void
1201
-     */
1202
-    public function initialize_last()
1203
-    {
1204
-        do_action('AHEE__EE_System__initialize_last');
1205
-        /** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
1206
-        $rewrite_rules = $this->loader->getShared(
1207
-            'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
1208
-        );
1209
-        $rewrite_rules->flushRewriteRules();
1210
-        add_action('admin_bar_init', array($this, 'addEspressoToolbar'));
1211
-        if ($this->request->isAdmin() && function_exists('wp_add_privacy_policy_content')) {
1212
-            $this->loader->getShared('EventEspresso\core\services\privacy\policy\PrivacyPolicyManager');
1213
-        }
1214
-    }
1215
-
1216
-
1217
-    /**
1218
-     * @return void
1219
-     * @throws EE_Error
1220
-     */
1221
-    public function addEspressoToolbar()
1222
-    {
1223
-        $this->loader->getShared(
1224
-            'EventEspresso\core\domain\services\admin\AdminToolBar',
1225
-            array($this->registry->CAP)
1226
-        );
1227
-    }
1228
-
1229
-
1230
-    /**
1231
-     * do_not_cache
1232
-     * sets no cache headers and defines no cache constants for WP plugins
1233
-     *
1234
-     * @access public
1235
-     * @return void
1236
-     */
1237
-    public static function do_not_cache()
1238
-    {
1239
-        // set no cache constants
1240
-        if (! defined('DONOTCACHEPAGE')) {
1241
-            define('DONOTCACHEPAGE', true);
1242
-        }
1243
-        if (! defined('DONOTCACHCEOBJECT')) {
1244
-            define('DONOTCACHCEOBJECT', true);
1245
-        }
1246
-        if (! defined('DONOTCACHEDB')) {
1247
-            define('DONOTCACHEDB', true);
1248
-        }
1249
-        // add no cache headers
1250
-        add_action('send_headers', array('EE_System', 'nocache_headers'), 10);
1251
-        // plus a little extra for nginx and Google Chrome
1252
-        add_filter('nocache_headers', array('EE_System', 'extra_nocache_headers'), 10, 1);
1253
-        // prevent browsers from prefetching of the rel='next' link, because it may contain content that interferes with the registration process
1254
-        remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
1255
-    }
1256
-
1257
-
1258
-    /**
1259
-     *    extra_nocache_headers
1260
-     *
1261
-     * @access    public
1262
-     * @param $headers
1263
-     * @return    array
1264
-     */
1265
-    public static function extra_nocache_headers($headers)
1266
-    {
1267
-        // for NGINX
1268
-        $headers['X-Accel-Expires'] = 0;
1269
-        // plus extra for Google Chrome since it doesn't seem to respect "no-cache", but WILL respect "no-store"
1270
-        $headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
1271
-        return $headers;
1272
-    }
1273
-
1274
-
1275
-    /**
1276
-     *    nocache_headers
1277
-     *
1278
-     * @access    public
1279
-     * @return    void
1280
-     */
1281
-    public static function nocache_headers()
1282
-    {
1283
-        nocache_headers();
1284
-    }
1285
-
1286
-
1287
-    /**
1288
-     * simply hooks into "wp_list_pages_exclude" filter (for wp_list_pages method) and makes sure EE critical pages are
1289
-     * never returned with the function.
1290
-     *
1291
-     * @param  array $exclude_array any existing pages being excluded are in this array.
1292
-     * @return array
1293
-     */
1294
-    public function remove_pages_from_wp_list_pages($exclude_array)
1295
-    {
1296
-        return array_merge($exclude_array, $this->registry->CFG->core->get_critical_pages_array());
1297
-    }
30
+	/**
31
+	 * indicates this is a 'normal' request. Ie, not activation, nor upgrade, nor activation.
32
+	 * So examples of this would be a normal GET request on the frontend or backend, or a POST, etc
33
+	 */
34
+	const req_type_normal = 0;
35
+
36
+	/**
37
+	 * Indicates this is a brand new installation of EE so we should install
38
+	 * tables and default data etc
39
+	 */
40
+	const req_type_new_activation = 1;
41
+
42
+	/**
43
+	 * we've detected that EE has been reactivated (or EE was activated during maintenance mode,
44
+	 * and we just exited maintenance mode). We MUST check the database is setup properly
45
+	 * and that default data is setup too
46
+	 */
47
+	const req_type_reactivation = 2;
48
+
49
+	/**
50
+	 * indicates that EE has been upgraded since its previous request.
51
+	 * We may have data migration scripts to call and will want to trigger maintenance mode
52
+	 */
53
+	const req_type_upgrade = 3;
54
+
55
+	/**
56
+	 * TODO  will detect that EE has been DOWNGRADED. We probably don't want to run in this case...
57
+	 */
58
+	const req_type_downgrade = 4;
59
+
60
+	/**
61
+	 * @deprecated since version 4.6.0.dev.006
62
+	 * Now whenever a new_activation is detected the request type is still just
63
+	 * new_activation (same for reactivation, upgrade, downgrade etc), but if we'r ein maintenance mode
64
+	 * EE_System::initialize_db_if_no_migrations_required and EE_Addon::initialize_db_if_no_migrations_required
65
+	 * will instead enqueue that EE plugin's db initialization for when we're taken out of maintenance mode.
66
+	 * (Specifically, when the migration manager indicates migrations are finished
67
+	 * EE_Data_Migration_Manager::initialize_db_for_enqueued_ee_plugins() will be called)
68
+	 */
69
+	const req_type_activation_but_not_installed = 5;
70
+
71
+	/**
72
+	 * option prefix for recording the activation history (like core's "espresso_db_update") of addons
73
+	 */
74
+	const addon_activation_history_option_prefix = 'ee_addon_activation_history_';
75
+
76
+	/**
77
+	 * @var EE_System $_instance
78
+	 */
79
+	private static $_instance;
80
+
81
+	/**
82
+	 * @var EE_Registry $registry
83
+	 */
84
+	private $registry;
85
+
86
+	/**
87
+	 * @var LoaderInterface $loader
88
+	 */
89
+	private $loader;
90
+
91
+	/**
92
+	 * @var EE_Capabilities $capabilities
93
+	 */
94
+	private $capabilities;
95
+
96
+	/**
97
+	 * @var RequestInterface $request
98
+	 */
99
+	private $request;
100
+
101
+	/**
102
+	 * @var EE_Maintenance_Mode $maintenance_mode
103
+	 */
104
+	private $maintenance_mode;
105
+
106
+	/**
107
+	 * Stores which type of request this is, options being one of the constants on EE_System starting with req_type_*.
108
+	 * It can be a brand-new activation, a reactivation, an upgrade, a downgrade, or a normal request.
109
+	 *
110
+	 * @var int $_req_type
111
+	 */
112
+	private $_req_type;
113
+
114
+	/**
115
+	 * Whether or not there was a non-micro version change in EE core version during this request
116
+	 *
117
+	 * @var boolean $_major_version_change
118
+	 */
119
+	private $_major_version_change = false;
120
+
121
+	/**
122
+	 * A Context DTO dedicated solely to identifying the current request type.
123
+	 *
124
+	 * @var RequestTypeContextCheckerInterface $request_type
125
+	 */
126
+	private $request_type;
127
+
128
+
129
+	/**
130
+	 * @singleton method used to instantiate class object
131
+	 * @param EE_Registry|null         $registry
132
+	 * @param LoaderInterface|null     $loader
133
+	 * @param RequestInterface|null    $request
134
+	 * @param EE_Maintenance_Mode|null $maintenance_mode
135
+	 * @return EE_System
136
+	 */
137
+	public static function instance(
138
+		EE_Registry $registry = null,
139
+		LoaderInterface $loader = null,
140
+		RequestInterface $request = null,
141
+		EE_Maintenance_Mode $maintenance_mode = null
142
+	) {
143
+		// check if class object is instantiated
144
+		if (! self::$_instance instanceof EE_System) {
145
+			self::$_instance = new self($registry, $loader, $request, $maintenance_mode);
146
+		}
147
+		return self::$_instance;
148
+	}
149
+
150
+
151
+	/**
152
+	 * resets the instance and returns it
153
+	 *
154
+	 * @return EE_System
155
+	 */
156
+	public static function reset()
157
+	{
158
+		self::$_instance->_req_type = null;
159
+		// make sure none of the old hooks are left hanging around
160
+		remove_all_actions('AHEE__EE_System__perform_activations_upgrades_and_migrations');
161
+		// we need to reset the migration manager in order for it to detect DMSs properly
162
+		EE_Data_Migration_Manager::reset();
163
+		self::instance()->detect_activations_or_upgrades();
164
+		self::instance()->perform_activations_upgrades_and_migrations();
165
+		return self::instance();
166
+	}
167
+
168
+
169
+	/**
170
+	 * sets hooks for running rest of system
171
+	 * provides "AHEE__EE_System__construct__complete" hook for EE Addons to use as their starting point
172
+	 * starting EE Addons from any other point may lead to problems
173
+	 *
174
+	 * @param EE_Registry         $registry
175
+	 * @param LoaderInterface     $loader
176
+	 * @param RequestInterface    $request
177
+	 * @param EE_Maintenance_Mode $maintenance_mode
178
+	 */
179
+	private function __construct(
180
+		EE_Registry $registry,
181
+		LoaderInterface $loader,
182
+		RequestInterface $request,
183
+		EE_Maintenance_Mode $maintenance_mode
184
+	) {
185
+		$this->registry = $registry;
186
+		$this->loader = $loader;
187
+		$this->request = $request;
188
+		$this->maintenance_mode = $maintenance_mode;
189
+		do_action('AHEE__EE_System__construct__begin', $this);
190
+		add_action(
191
+			'AHEE__EE_Bootstrap__load_espresso_addons',
192
+			array($this, 'loadCapabilities'),
193
+			5
194
+		);
195
+		add_action(
196
+			'AHEE__EE_Bootstrap__load_espresso_addons',
197
+			array($this, 'loadCommandBus'),
198
+			7
199
+		);
200
+		add_action(
201
+			'AHEE__EE_Bootstrap__load_espresso_addons',
202
+			array($this, 'loadPluginApi'),
203
+			9
204
+		);
205
+		// allow addons to load first so that they can register autoloaders, set hooks for running DMS's, etc
206
+		add_action(
207
+			'AHEE__EE_Bootstrap__load_espresso_addons',
208
+			array($this, 'load_espresso_addons')
209
+		);
210
+		// when an ee addon is activated, we want to call the core hook(s) again
211
+		// because the newly-activated addon didn't get a chance to run at all
212
+		add_action('activate_plugin', array($this, 'load_espresso_addons'), 1);
213
+		// detect whether install or upgrade
214
+		add_action(
215
+			'AHEE__EE_Bootstrap__detect_activations_or_upgrades',
216
+			array($this, 'detect_activations_or_upgrades'),
217
+			3
218
+		);
219
+		// load EE_Config, EE_Textdomain, etc
220
+		add_action(
221
+			'AHEE__EE_Bootstrap__load_core_configuration',
222
+			array($this, 'load_core_configuration'),
223
+			5
224
+		);
225
+		// load EE_Config, EE_Textdomain, etc
226
+		add_action(
227
+			'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets',
228
+			array($this, 'register_shortcodes_modules_and_widgets'),
229
+			7
230
+		);
231
+		// you wanna get going? I wanna get going... let's get going!
232
+		add_action(
233
+			'AHEE__EE_Bootstrap__brew_espresso',
234
+			array($this, 'brew_espresso'),
235
+			9
236
+		);
237
+		// other housekeeping
238
+		// exclude EE critical pages from wp_list_pages
239
+		add_filter(
240
+			'wp_list_pages_excludes',
241
+			array($this, 'remove_pages_from_wp_list_pages'),
242
+			10
243
+		);
244
+		// ALL EE Addons should use the following hook point to attach their initial setup too
245
+		// it's extremely important for EE Addons to register any class autoloaders so that they can be available when the EE_Config loads
246
+		do_action('AHEE__EE_System__construct__complete', $this);
247
+	}
248
+
249
+
250
+	/**
251
+	 * load and setup EE_Capabilities
252
+	 *
253
+	 * @return void
254
+	 * @throws EE_Error
255
+	 */
256
+	public function loadCapabilities()
257
+	{
258
+		$this->capabilities = $this->loader->getShared('EE_Capabilities');
259
+		add_action(
260
+			'AHEE__EE_Capabilities__init_caps__before_initialization',
261
+			function () {
262
+				LoaderFactory::getLoader()->getShared('EE_Payment_Method_Manager');
263
+			}
264
+		);
265
+	}
266
+
267
+
268
+	/**
269
+	 * create and cache the CommandBus, and also add middleware
270
+	 * The CapChecker middleware requires the use of EE_Capabilities
271
+	 * which is why we need to load the CommandBus after Caps are set up
272
+	 *
273
+	 * @return void
274
+	 * @throws EE_Error
275
+	 */
276
+	public function loadCommandBus()
277
+	{
278
+		$this->loader->getShared(
279
+			'CommandBusInterface',
280
+			array(
281
+				null,
282
+				apply_filters(
283
+					'FHEE__EE_Load_Espresso_Core__handle_request__CommandBus_middleware',
284
+					array(
285
+						$this->loader->getShared('EventEspresso\core\services\commands\middleware\CapChecker'),
286
+						$this->loader->getShared('EventEspresso\core\services\commands\middleware\AddActionHook'),
287
+					)
288
+				),
289
+			)
290
+		);
291
+	}
292
+
293
+
294
+	/**
295
+	 * @return void
296
+	 * @throws EE_Error
297
+	 */
298
+	public function loadPluginApi()
299
+	{
300
+		// set autoloaders for all of the classes implementing EEI_Plugin_API
301
+		// which provide helpers for EE plugin authors to more easily register certain components with EE.
302
+		EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
303
+		$this->loader->getShared('EE_Request_Handler');
304
+	}
305
+
306
+
307
+	/**
308
+	 * @param string $addon_name
309
+	 * @param string $version_constant
310
+	 * @param string $min_version_required
311
+	 * @param string $load_callback
312
+	 * @param string $plugin_file_constant
313
+	 * @return void
314
+	 */
315
+	private function deactivateIncompatibleAddon(
316
+		$addon_name,
317
+		$version_constant,
318
+		$min_version_required,
319
+		$load_callback,
320
+		$plugin_file_constant
321
+	) {
322
+		if (! defined($version_constant)) {
323
+			return;
324
+		}
325
+		$addon_version = constant($version_constant);
326
+		if ($addon_version && version_compare($addon_version, $min_version_required, '<')) {
327
+			remove_action('AHEE__EE_System__load_espresso_addons', $load_callback);
328
+			if (! function_exists('deactivate_plugins')) {
329
+				require_once ABSPATH . 'wp-admin/includes/plugin.php';
330
+			}
331
+			deactivate_plugins(plugin_basename(constant($plugin_file_constant)));
332
+			unset($_GET['activate'], $_REQUEST['activate'], $_GET['activate-multi'], $_REQUEST['activate-multi']);
333
+			EE_Error::add_error(
334
+				sprintf(
335
+					esc_html__(
336
+						'We\'re sorry, but the Event Espresso %1$s addon was deactivated because version %2$s or higher is required with this version of Event Espresso core.',
337
+						'event_espresso'
338
+					),
339
+					$addon_name,
340
+					$min_version_required
341
+				),
342
+				__FILE__,
343
+				__FUNCTION__ . "({$addon_name})",
344
+				__LINE__
345
+			);
346
+			EE_Error::get_notices(false, true);
347
+		}
348
+	}
349
+
350
+
351
+	/**
352
+	 * load_espresso_addons
353
+	 * allow addons to load first so that they can set hooks for running DMS's, etc
354
+	 * this is hooked into both:
355
+	 *    'AHEE__EE_Bootstrap__load_core_configuration'
356
+	 *        which runs during the WP 'plugins_loaded' action at priority 5
357
+	 *    and the WP 'activate_plugin' hook point
358
+	 *
359
+	 * @access public
360
+	 * @return void
361
+	 */
362
+	public function load_espresso_addons()
363
+	{
364
+		$this->deactivateIncompatibleAddon(
365
+			'Wait Lists',
366
+			'EE_WAIT_LISTS_VERSION',
367
+			'1.0.0.beta.074',
368
+			'load_espresso_wait_lists',
369
+			'EE_WAIT_LISTS_PLUGIN_FILE'
370
+		);
371
+		$this->deactivateIncompatibleAddon(
372
+			'Automated Upcoming Event Notifications',
373
+			'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_VERSION',
374
+			'1.0.0.beta.091',
375
+			'load_espresso_automated_upcoming_event_notification',
376
+			'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_PLUGIN_FILE'
377
+		);
378
+		do_action('AHEE__EE_System__load_espresso_addons');
379
+		// if the WP API basic auth plugin isn't already loaded, load it now.
380
+		// We want it for mobile apps. Just include the entire plugin
381
+		// also, don't load the basic auth when a plugin is getting activated, because
382
+		// it could be the basic auth plugin, and it doesn't check if its methods are already defined
383
+		// and causes a fatal error
384
+		if ($this->request->getRequestParam('activate') !== 'true'
385
+			&& ! function_exists('json_basic_auth_handler')
386
+			&& ! function_exists('json_basic_auth_error')
387
+			&& ! in_array(
388
+				$this->request->getRequestParam('action'),
389
+				array('activate', 'activate-selected'),
390
+				true
391
+			)
392
+		) {
393
+			include_once EE_THIRD_PARTY . 'wp-api-basic-auth' . DS . 'basic-auth.php';
394
+		}
395
+		do_action('AHEE__EE_System__load_espresso_addons__complete');
396
+	}
397
+
398
+
399
+	/**
400
+	 * detect_activations_or_upgrades
401
+	 * Checks for activation or upgrade of core first;
402
+	 * then also checks if any registered addons have been activated or upgraded
403
+	 * This is hooked into 'AHEE__EE_Bootstrap__detect_activations_or_upgrades'
404
+	 * which runs during the WP 'plugins_loaded' action at priority 3
405
+	 *
406
+	 * @access public
407
+	 * @return void
408
+	 */
409
+	public function detect_activations_or_upgrades()
410
+	{
411
+		// first off: let's make sure to handle core
412
+		$this->detect_if_activation_or_upgrade();
413
+		foreach ($this->registry->addons as $addon) {
414
+			if ($addon instanceof EE_Addon) {
415
+				// detect teh request type for that addon
416
+				$addon->detect_activation_or_upgrade();
417
+			}
418
+		}
419
+	}
420
+
421
+
422
+	/**
423
+	 * detect_if_activation_or_upgrade
424
+	 * Takes care of detecting whether this is a brand new install or code upgrade,
425
+	 * and either setting up the DB or setting up maintenance mode etc.
426
+	 *
427
+	 * @access public
428
+	 * @return void
429
+	 */
430
+	public function detect_if_activation_or_upgrade()
431
+	{
432
+		do_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin');
433
+		// check if db has been updated, or if its a brand-new installation
434
+		$espresso_db_update = $this->fix_espresso_db_upgrade_option();
435
+		$request_type = $this->detect_req_type($espresso_db_update);
436
+		// EEH_Debug_Tools::printr( $request_type, '$request_type', __FILE__, __LINE__ );
437
+		switch ($request_type) {
438
+			case EE_System::req_type_new_activation:
439
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__new_activation');
440
+				$this->_handle_core_version_change($espresso_db_update);
441
+				break;
442
+			case EE_System::req_type_reactivation:
443
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__reactivation');
444
+				$this->_handle_core_version_change($espresso_db_update);
445
+				break;
446
+			case EE_System::req_type_upgrade:
447
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__upgrade');
448
+				// migrations may be required now that we've upgraded
449
+				$this->maintenance_mode->set_maintenance_mode_if_db_old();
450
+				$this->_handle_core_version_change($espresso_db_update);
451
+				break;
452
+			case EE_System::req_type_downgrade:
453
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__downgrade');
454
+				// its possible migrations are no longer required
455
+				$this->maintenance_mode->set_maintenance_mode_if_db_old();
456
+				$this->_handle_core_version_change($espresso_db_update);
457
+				break;
458
+			case EE_System::req_type_normal:
459
+			default:
460
+				break;
461
+		}
462
+		do_action('AHEE__EE_System__detect_if_activation_or_upgrade__complete');
463
+	}
464
+
465
+
466
+	/**
467
+	 * Updates the list of installed versions and sets hooks for
468
+	 * initializing the database later during the request
469
+	 *
470
+	 * @param array $espresso_db_update
471
+	 */
472
+	private function _handle_core_version_change($espresso_db_update)
473
+	{
474
+		$this->update_list_of_installed_versions($espresso_db_update);
475
+		// get ready to verify the DB is ok (provided we aren't in maintenance mode, of course)
476
+		add_action(
477
+			'AHEE__EE_System__perform_activations_upgrades_and_migrations',
478
+			array($this, 'initialize_db_if_no_migrations_required')
479
+		);
480
+	}
481
+
482
+
483
+	/**
484
+	 * standardizes the wp option 'espresso_db_upgrade' which actually stores
485
+	 * information about what versions of EE have been installed and activated,
486
+	 * NOT necessarily the state of the database
487
+	 *
488
+	 * @param mixed $espresso_db_update           the value of the WordPress option.
489
+	 *                                            If not supplied, fetches it from the options table
490
+	 * @return array the correct value of 'espresso_db_upgrade', after saving it, if it needed correction
491
+	 */
492
+	private function fix_espresso_db_upgrade_option($espresso_db_update = null)
493
+	{
494
+		do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__begin', $espresso_db_update);
495
+		if (! $espresso_db_update) {
496
+			$espresso_db_update = get_option('espresso_db_update');
497
+		}
498
+		// check that option is an array
499
+		if (! is_array($espresso_db_update)) {
500
+			// if option is FALSE, then it never existed
501
+			if ($espresso_db_update === false) {
502
+				// make $espresso_db_update an array and save option with autoload OFF
503
+				$espresso_db_update = array();
504
+				add_option('espresso_db_update', $espresso_db_update, '', 'no');
505
+			} else {
506
+				// option is NOT FALSE but also is NOT an array, so make it an array and save it
507
+				$espresso_db_update = array($espresso_db_update => array());
508
+				update_option('espresso_db_update', $espresso_db_update);
509
+			}
510
+		} else {
511
+			$corrected_db_update = array();
512
+			// if IS an array, but is it an array where KEYS are version numbers, and values are arrays?
513
+			foreach ($espresso_db_update as $should_be_version_string => $should_be_array) {
514
+				if (is_int($should_be_version_string) && ! is_array($should_be_array)) {
515
+					// the key is an int, and the value IS NOT an array
516
+					// so it must be numerically-indexed, where values are versions installed...
517
+					// fix it!
518
+					$version_string = $should_be_array;
519
+					$corrected_db_update[ $version_string ] = array('unknown-date');
520
+				} else {
521
+					// ok it checks out
522
+					$corrected_db_update[ $should_be_version_string ] = $should_be_array;
523
+				}
524
+			}
525
+			$espresso_db_update = $corrected_db_update;
526
+			update_option('espresso_db_update', $espresso_db_update);
527
+		}
528
+		do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__complete', $espresso_db_update);
529
+		return $espresso_db_update;
530
+	}
531
+
532
+
533
+	/**
534
+	 * Does the traditional work of setting up the plugin's database and adding default data.
535
+	 * If migration script/process did not exist, this is what would happen on every activation/reactivation/upgrade.
536
+	 * NOTE: if we're in maintenance mode (which would be the case if we detect there are data
537
+	 * migration scripts that need to be run and a version change happens), enqueues core for database initialization,
538
+	 * so that it will be done when migrations are finished
539
+	 *
540
+	 * @param boolean $initialize_addons_too if true, we double-check addons' database tables etc too;
541
+	 * @param boolean $verify_schema         if true will re-check the database tables have the correct schema.
542
+	 *                                       This is a resource-intensive job
543
+	 *                                       so we prefer to only do it when necessary
544
+	 * @return void
545
+	 * @throws EE_Error
546
+	 */
547
+	public function initialize_db_if_no_migrations_required($initialize_addons_too = false, $verify_schema = true)
548
+	{
549
+		$request_type = $this->detect_req_type();
550
+		// only initialize system if we're not in maintenance mode.
551
+		if ($this->maintenance_mode->level() !== EE_Maintenance_Mode::level_2_complete_maintenance) {
552
+			/** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
553
+			$rewrite_rules = $this->loader->getShared(
554
+				'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
555
+			);
556
+			$rewrite_rules->flush();
557
+			if ($verify_schema) {
558
+				EEH_Activation::initialize_db_and_folders();
559
+			}
560
+			EEH_Activation::initialize_db_content();
561
+			EEH_Activation::system_initialization();
562
+			if ($initialize_addons_too) {
563
+				$this->initialize_addons();
564
+			}
565
+		} else {
566
+			EE_Data_Migration_Manager::instance()->enqueue_db_initialization_for('Core');
567
+		}
568
+		if ($request_type === EE_System::req_type_new_activation
569
+			|| $request_type === EE_System::req_type_reactivation
570
+			|| (
571
+				$request_type === EE_System::req_type_upgrade
572
+				&& $this->is_major_version_change()
573
+			)
574
+		) {
575
+			add_action('AHEE__EE_System__initialize_last', array($this, 'redirect_to_about_ee'), 9);
576
+		}
577
+	}
578
+
579
+
580
+	/**
581
+	 * Initializes the db for all registered addons
582
+	 *
583
+	 * @throws EE_Error
584
+	 */
585
+	public function initialize_addons()
586
+	{
587
+		// foreach registered addon, make sure its db is up-to-date too
588
+		foreach ($this->registry->addons as $addon) {
589
+			if ($addon instanceof EE_Addon) {
590
+				$addon->initialize_db_if_no_migrations_required();
591
+			}
592
+		}
593
+	}
594
+
595
+
596
+	/**
597
+	 * Adds the current code version to the saved wp option which stores a list of all ee versions ever installed.
598
+	 *
599
+	 * @param    array  $version_history
600
+	 * @param    string $current_version_to_add version to be added to the version history
601
+	 * @return    boolean success as to whether or not this option was changed
602
+	 */
603
+	public function update_list_of_installed_versions($version_history = null, $current_version_to_add = null)
604
+	{
605
+		if (! $version_history) {
606
+			$version_history = $this->fix_espresso_db_upgrade_option($version_history);
607
+		}
608
+		if ($current_version_to_add === null) {
609
+			$current_version_to_add = espresso_version();
610
+		}
611
+		$version_history[ $current_version_to_add ][] = date('Y-m-d H:i:s', time());
612
+		// re-save
613
+		return update_option('espresso_db_update', $version_history);
614
+	}
615
+
616
+
617
+	/**
618
+	 * Detects if the current version indicated in the has existed in the list of
619
+	 * previously-installed versions of EE (espresso_db_update). Does NOT modify it (ie, no side-effect)
620
+	 *
621
+	 * @param array $espresso_db_update array from the wp option stored under the name 'espresso_db_update'.
622
+	 *                                  If not supplied, fetches it from the options table.
623
+	 *                                  Also, caches its result so later parts of the code can also know whether
624
+	 *                                  there's been an update or not. This way we can add the current version to
625
+	 *                                  espresso_db_update, but still know if this is a new install or not
626
+	 * @return int one of the constants on EE_System::req_type_
627
+	 */
628
+	public function detect_req_type($espresso_db_update = null)
629
+	{
630
+		if ($this->_req_type === null) {
631
+			$espresso_db_update = ! empty($espresso_db_update)
632
+				? $espresso_db_update
633
+				: $this->fix_espresso_db_upgrade_option();
634
+			$this->_req_type = EE_System::detect_req_type_given_activation_history(
635
+				$espresso_db_update,
636
+				'ee_espresso_activation',
637
+				espresso_version()
638
+			);
639
+			$this->_major_version_change = $this->_detect_major_version_change($espresso_db_update);
640
+			$this->request->setIsActivation($this->_req_type !== EE_System::req_type_normal);
641
+		}
642
+		return $this->_req_type;
643
+	}
644
+
645
+
646
+	/**
647
+	 * Returns whether or not there was a non-micro version change (ie, change in either
648
+	 * the first or second number in the version. Eg 4.9.0.rc.001 to 4.10.0.rc.000,
649
+	 * but not 4.9.0.rc.0001 to 4.9.1.rc.0001
650
+	 *
651
+	 * @param $activation_history
652
+	 * @return bool
653
+	 */
654
+	private function _detect_major_version_change($activation_history)
655
+	{
656
+		$previous_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history);
657
+		$previous_version_parts = explode('.', $previous_version);
658
+		$current_version_parts = explode('.', espresso_version());
659
+		return isset($previous_version_parts[0], $previous_version_parts[1], $current_version_parts[0], $current_version_parts[1])
660
+			   && ($previous_version_parts[0] !== $current_version_parts[0]
661
+				   || $previous_version_parts[1] !== $current_version_parts[1]
662
+			   );
663
+	}
664
+
665
+
666
+	/**
667
+	 * Returns true if either the major or minor version of EE changed during this request.
668
+	 * Eg 4.9.0.rc.001 to 4.10.0.rc.000, but not 4.9.0.rc.0001 to 4.9.1.rc.0001
669
+	 *
670
+	 * @return bool
671
+	 */
672
+	public function is_major_version_change()
673
+	{
674
+		return $this->_major_version_change;
675
+	}
676
+
677
+
678
+	/**
679
+	 * Determines the request type for any ee addon, given three piece of info: the current array of activation
680
+	 * histories (for core that' 'espresso_db_update' wp option); the name of the WordPress option which is temporarily
681
+	 * set upon activation of the plugin (for core it's 'ee_espresso_activation'); and the version that this plugin was
682
+	 * just activated to (for core that will always be espresso_version())
683
+	 *
684
+	 * @param array  $activation_history_for_addon     the option's value which stores the activation history for this
685
+	 *                                                 ee plugin. for core that's 'espresso_db_update'
686
+	 * @param string $activation_indicator_option_name the name of the WordPress option that is temporarily set to
687
+	 *                                                 indicate that this plugin was just activated
688
+	 * @param string $version_to_upgrade_to            the version that was just upgraded to (for core that will be
689
+	 *                                                 espresso_version())
690
+	 * @return int one of the constants on EE_System::req_type_*
691
+	 */
692
+	public static function detect_req_type_given_activation_history(
693
+		$activation_history_for_addon,
694
+		$activation_indicator_option_name,
695
+		$version_to_upgrade_to
696
+	) {
697
+		$version_is_higher = self::_new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to);
698
+		if ($activation_history_for_addon) {
699
+			// it exists, so this isn't a completely new install
700
+			// check if this version already in that list of previously installed versions
701
+			if (! isset($activation_history_for_addon[ $version_to_upgrade_to ])) {
702
+				// it a version we haven't seen before
703
+				if ($version_is_higher === 1) {
704
+					$req_type = EE_System::req_type_upgrade;
705
+				} else {
706
+					$req_type = EE_System::req_type_downgrade;
707
+				}
708
+				delete_option($activation_indicator_option_name);
709
+			} else {
710
+				// its not an update. maybe a reactivation?
711
+				if (get_option($activation_indicator_option_name, false)) {
712
+					if ($version_is_higher === -1) {
713
+						$req_type = EE_System::req_type_downgrade;
714
+					} elseif ($version_is_higher === 0) {
715
+						// we've seen this version before, but it's an activation. must be a reactivation
716
+						$req_type = EE_System::req_type_reactivation;
717
+					} else {// $version_is_higher === 1
718
+						$req_type = EE_System::req_type_upgrade;
719
+					}
720
+					delete_option($activation_indicator_option_name);
721
+				} else {
722
+					// we've seen this version before and the activation indicate doesn't show it was just activated
723
+					if ($version_is_higher === -1) {
724
+						$req_type = EE_System::req_type_downgrade;
725
+					} elseif ($version_is_higher === 0) {
726
+						// we've seen this version before and it's not an activation. its normal request
727
+						$req_type = EE_System::req_type_normal;
728
+					} else {// $version_is_higher === 1
729
+						$req_type = EE_System::req_type_upgrade;
730
+					}
731
+				}
732
+			}
733
+		} else {
734
+			// brand new install
735
+			$req_type = EE_System::req_type_new_activation;
736
+			delete_option($activation_indicator_option_name);
737
+		}
738
+		return $req_type;
739
+	}
740
+
741
+
742
+	/**
743
+	 * Detects if the $version_to_upgrade_to is higher than the most recent version in
744
+	 * the $activation_history_for_addon
745
+	 *
746
+	 * @param array  $activation_history_for_addon (keys are versions, values are arrays of times activated,
747
+	 *                                             sometimes containing 'unknown-date'
748
+	 * @param string $version_to_upgrade_to        (current version)
749
+	 * @return int results of version_compare( $version_to_upgrade_to, $most_recently_active_version ).
750
+	 *                                             ie, -1 if $version_to_upgrade_to is LOWER (downgrade);
751
+	 *                                             0 if $version_to_upgrade_to MATCHES (reactivation or normal request);
752
+	 *                                             1 if $version_to_upgrade_to is HIGHER (upgrade) ;
753
+	 */
754
+	private static function _new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to)
755
+	{
756
+		// find the most recently-activated version
757
+		$most_recently_active_version =
758
+			EE_System::_get_most_recently_active_version_from_activation_history($activation_history_for_addon);
759
+		return version_compare($version_to_upgrade_to, $most_recently_active_version);
760
+	}
761
+
762
+
763
+	/**
764
+	 * Gets the most recently active version listed in the activation history,
765
+	 * and if none are found (ie, it's a brand new install) returns '0.0.0.dev.000'.
766
+	 *
767
+	 * @param array $activation_history  (keys are versions, values are arrays of times activated,
768
+	 *                                   sometimes containing 'unknown-date'
769
+	 * @return string
770
+	 */
771
+	private static function _get_most_recently_active_version_from_activation_history($activation_history)
772
+	{
773
+		$most_recently_active_version_activation = '1970-01-01 00:00:00';
774
+		$most_recently_active_version = '0.0.0.dev.000';
775
+		if (is_array($activation_history)) {
776
+			foreach ($activation_history as $version => $times_activated) {
777
+				// check there is a record of when this version was activated. Otherwise,
778
+				// mark it as unknown
779
+				if (! $times_activated) {
780
+					$times_activated = array('unknown-date');
781
+				}
782
+				if (is_string($times_activated)) {
783
+					$times_activated = array($times_activated);
784
+				}
785
+				foreach ($times_activated as $an_activation) {
786
+					if ($an_activation !== 'unknown-date'
787
+						&& $an_activation
788
+						   > $most_recently_active_version_activation) {
789
+						$most_recently_active_version = $version;
790
+						$most_recently_active_version_activation = $an_activation === 'unknown-date'
791
+							? '1970-01-01 00:00:00'
792
+							: $an_activation;
793
+					}
794
+				}
795
+			}
796
+		}
797
+		return $most_recently_active_version;
798
+	}
799
+
800
+
801
+	/**
802
+	 * This redirects to the about EE page after activation
803
+	 *
804
+	 * @return void
805
+	 */
806
+	public function redirect_to_about_ee()
807
+	{
808
+		$notices = EE_Error::get_notices(false);
809
+		// if current user is an admin and it's not an ajax or rest request
810
+		if (! isset($notices['errors'])
811
+			&& $this->request->isAdmin()
812
+			&& apply_filters(
813
+				'FHEE__EE_System__redirect_to_about_ee__do_redirect',
814
+				$this->capabilities->current_user_can('manage_options', 'espresso_about_default')
815
+			)
816
+		) {
817
+			$query_params = array('page' => 'espresso_about');
818
+			if (EE_System::instance()->detect_req_type() === EE_System::req_type_new_activation) {
819
+				$query_params['new_activation'] = true;
820
+			}
821
+			if (EE_System::instance()->detect_req_type() === EE_System::req_type_reactivation) {
822
+				$query_params['reactivation'] = true;
823
+			}
824
+			$url = add_query_arg($query_params, admin_url('admin.php'));
825
+			wp_safe_redirect($url);
826
+			exit();
827
+		}
828
+	}
829
+
830
+
831
+	/**
832
+	 * load_core_configuration
833
+	 * this is hooked into 'AHEE__EE_Bootstrap__load_core_configuration'
834
+	 * which runs during the WP 'plugins_loaded' action at priority 5
835
+	 *
836
+	 * @return void
837
+	 * @throws ReflectionException
838
+	 */
839
+	public function load_core_configuration()
840
+	{
841
+		do_action('AHEE__EE_System__load_core_configuration__begin', $this);
842
+		$this->loader->getShared('EE_Load_Textdomain');
843
+		// load textdomain
844
+		EE_Load_Textdomain::load_textdomain();
845
+		// load and setup EE_Config and EE_Network_Config
846
+		$config = $this->loader->getShared('EE_Config');
847
+		$this->loader->getShared('EE_Network_Config');
848
+		// setup autoloaders
849
+		// enable logging?
850
+		if ($config->admin->use_full_logging) {
851
+			$this->loader->getShared('EE_Log');
852
+		}
853
+		// check for activation errors
854
+		$activation_errors = get_option('ee_plugin_activation_errors', false);
855
+		if ($activation_errors) {
856
+			EE_Error::add_error($activation_errors, __FILE__, __FUNCTION__, __LINE__);
857
+			update_option('ee_plugin_activation_errors', false);
858
+		}
859
+		// get model names
860
+		$this->_parse_model_names();
861
+		// load caf stuff a chance to play during the activation process too.
862
+		$this->_maybe_brew_regular();
863
+		// configure custom post type definitions
864
+		$this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions');
865
+		$this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions');
866
+		do_action('AHEE__EE_System__load_core_configuration__complete', $this);
867
+	}
868
+
869
+
870
+	/**
871
+	 * cycles through all of the models/*.model.php files, and assembles an array of model names
872
+	 *
873
+	 * @return void
874
+	 * @throws ReflectionException
875
+	 */
876
+	private function _parse_model_names()
877
+	{
878
+		// get all the files in the EE_MODELS folder that end in .model.php
879
+		$models = glob(EE_MODELS . '*.model.php');
880
+		$model_names = array();
881
+		$non_abstract_db_models = array();
882
+		foreach ($models as $model) {
883
+			// get model classname
884
+			$classname = EEH_File::get_classname_from_filepath_with_standard_filename($model);
885
+			$short_name = str_replace('EEM_', '', $classname);
886
+			$reflectionClass = new ReflectionClass($classname);
887
+			if ($reflectionClass->isSubclassOf('EEM_Base') && ! $reflectionClass->isAbstract()) {
888
+				$non_abstract_db_models[ $short_name ] = $classname;
889
+			}
890
+			$model_names[ $short_name ] = $classname;
891
+		}
892
+		$this->registry->models = apply_filters('FHEE__EE_System__parse_model_names', $model_names);
893
+		$this->registry->non_abstract_db_models = apply_filters(
894
+			'FHEE__EE_System__parse_implemented_model_names',
895
+			$non_abstract_db_models
896
+		);
897
+	}
898
+
899
+
900
+	/**
901
+	 * The purpose of this method is to simply check for a file named "caffeinated/brewing_regular.php" for any hooks
902
+	 * that need to be setup before our EE_System launches.
903
+	 *
904
+	 * @return void
905
+	 * @throws DomainException
906
+	 * @throws InvalidArgumentException
907
+	 * @throws InvalidDataTypeException
908
+	 * @throws InvalidInterfaceException
909
+	 * @throws InvalidClassException
910
+	 * @throws InvalidFilePathException
911
+	 */
912
+	private function _maybe_brew_regular()
913
+	{
914
+		/** @var Domain $domain */
915
+		$domain = DomainFactory::getShared(
916
+			new FullyQualifiedName(
917
+				'EventEspresso\core\domain\Domain'
918
+			),
919
+			array(
920
+				new FilePath(EVENT_ESPRESSO_MAIN_FILE),
921
+				Version::fromString(espresso_version()),
922
+			)
923
+		);
924
+		if ($domain->isCaffeinated()) {
925
+			require_once EE_CAFF_PATH . 'brewing_regular.php';
926
+		}
927
+	}
928
+
929
+
930
+	/**
931
+	 * register_shortcodes_modules_and_widgets
932
+	 * generate lists of shortcodes and modules, then verify paths and classes
933
+	 * This is hooked into 'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets'
934
+	 * which runs during the WP 'plugins_loaded' action at priority 7
935
+	 *
936
+	 * @access public
937
+	 * @return void
938
+	 * @throws Exception
939
+	 */
940
+	public function register_shortcodes_modules_and_widgets()
941
+	{
942
+		try {
943
+			// load, register, and add shortcodes the new way
944
+			if ($this->request->isFrontend() || $this->request->isIframe()) {
945
+				$this->loader->getShared(
946
+					'EventEspresso\core\services\shortcodes\ShortcodesManager',
947
+					array(
948
+						// and the old way, but we'll put it under control of the new system
949
+						EE_Config::getLegacyShortcodesManager(),
950
+					)
951
+				);
952
+			}
953
+		} catch (Exception $exception) {
954
+			new ExceptionStackTraceDisplay($exception);
955
+		}
956
+		do_action('AHEE__EE_System__register_shortcodes_modules_and_widgets');
957
+		// check for addons using old hook point
958
+		if (has_action('AHEE__EE_System__register_shortcodes_modules_and_addons')) {
959
+			$this->_incompatible_addon_error();
960
+		}
961
+	}
962
+
963
+
964
+	/**
965
+	 * _incompatible_addon_error
966
+	 *
967
+	 * @access public
968
+	 * @return void
969
+	 */
970
+	private function _incompatible_addon_error()
971
+	{
972
+		// get array of classes hooking into here
973
+		$class_names = EEH_Class_Tools::get_class_names_for_all_callbacks_on_hook(
974
+			'AHEE__EE_System__register_shortcodes_modules_and_addons'
975
+		);
976
+		if (! empty($class_names)) {
977
+			$msg = __(
978
+				'The following plugins, addons, or modules appear to be incompatible with this version of Event Espresso and were automatically deactivated to avoid fatal errors:',
979
+				'event_espresso'
980
+			);
981
+			$msg .= '<ul>';
982
+			foreach ($class_names as $class_name) {
983
+				$msg .= '<li><b>Event Espresso - '
984
+						. str_replace(
985
+							array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'),
986
+							'',
987
+							$class_name
988
+						) . '</b></li>';
989
+			}
990
+			$msg .= '</ul>';
991
+			$msg .= __(
992
+				'Compatibility issues can be avoided and/or resolved by keeping addons and plugins updated to the latest version.',
993
+				'event_espresso'
994
+			);
995
+			// save list of incompatible addons to wp-options for later use
996
+			add_option('ee_incompatible_addons', $class_names, '', 'no');
997
+			if (is_admin()) {
998
+				EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
999
+			}
1000
+		}
1001
+	}
1002
+
1003
+
1004
+	/**
1005
+	 * brew_espresso
1006
+	 * begins the process of setting hooks for initializing EE in the correct order
1007
+	 * This is happening on the 'AHEE__EE_Bootstrap__brew_espresso' hook point
1008
+	 * which runs during the WP 'plugins_loaded' action at priority 9
1009
+	 *
1010
+	 * @return void
1011
+	 */
1012
+	public function brew_espresso()
1013
+	{
1014
+		do_action('AHEE__EE_System__brew_espresso__begin', $this);
1015
+		// load some final core systems
1016
+		add_action('init', array($this, 'set_hooks_for_core'), 1);
1017
+		add_action('init', array($this, 'perform_activations_upgrades_and_migrations'), 3);
1018
+		add_action('init', array($this, 'load_CPTs_and_session'), 5);
1019
+		add_action('init', array($this, 'load_controllers'), 7);
1020
+		add_action('init', array($this, 'core_loaded_and_ready'), 9);
1021
+		add_action('init', array($this, 'initialize'), 10);
1022
+		add_action('init', array($this, 'initialize_last'), 100);
1023
+		if (is_admin() && apply_filters('FHEE__EE_System__brew_espresso__load_pue', true)) {
1024
+			// pew pew pew
1025
+			$this->loader->getShared('EventEspresso\core\services\licensing\LicenseService');
1026
+			do_action('AHEE__EE_System__brew_espresso__after_pue_init');
1027
+		}
1028
+		do_action('AHEE__EE_System__brew_espresso__complete', $this);
1029
+	}
1030
+
1031
+
1032
+	/**
1033
+	 *    set_hooks_for_core
1034
+	 *
1035
+	 * @access public
1036
+	 * @return    void
1037
+	 * @throws EE_Error
1038
+	 */
1039
+	public function set_hooks_for_core()
1040
+	{
1041
+		$this->_deactivate_incompatible_addons();
1042
+		do_action('AHEE__EE_System__set_hooks_for_core');
1043
+		$this->loader->getShared('EventEspresso\core\domain\values\session\SessionLifespan');
1044
+		// caps need to be initialized on every request so that capability maps are set.
1045
+		// @see https://events.codebasehq.com/projects/event-espresso/tickets/8674
1046
+		$this->registry->CAP->init_caps();
1047
+	}
1048
+
1049
+
1050
+	/**
1051
+	 * Using the information gathered in EE_System::_incompatible_addon_error,
1052
+	 * deactivates any addons considered incompatible with the current version of EE
1053
+	 */
1054
+	private function _deactivate_incompatible_addons()
1055
+	{
1056
+		$incompatible_addons = get_option('ee_incompatible_addons', array());
1057
+		if (! empty($incompatible_addons)) {
1058
+			$active_plugins = get_option('active_plugins', array());
1059
+			foreach ($active_plugins as $active_plugin) {
1060
+				foreach ($incompatible_addons as $incompatible_addon) {
1061
+					if (strpos($active_plugin, $incompatible_addon) !== false) {
1062
+						unset($_GET['activate']);
1063
+						espresso_deactivate_plugin($active_plugin);
1064
+					}
1065
+				}
1066
+			}
1067
+		}
1068
+	}
1069
+
1070
+
1071
+	/**
1072
+	 *    perform_activations_upgrades_and_migrations
1073
+	 *
1074
+	 * @access public
1075
+	 * @return    void
1076
+	 */
1077
+	public function perform_activations_upgrades_and_migrations()
1078
+	{
1079
+		do_action('AHEE__EE_System__perform_activations_upgrades_and_migrations');
1080
+	}
1081
+
1082
+
1083
+	/**
1084
+	 * @return void
1085
+	 * @throws DomainException
1086
+	 */
1087
+	public function load_CPTs_and_session()
1088
+	{
1089
+		do_action('AHEE__EE_System__load_CPTs_and_session__start');
1090
+		/** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies $register_custom_taxonomies */
1091
+		$register_custom_taxonomies = $this->loader->getShared(
1092
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies'
1093
+		);
1094
+		$register_custom_taxonomies->registerCustomTaxonomies();
1095
+		/** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes $register_custom_post_types */
1096
+		$register_custom_post_types = $this->loader->getShared(
1097
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes'
1098
+		);
1099
+		$register_custom_post_types->registerCustomPostTypes();
1100
+		/** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms $register_custom_taxonomy_terms */
1101
+		$register_custom_taxonomy_terms = $this->loader->getShared(
1102
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms'
1103
+		);
1104
+		$register_custom_taxonomy_terms->registerCustomTaxonomyTerms();
1105
+		// load legacy Custom Post Types and Taxonomies
1106
+		$this->loader->getShared('EE_Register_CPTs');
1107
+		do_action('AHEE__EE_System__load_CPTs_and_session__complete');
1108
+	}
1109
+
1110
+
1111
+	/**
1112
+	 * load_controllers
1113
+	 * this is the best place to load any additional controllers that needs access to EE core.
1114
+	 * it is expected that all basic core EE systems, that are not dependant on the current request are loaded at this
1115
+	 * time
1116
+	 *
1117
+	 * @access public
1118
+	 * @return void
1119
+	 */
1120
+	public function load_controllers()
1121
+	{
1122
+		do_action('AHEE__EE_System__load_controllers__start');
1123
+		// let's get it started
1124
+		if (! $this->maintenance_mode->level()
1125
+			&& ($this->request->isFrontend() || $this->request->isFrontAjax())
1126
+		) {
1127
+			do_action('AHEE__EE_System__load_controllers__load_front_controllers');
1128
+			$this->loader->getShared('EE_Front_Controller');
1129
+		} elseif ($this->request->isAdmin() || $this->request->isAdminAjax()) {
1130
+			do_action('AHEE__EE_System__load_controllers__load_admin_controllers');
1131
+			$this->loader->getShared('EE_Admin');
1132
+		}
1133
+		do_action('AHEE__EE_System__load_controllers__complete');
1134
+	}
1135
+
1136
+
1137
+	/**
1138
+	 * core_loaded_and_ready
1139
+	 * all of the basic EE core should be loaded at this point and available regardless of M-Mode
1140
+	 *
1141
+	 * @access public
1142
+	 * @return void
1143
+	 * @throws Exception
1144
+	 */
1145
+	public function core_loaded_and_ready()
1146
+	{
1147
+		if ($this->request->isAdmin() || $this->request->isFrontend() || $this->request->isIframe()) {
1148
+			try {
1149
+				$this->loader->getShared('EventEspresso\core\services\assets\Registry');
1150
+				$this->loader->getShared('EventEspresso\core\domain\services\assets\CoreAssetManager');
1151
+				if (function_exists('register_block_type')) {
1152
+					$this->loader->getShared(
1153
+						'EventEspresso\core\services\editor\BlockRegistrationManager'
1154
+					);
1155
+				}
1156
+			} catch (Exception $exception) {
1157
+				new ExceptionStackTraceDisplay($exception);
1158
+			}
1159
+		}
1160
+		if ($this->request->isAdmin()
1161
+			|| $this->request->isEeAjax()
1162
+			|| $this->request->isFrontend()
1163
+		) {
1164
+			$this->loader->getShared('EE_Session');
1165
+		}
1166
+		do_action('AHEE__EE_System__core_loaded_and_ready');
1167
+		// load_espresso_template_tags
1168
+		if (is_readable(EE_PUBLIC . 'template_tags.php')
1169
+			&& ($this->request->isFrontend()
1170
+				|| $this->request->isAdmin()
1171
+				|| $this->request->isIframe()
1172
+				|| $this->request->isFeed()
1173
+			)
1174
+		) {
1175
+			require_once EE_PUBLIC . 'template_tags.php';
1176
+		}
1177
+		do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
1178
+	}
1179
+
1180
+
1181
+	/**
1182
+	 * initialize
1183
+	 * this is the best place to begin initializing client code
1184
+	 *
1185
+	 * @access public
1186
+	 * @return void
1187
+	 */
1188
+	public function initialize()
1189
+	{
1190
+		do_action('AHEE__EE_System__initialize');
1191
+	}
1192
+
1193
+
1194
+	/**
1195
+	 * initialize_last
1196
+	 * this is run really late during the WP init hook point, and ensures that mostly everything else that needs to
1197
+	 * initialize has done so
1198
+	 *
1199
+	 * @access public
1200
+	 * @return void
1201
+	 */
1202
+	public function initialize_last()
1203
+	{
1204
+		do_action('AHEE__EE_System__initialize_last');
1205
+		/** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
1206
+		$rewrite_rules = $this->loader->getShared(
1207
+			'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
1208
+		);
1209
+		$rewrite_rules->flushRewriteRules();
1210
+		add_action('admin_bar_init', array($this, 'addEspressoToolbar'));
1211
+		if ($this->request->isAdmin() && function_exists('wp_add_privacy_policy_content')) {
1212
+			$this->loader->getShared('EventEspresso\core\services\privacy\policy\PrivacyPolicyManager');
1213
+		}
1214
+	}
1215
+
1216
+
1217
+	/**
1218
+	 * @return void
1219
+	 * @throws EE_Error
1220
+	 */
1221
+	public function addEspressoToolbar()
1222
+	{
1223
+		$this->loader->getShared(
1224
+			'EventEspresso\core\domain\services\admin\AdminToolBar',
1225
+			array($this->registry->CAP)
1226
+		);
1227
+	}
1228
+
1229
+
1230
+	/**
1231
+	 * do_not_cache
1232
+	 * sets no cache headers and defines no cache constants for WP plugins
1233
+	 *
1234
+	 * @access public
1235
+	 * @return void
1236
+	 */
1237
+	public static function do_not_cache()
1238
+	{
1239
+		// set no cache constants
1240
+		if (! defined('DONOTCACHEPAGE')) {
1241
+			define('DONOTCACHEPAGE', true);
1242
+		}
1243
+		if (! defined('DONOTCACHCEOBJECT')) {
1244
+			define('DONOTCACHCEOBJECT', true);
1245
+		}
1246
+		if (! defined('DONOTCACHEDB')) {
1247
+			define('DONOTCACHEDB', true);
1248
+		}
1249
+		// add no cache headers
1250
+		add_action('send_headers', array('EE_System', 'nocache_headers'), 10);
1251
+		// plus a little extra for nginx and Google Chrome
1252
+		add_filter('nocache_headers', array('EE_System', 'extra_nocache_headers'), 10, 1);
1253
+		// prevent browsers from prefetching of the rel='next' link, because it may contain content that interferes with the registration process
1254
+		remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
1255
+	}
1256
+
1257
+
1258
+	/**
1259
+	 *    extra_nocache_headers
1260
+	 *
1261
+	 * @access    public
1262
+	 * @param $headers
1263
+	 * @return    array
1264
+	 */
1265
+	public static function extra_nocache_headers($headers)
1266
+	{
1267
+		// for NGINX
1268
+		$headers['X-Accel-Expires'] = 0;
1269
+		// plus extra for Google Chrome since it doesn't seem to respect "no-cache", but WILL respect "no-store"
1270
+		$headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
1271
+		return $headers;
1272
+	}
1273
+
1274
+
1275
+	/**
1276
+	 *    nocache_headers
1277
+	 *
1278
+	 * @access    public
1279
+	 * @return    void
1280
+	 */
1281
+	public static function nocache_headers()
1282
+	{
1283
+		nocache_headers();
1284
+	}
1285
+
1286
+
1287
+	/**
1288
+	 * simply hooks into "wp_list_pages_exclude" filter (for wp_list_pages method) and makes sure EE critical pages are
1289
+	 * never returned with the function.
1290
+	 *
1291
+	 * @param  array $exclude_array any existing pages being excluded are in this array.
1292
+	 * @return array
1293
+	 */
1294
+	public function remove_pages_from_wp_list_pages($exclude_array)
1295
+	{
1296
+		return array_merge($exclude_array, $this->registry->CFG->core->get_critical_pages_array());
1297
+	}
1298 1298
 }
Please login to merge, or discard this patch.