namespace Elementor\Core;
use Elementor\Core\Base\Module;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
* Elementor modules manager.
* Elementor modules manager handler class is responsible for registering and
* managing Elementor modules.
* Holds the list of all the registered modules.
* Modules manager constructor.
* Initializing the Elementor modules manager.
public function __construct() {
$modules_namespace_prefix = $this->get_modules_namespace_prefix();
foreach ( $this->get_modules_names() as $module_name ) {
$class_name = str_replace( '-', ' ', $module_name );
$class_name = str_replace( ' ', '', ucwords( $class_name ) );
$class_name = $modules_namespace_prefix . '\\Modules\\' . $class_name . '\Module';
/** @var Module $class_name */
$experimental_data = $class_name::get_experimental_data();
if ( $experimental_data ) {
Plugin::$instance->experiments->add_feature( $experimental_data );
if ( ! Plugin::$instance->experiments->is_feature_active( $experimental_data['name'] ) ) {
if ( $class_name::is_active() ) {
$this->modules[ $module_name ] = $class_name::instance();
* Retrieve the modules names.
* @return string[] Modules names.
public function get_modules_names() {
// Depends on Nested Elements module
'image-loading-optimization',
* Retrieve all the registered modules or a specific module.
* @param string $module_name Module name.
* @return null|Module|Module[] All the registered modules or a specific module.
public function get_modules( $module_name ) {
if ( isset( $this->modules[ $module_name ] ) ) {
return $this->modules[ $module_name ];
* Get modules namespace prefix.
* Retrieve the modules namespace prefix.
* @return string Modules namespace prefix.
protected function get_modules_namespace_prefix() {