MediaWiki
REL1_24
|
00001 <?php 00034 class ApiModuleManager extends ContextSource { 00035 00039 private $mParent; 00043 private $mInstances = array(); 00047 private $mGroups = array(); 00051 private $mModules = array(); 00052 00057 public function __construct( ApiBase $parentModule ) { 00058 $this->mParent = $parentModule; 00059 } 00060 00099 public function addModules( array $modules, $group ) { 00100 00101 foreach ( $modules as $name => $moduleSpec ) { 00102 if ( is_array( $moduleSpec ) ) { 00103 $class = $moduleSpec['class']; 00104 $factory = ( isset( $moduleSpec['factory'] ) ? $moduleSpec['factory'] : null ); 00105 } else { 00106 $class = $moduleSpec; 00107 $factory = null; 00108 } 00109 00110 $this->addModule( $name, $group, $class, $factory ); 00111 } 00112 } 00113 00126 public function addModule( $name, $group, $class, $factory = null ) { 00127 if ( !is_string( $name ) ) { 00128 throw new InvalidArgumentException( '$name must be a string' ); 00129 } 00130 00131 if ( !is_string( $group ) ) { 00132 throw new InvalidArgumentException( '$group must be a string' ); 00133 } 00134 00135 if ( !is_string( $class ) ) { 00136 throw new InvalidArgumentException( '$class must be a string' ); 00137 } 00138 00139 if ( $factory !== null && !is_callable( $factory ) ) { 00140 throw new InvalidArgumentException( '$factory must be a callable (or null)' ); 00141 } 00142 00143 $this->mGroups[$group] = null; 00144 $this->mModules[$name] = array( $group, $class, $factory ); 00145 } 00146 00156 public function getModule( $moduleName, $group = null, $ignoreCache = false ) { 00157 if ( !isset( $this->mModules[$moduleName] ) ) { 00158 return null; 00159 } 00160 00161 list( $moduleGroup, $moduleClass, $moduleFactory ) = $this->mModules[$moduleName]; 00162 00163 if ( $group !== null && $moduleGroup !== $group ) { 00164 return null; 00165 } 00166 00167 if ( !$ignoreCache && isset( $this->mInstances[$moduleName] ) ) { 00168 // already exists 00169 return $this->mInstances[$moduleName]; 00170 } else { 00171 // new instance 00172 $instance = $this->instantiateModule( $moduleName, $moduleClass, $moduleFactory ); 00173 00174 if ( !$ignoreCache ) { 00175 // cache this instance in case it is needed later 00176 $this->mInstances[$moduleName] = $instance; 00177 } 00178 00179 return $instance; 00180 } 00181 } 00182 00193 private function instantiateModule( $name, $class, $factory = null ) { 00194 if ( $factory !== null ) { 00195 // create instance from factory 00196 $instance = call_user_func( $factory, $this->mParent, $name ); 00197 00198 if ( !$instance instanceof $class ) { 00199 throw new MWException( "The factory function for module $name did not return an instance of $class!" ); 00200 } 00201 } else { 00202 // create instance from class name 00203 $instance = new $class( $this->mParent, $name ); 00204 } 00205 00206 return $instance; 00207 } 00208 00214 public function getNames( $group = null ) { 00215 if ( $group === null ) { 00216 return array_keys( $this->mModules ); 00217 } 00218 $result = array(); 00219 foreach ( $this->mModules as $name => $grpCls ) { 00220 if ( $grpCls[0] === $group ) { 00221 $result[] = $name; 00222 } 00223 } 00224 00225 return $result; 00226 } 00227 00233 public function getNamesWithClasses( $group = null ) { 00234 $result = array(); 00235 foreach ( $this->mModules as $name => $grpCls ) { 00236 if ( $group === null || $grpCls[0] === $group ) { 00237 $result[$name] = $grpCls[1]; 00238 } 00239 } 00240 00241 return $result; 00242 } 00243 00251 public function getClassName( $module ) { 00252 if ( isset( $this->mModules[$module] ) ) { 00253 return $this->mModules[$module][1]; 00254 } 00255 00256 return false; 00257 } 00258 00265 public function isDefined( $moduleName, $group = null ) { 00266 if ( isset( $this->mModules[$moduleName] ) ) { 00267 return $group === null || $this->mModules[$moduleName][0] === $group; 00268 } 00269 00270 return false; 00271 } 00272 00278 public function getModuleGroup( $moduleName ) { 00279 if ( isset( $this->mModules[$moduleName] ) ) { 00280 return $this->mModules[$moduleName][0]; 00281 } 00282 00283 return null; 00284 } 00285 00290 public function getGroups() { 00291 return array_keys( $this->mGroups ); 00292 } 00293 }