reflection ) { try { $this->reflection = new ReflectionClass( $this ); } catch ( ReflectionException $e ) { if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log error_log( $e->getMessage() ); } } } return $this->reflection; } /** * Add module component. * * Add new component to the current module. * @access public * * @param string $id Component ID. * @param mixed $instance An instance of the component. */ public function add_component( $id, $instance ) { $this->components[ $id ] = $instance; } /** * Add module route. * * Add new route to the current module. * @access public * * @param string $id Route ID. * @param mixed $instance An instance of the route. */ public function add_route( string $id, $instance ) { $this->routes[ $id ] = $instance; } /** * @access public * @return Module[] */ public function get_components(): array { return $this->components; } /** * Get module component. * * Retrieve the module component. * @access public * * @param string $id Component ID. * * @return mixed An instance of the component, or `false` if the component * doesn't exist. * @codeCoverageIgnore */ public function get_component( $id ) { if ( isset( $this->components[ $id ] ) ) { return $this->components[ $id ]; } return false; } /** * Retrieve the namespace of the class * * @access public * @static */ public static function namespace_name() { $class_name = static::class_name(); return substr( $class_name, 0, strrpos( $class_name, '\\' ) ); } public static function routes_list() : array { return []; } public static function component_list() : array { return []; } /** * Adds an array of components. * Assumes namespace structure contains `\Components\` * * @param array $components_ids => component's class name. */ public function register_components( $components_ids = null ) { $namespace = static::namespace_name(); $components_ids = $components_ids ?? static::component_list(); foreach ( $components_ids as $component_id ) { $class_name = $namespace . '\\Components\\' . $component_id; $this->add_component( $component_id, new $class_name() ); } } /** * Adds an array of routes. * Assumes namespace structure contains `\Rest\` */ public function register_routes() { $namespace = static::namespace_name(); $routes_ids = static::routes_list(); foreach ( $routes_ids as $route_id ) { $class_name = $namespace . '\\Rest\\' . $route_id; $this->add_route( $route_id, new $class_name() ); } } }