54 $this->mParent = $parentModule;
96 foreach (
$modules as $name => $moduleSpec ) {
97 if ( is_array( $moduleSpec ) ) {
98 $class = $moduleSpec[
'class'];
99 $factory = ( isset( $moduleSpec[
'factory'] ) ? $moduleSpec[
'factory'] : null );
101 $class = $moduleSpec;
105 $this->
addModule( $name, $group, $class, $factory );
121 public function addModule( $name, $group, $class, $factory =
null ) {
122 if ( !is_string( $name ) ) {
123 throw new InvalidArgumentException(
'$name must be a string' );
126 if ( !is_string( $group ) ) {
127 throw new InvalidArgumentException(
'$group must be a string' );
130 if ( !is_string( $class ) ) {
131 throw new InvalidArgumentException(
'$class must be a string' );
134 if ( $factory !==
null && !is_callable( $factory ) ) {
135 throw new InvalidArgumentException(
'$factory must be a callable (or null)' );
138 $this->mGroups[$group] =
null;
139 $this->mModules[
$name] = [ $group, $class, $factory ];
151 public function getModule( $moduleName, $group =
null, $ignoreCache =
false ) {
152 if ( !isset( $this->mModules[$moduleName] ) ) {
156 list( $moduleGroup, $moduleClass, $moduleFactory ) = $this->mModules[$moduleName];
158 if ( $group !==
null && $moduleGroup !== $group ) {
162 if ( !$ignoreCache && isset( $this->mInstances[$moduleName] ) ) {
164 return $this->mInstances[$moduleName];
167 $instance = $this->
instantiateModule( $moduleName, $moduleClass, $moduleFactory );
169 if ( !$ignoreCache ) {
171 $this->mInstances[$moduleName] = $instance;
189 if ( $factory !==
null ) {
191 $instance = call_user_func( $factory, $this->mParent, $name );
193 if ( !$instance instanceof $class ) {
195 "The factory function for module $name did not return an instance of $class!"
200 $instance =
new $class( $this->mParent, $name );
212 if ( $group ===
null ) {
213 return array_keys( $this->mModules );
216 foreach ( $this->mModules as $name => $grpCls ) {
217 if ( $grpCls[0] === $group ) {
232 foreach ( $this->mModules as $name => $grpCls ) {
233 if ( $group ===
null || $grpCls[0] === $group ) {
234 $result[
$name] = $grpCls[1];
249 if ( isset( $this->mModules[$module] ) ) {
250 return $this->mModules[$module][1];
262 public function isDefined( $moduleName, $group =
null ) {
263 if ( isset( $this->mModules[$moduleName] ) ) {
264 return $group ===
null || $this->mModules[$moduleName][0] === $group;
276 if ( isset( $this->mModules[$moduleName] ) ) {
277 return $this->mModules[$moduleName][0];
288 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