<?php
/**
* Simple wrapper that allows enumerating cached static instances
* of sync modules.
*
* @package automattic/jetpack-sync
*/
namespace Automattic\Jetpack\Sync;
use Automattic\Jetpack\Sync\Modules\Module;
/**
* A class to handle loading of sync modules.
*/
class Modules {
/**
* Lists classnames of sync modules we load by default.
*
* @access public
*
* @var array
*/
const DEFAULT_SYNC_MODULES = array(
'Automattic\\Jetpack\\Sync\\Modules\\Constants',
'Automattic\\Jetpack\\Sync\\Modules\\Callables',
'Automattic\\Jetpack\\Sync\\Modules\\Network_Options',
'Automattic\\Jetpack\\Sync\\Modules\\Options',
'Automattic\\Jetpack\\Sync\\Modules\\Terms',
'Automattic\\Jetpack\\Sync\\Modules\\Menus',
'Automattic\\Jetpack\\Sync\\Modules\\Themes',
'Automattic\\Jetpack\\Sync\\Modules\\Users',
'Automattic\\Jetpack\\Sync\\Modules\\Import',
'Automattic\\Jetpack\\Sync\\Modules\\Posts',
'Automattic\\Jetpack\\Sync\\Modules\\Protect',
'Automattic\\Jetpack\\Sync\\Modules\\Comments',
'Automattic\\Jetpack\\Sync\\Modules\\Updates',
'Automattic\\Jetpack\\Sync\\Modules\\Attachments',
'Automattic\\Jetpack\\Sync\\Modules\\Meta',
'Automattic\\Jetpack\\Sync\\Modules\\Plugins',
'Automattic\\Jetpack\\Sync\\Modules\\Stats',
'Automattic\\Jetpack\\Sync\\Modules\\Full_Sync_Immediately',
'Automattic\\Jetpack\\Sync\\Modules\\Term_Relationships',
);
/**
* Keeps track of initialized sync modules.
*
* @access private
* @static
*
* @var null|array
*/
private static $initialized_modules = null;
/**
* Gets a list of initialized modules.
*
* @access public
* @static
*
* @return Module[]
*/
public static function get_modules() {
if ( null === self::$initialized_modules ) {
self::$initialized_modules = self::initialize_modules();
}
return self::$initialized_modules;
}
/**
* Sets defaults for all initialized modules.
*
* @access public
* @static
*/
public static function set_defaults() {
foreach ( self::get_modules() as $module ) {
$module->set_defaults();
}
}
/**
* Gets the name of an initialized module. Returns false if given module has not been initialized.
*
* @access public
* @static
*
* @param string $module_name A module name.
*
* @return bool|Automattic\Jetpack\Sync\Modules\Module
*/
public static function get_module( $module_name ) {
foreach ( self::get_modules() as $module ) {
if ( $module->name() === $module_name ) {
return $module;
}
}
return false;
}
/**
* Loads and sets defaults for all declared modules.
*
* @access public
* @static
*
* @return array
*/
public static function initialize_modules() {
/**
* Filters the list of class names of sync modules.
* If you add to this list, make sure any classes implement the
* Jetpack_Sync_Module interface.
*
* @since 1.6.3
* @since-jetpack 4.2.0
*/
$modules = apply_filters( 'jetpack_sync_modules', self::DEFAULT_SYNC_MODULES );
$modules = array_map( array( __CLASS__, 'load_module' ), $modules );
return array_map( array( __CLASS__, 'set_module_defaults' ), $modules );
}
/**
* Returns an instance of the given module class.
*
* @access public
* @static
*
* @param string $module_class The classname of a Jetpack sync module.
*
* @return Automattic\Jetpack\Sync\Modules\Module
*/
public static function load_module( $module_class ) {
return new $module_class();
}
/**
* Sets defaults for the given instance of a Jetpack sync module.
*
* @access public
* @static
*
* @param Automattic\Jetpack\Sync\Modules\Module $module Instance of a Jetpack sync module.
*
* @return Automattic\Jetpack\Sync\Modules\Module
*/
public static function set_module_defaults( $module ) {
$module->set_defaults();
if ( method_exists( $module, 'set_late_default' ) ) {
add_action( 'init', array( $module, 'set_late_default' ), 90 );
}
return $module;
}
}