58 $this->mParent = $parentModule;
100 foreach (
$modules as $name => $moduleSpec ) {
101 if ( is_array( $moduleSpec ) ) {
102 $class = $moduleSpec[
'class'];
103 $factory = ( isset( $moduleSpec[
'factory'] ) ? $moduleSpec[
'factory'] : null );
105 $class = $moduleSpec;
109 $this->
addModule( $name, $group, $class, $factory );
125 public function addModule( $name, $group, $class, $factory =
null ) {
126 if ( !is_string( $name ) ) {
127 throw new InvalidArgumentException(
'$name must be a string' );
130 if ( !is_string( $group ) ) {
131 throw new InvalidArgumentException(
'$group must be a string' );
134 if ( !is_string( $class ) ) {
135 throw new InvalidArgumentException(
'$class must be a string' );
138 if ( $factory !==
null && !is_callable( $factory ) ) {
139 throw new InvalidArgumentException(
'$factory must be a callable (or null)' );
142 $this->mGroups[$group] =
null;
143 $this->mModules[
$name] = [ $group, $class, $factory ];
155 public function getModule( $moduleName, $group =
null, $ignoreCache =
false ) {
156 if ( !isset( $this->mModules[$moduleName] ) ) {
160 list( $moduleGroup, $moduleClass, $moduleFactory ) = $this->mModules[$moduleName];
162 if ( $group !==
null && $moduleGroup !== $group ) {
166 if ( !$ignoreCache && isset( $this->mInstances[$moduleName] ) ) {
168 return $this->mInstances[$moduleName];
171 $instance = $this->
instantiateModule( $moduleName, $moduleClass, $moduleFactory );
173 if ( !$ignoreCache ) {
175 $this->mInstances[$moduleName] = $instance;
193 if ( $factory !==
null ) {
195 $instance = call_user_func( $factory, $this->mParent, $name );
197 if ( !$instance instanceof $class ) {
199 "The factory function for module $name did not return an instance of $class!"
204 $instance =
new $class( $this->mParent, $name );
216 if ( $group ===
null ) {
217 return array_keys( $this->mModules );
220 foreach ( $this->mModules as $name => $grpCls ) {
221 if ( $grpCls[0] === $group ) {
236 foreach ( $this->mModules as $name => $grpCls ) {
237 if ( $group ===
null || $grpCls[0] === $group ) {
238 $result[
$name] = $grpCls[1];
253 if ( isset( $this->mModules[$module] ) ) {
254 return $this->mModules[$module][1];
266 public function isDefined( $moduleName, $group =
null ) {
267 if ( isset( $this->mModules[$moduleName] ) ) {
268 return $group ===
null || $this->mModules[$moduleName][0] === $group;
280 if ( isset( $this->mModules[$moduleName] ) ) {
281 return $this->mModules[$moduleName][0];
292 return array_keys( $this->mGroups );
This abstract class implements many basic API functions, and is the base of all API classes.
This class holds a list of modules and handles instantiation.
getModule( $moduleName, $group=null, $ignoreCache=false)
Get module instance by name, or instantiate it if it does not exist.
getGroups()
Get a list of groups this manager contains.
__construct(ApiBase $parentModule)
Construct new module manager.
getNamesWithClasses( $group=null)
Create an array of (moduleName => moduleClass) for a specific group or for all.
getClassName( $module)
Returns the class name of the given module.
getModuleGroup( $moduleName)
Returns the group name for the given module.
instantiateModule( $name, $class, $factory=null)
Instantiate the module using the given class or factory function.
addModule( $name, $group, $class, $factory=null)
Add or overwrite a module in this ApiMain instance.
addModules(array $modules, $group)
Add a list of modules to the manager.
getNames( $group=null)
Get an array of modules in a specific group or all if no group is set.
isDefined( $moduleName, $group=null)
Returns true if the specific module is defined at all or in a specific group.
The simplest way of implementing IContextSource is to hold a RequestContext as a member variable and ...
deferred txt A few of the database updates required by various functions here can be deferred until after the result page is displayed to the user For updating the view updating the linked to tables after a etc PHP does not yet have any way to tell the server to actually return and disconnect while still running these but it might have such a feature in the future We handle these by creating a deferred update object and putting those objects on a global list
namespace being checked & $result
Allows to change the fields on the form that will be generated $name