MediaWiki  REL1_24
ApiModuleManager.php
Go to the documentation of this file.
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 }