diff options
Diffstat (limited to 'www/wiki/includes/skins/SkinFactory.php')
-rw-r--r-- | www/wiki/includes/skins/SkinFactory.php | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/www/wiki/includes/skins/SkinFactory.php b/www/wiki/includes/skins/SkinFactory.php new file mode 100644 index 00000000..cc993aaf --- /dev/null +++ b/www/wiki/includes/skins/SkinFactory.php @@ -0,0 +1,103 @@ +<?php + +/** + * Copyright 2014 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file + */ + +use MediaWiki\MediaWikiServices; + +/** + * Factory class to create Skin objects + * + * @since 1.24 + */ +class SkinFactory { + + /** + * Map of name => callback + * @var array + */ + private $factoryFunctions = []; + /** + * Map of name => fallback human-readable name, used when the 'skinname-<skin>' message is not + * available + * + * @var array + */ + private $displayNames = []; + + /** + * @deprecated in 1.27 + * @return SkinFactory + */ + public static function getDefaultInstance() { + return MediaWikiServices::getInstance()->getSkinFactory(); + } + + /** + * Register a new Skin factory function. + * + * Will override if it's already registered. + * + * @param string $name Internal skin name. Should be all-lowercase (technically doesn't have + * to be, but doing so would change the case of i18n message keys). + * @param string $displayName For backwards-compatibility with old skin loading system. This is + * the text used as skin's human-readable name when the 'skinname-<skin>' message is not + * available. It should be the same as the skin name provided in $wgExtensionCredits. + * @param callable $callback Callback that takes the skin name as an argument + * @throws InvalidArgumentException If an invalid callback is provided + */ + public function register( $name, $displayName, $callback ) { + if ( !is_callable( $callback ) ) { + throw new InvalidArgumentException( 'Invalid callback provided' ); + } + $this->factoryFunctions[$name] = $callback; + $this->displayNames[$name] = $displayName; + } + + /** + * Returns an associative array of: + * skin name => human readable name + * + * @return array + */ + public function getSkinNames() { + return $this->displayNames; + } + + /** + * Create a given Skin using the registered callback for $name. + * @param string $name Name of the skin you want + * @throws SkinException If a factory function isn't registered for $name + * @throws UnexpectedValueException If the factory function returns a non-Skin object + * @return Skin + */ + public function makeSkin( $name ) { + if ( !isset( $this->factoryFunctions[$name] ) ) { + throw new SkinException( "No registered builder available for $name." ); + } + $skin = call_user_func( $this->factoryFunctions[$name], $name ); + if ( $skin instanceof Skin ) { + return $skin; + } else { + throw new UnexpectedValueException( "The builder for $name returned a non-Skin object." ); + } + } +} |