callback * @var array */ protected $factoryFunctions = array(); /** * Config objects that have already been created * name => Config object * @var array */ protected $configs = array(); /** * @var ConfigFactory */ private static $self; public static function getDefaultInstance() { if ( !self::$self ) { self::$self = new self; global $wgConfigRegistry; foreach ( $wgConfigRegistry as $name => $callback ) { self::$self->register( $name, $callback ); } } return self::$self; } /** * Destroy the default instance * Should only be called inside unit tests * @throws MWException * @codeCoverageIgnore */ public static function destroyDefaultInstance() { if ( !defined( 'MW_PHPUNIT_TEST' ) ) { throw new MWException( __METHOD__ . ' was called outside of unit tests' ); } self::$self = null; } /** * Register a new config factory function * Will override if it's already registered * @param string $name * @param callable $callback That takes this ConfigFactory as an argument * @throws InvalidArgumentException If an invalid callback is provided */ public function register( $name, $callback ) { if ( !is_callable( $callback ) ) { throw new InvalidArgumentException( 'Invalid callback provided' ); } $this->factoryFunctions[$name] = $callback; } /** * Create a given Config using the registered callback for $name. * If an object was already created, the same Config object is returned. * @param string $name Name of the extension/component you want a Config object for * 'main' is used for core * @throws ConfigException If a factory function isn't registered for $name * @throws UnexpectedValueException If the factory function returns a non-Config object * @return Config */ public function makeConfig( $name ) { if ( !isset( $this->configs[$name] ) ) { if ( !isset( $this->factoryFunctions[$name] ) ) { throw new ConfigException( "No registered builder available for $name." ); } $conf = call_user_func( $this->factoryFunctions[$name], $this ); if ( $conf instanceof Config ) { $this->configs[$name] = $conf; } else { throw new UnexpectedValueException( "The builder for $name returned a non-Config object." ); } } return $this->configs[$name]; } }