12use InvalidArgumentException;
15use UnexpectedValueException;
16use Wikimedia\ObjectFactory\ObjectFactory;
29 private $mInstances = [];
33 private $mGroups = [];
37 private $mModules = [];
41 private $objectFactory;
50 private readonly
ApiBase $parentModule,
51 ?ObjectFactory $objectFactory =
null,
67 foreach ( $modules as $name => $moduleSpec ) {
68 $this->
addModule( $name, $group, $moduleSpec );
89 public function addModule(
string $name,
string $group, $spec, $factory =
null ) {
90 if ( is_string( $spec ) ) {
95 if ( is_callable( $factory ) ) {
96 wfDeprecated( __METHOD__ .
' with $class and $factory',
'1.34' );
97 $spec[
'factory'] = $factory;
99 } elseif ( !is_array( $spec ) ) {
100 throw new InvalidArgumentException(
'$spec must be a string or an array' );
101 } elseif ( !isset( $spec[
'class'] ) ) {
102 throw new InvalidArgumentException(
'$spec must define a class name' );
105 $this->mGroups[$group] =
null;
106 $this->mModules[$name] = [ $group, $spec ];
118 public function getModule( $moduleName, $group =
null, $ignoreCache =
false ) {
119 if ( !isset( $this->mModules[$moduleName] ) ) {
123 [ $moduleGroup, $spec ] = $this->mModules[$moduleName];
125 if ( $group !==
null && $moduleGroup !== $group ) {
129 if ( !$ignoreCache && isset( $this->mInstances[$moduleName] ) ) {
131 return $this->mInstances[$moduleName];
134 $instance = $this->instantiateModule( $moduleName, $spec );
136 if ( !$ignoreCache ) {
138 $this->mInstances[$moduleName] = $instance;
154 private function instantiateModule( $name, $spec ) {
155 return $this->objectFactory->createObject(
162 'assertClass' => $spec[
'class']
173 if ( $group ===
null ) {
174 return array_keys( $this->mModules );
177 foreach ( $this->mModules as $name => $groupAndSpec ) {
178 if ( $groupAndSpec[0] === $group ) {
193 foreach ( $this->mModules as $name => $groupAndSpec ) {
194 if ( $group ===
null || $groupAndSpec[0] === $group ) {
195 $result[$name] = $groupAndSpec[1][
'class'];
210 if ( isset( $this->mModules[$module] ) ) {
211 return $this->mModules[$module][1][
'class'];
223 public function isDefined( $moduleName, $group =
null ) {
224 if ( isset( $this->mModules[$moduleName] ) ) {
225 return $group ===
null || $this->mModules[$moduleName][0] === $group;
237 if ( isset( $this->mModules[$moduleName] ) ) {
238 return $this->mModules[$moduleName][0];
249 return array_keys( $this->mGroups );
254class_alias( ApiModuleManager::class,
'ApiModuleManager' );
wfDeprecated( $function, $version=false, $component=false, $callerOffset=2)
Logs a warning that a deprecated feature was used.
The simplest way of implementing IContextSource is to hold a RequestContext as a member variable and ...