From be37236c7660e1f204a0c6c5dbccb3620c3d48a1 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 26 Jul 2018 15:21:03 +0100 Subject: [PATCH] Deduplicate code for general classpath registries --- src/pocketmine/entity/Entity.php | 18 ++++------------ .../level/format/io/LevelProviderManager.php | 13 ++---------- src/pocketmine/tile/Tile.php | 15 +++---------- src/pocketmine/utils/Utils.php | 21 +++++++++++++++++++ 4 files changed, 30 insertions(+), 37 deletions(-) diff --git a/src/pocketmine/entity/Entity.php b/src/pocketmine/entity/Entity.php index 480d38cbf..e2ea69f1a 100644 --- a/src/pocketmine/entity/Entity.php +++ b/src/pocketmine/entity/Entity.php @@ -73,6 +73,7 @@ use pocketmine\plugin\Plugin; use pocketmine\Server; use pocketmine\timings\Timings; use pocketmine\timings\TimingsHandler; +use pocketmine\utils\Utils; abstract class Entity extends Location implements Metadatable, EntityIds{ @@ -304,27 +305,16 @@ abstract class Entity extends Location implements Metadatable, EntityIds{ * @throws \InvalidArgumentException */ public static function registerEntity(string $className, bool $force = false, array $saveNames = []) : void{ + Utils::testValidInstance($className, Entity::class); + /** @var Entity $className */ - - try{ - $class = new \ReflectionClass($className); - }catch(\ReflectionException $e){ - throw new \InvalidArgumentException("Class $className does not exist"); - } - if(!$class->isSubclassOf(Entity::class)){ - throw new \InvalidArgumentException("Class $className does not extend " . Entity::class); - } - if(!$class->isInstantiable()){ - throw new \InvalidArgumentException("Class $className cannot be constructed"); - } - if($className::NETWORK_ID !== -1){ self::$knownEntities[$className::NETWORK_ID] = $className; }elseif(!$force){ throw new \InvalidArgumentException("Class $className does not declare a valid NETWORK_ID and not force-registering"); } - $shortName = $class->getShortName(); + $shortName = (new \ReflectionClass($className))->getShortName(); if(!in_array($shortName, $saveNames, true)){ $saveNames[] = $shortName; } diff --git a/src/pocketmine/level/format/io/LevelProviderManager.php b/src/pocketmine/level/format/io/LevelProviderManager.php index 1b42a5eda..04f30f168 100644 --- a/src/pocketmine/level/format/io/LevelProviderManager.php +++ b/src/pocketmine/level/format/io/LevelProviderManager.php @@ -27,6 +27,7 @@ use pocketmine\level\format\io\leveldb\LevelDB; use pocketmine\level\format\io\region\Anvil; use pocketmine\level\format\io\region\McRegion; use pocketmine\level\format\io\region\PMAnvil; +use pocketmine\utils\Utils; abstract class LevelProviderManager{ protected static $providers = []; @@ -44,17 +45,7 @@ abstract class LevelProviderManager{ * @throws \InvalidArgumentException */ public static function addProvider(string $class){ - try{ - $reflection = new \ReflectionClass($class); - }catch(\ReflectionException $e){ - throw new \InvalidArgumentException("Class $class does not exist"); - } - if(!$reflection->implementsInterface(LevelProvider::class)){ - throw new \InvalidArgumentException("Class $class does not implement " . LevelProvider::class); - } - if(!$reflection->isInstantiable()){ - throw new \InvalidArgumentException("Class $class cannot be constructed"); - } + Utils::testValidInstance($class, LevelProvider::class); /** @var LevelProvider $class */ self::$providers[strtolower($class::getProviderName())] = $class; diff --git a/src/pocketmine/tile/Tile.php b/src/pocketmine/tile/Tile.php index 78cda5fed..d26849649 100644 --- a/src/pocketmine/tile/Tile.php +++ b/src/pocketmine/tile/Tile.php @@ -39,6 +39,7 @@ use pocketmine\Player; use pocketmine\Server; use pocketmine\timings\Timings; use pocketmine\timings\TimingsHandler; +use pocketmine\utils\Utils; abstract class Tile extends Position{ @@ -114,19 +115,9 @@ abstract class Tile extends Position{ * @param string[] $saveNames */ public static function registerTile(string $className, array $saveNames = []) : void{ - try{ - $class = new \ReflectionClass($className); - }catch(\ReflectionException $e){ - throw new \InvalidArgumentException("Class $className does not exist"); - } - if(!$class->isSubclassOf(Tile::class)){ - throw new \InvalidArgumentException("Class $className does not extend " . Tile::class); - } - if(!$class->isInstantiable()){ - throw new \InvalidArgumentException("Class $className cannot be constructed"); - } + Utils::testValidInstance($className, Tile::class); - $shortName = $class->getShortName(); + $shortName = (new \ReflectionClass($className))->getShortName(); if(!in_array($shortName, $saveNames, true)){ $saveNames[] = $shortName; } diff --git a/src/pocketmine/utils/Utils.php b/src/pocketmine/utils/Utils.php index fa80a13ac..08552626a 100644 --- a/src/pocketmine/utils/Utils.php +++ b/src/pocketmine/utils/Utils.php @@ -547,4 +547,25 @@ class Utils{ return true; //stfu operator } + + public static function testValidInstance(string $className, string $baseName) : void{ + try{ + $base = new \ReflectionClass($baseName); + }catch(\ReflectionException $e){ + throw new \InvalidArgumentException("Base class $baseName does not exist"); + } + + try{ + $class = new \ReflectionClass($className); + }catch(\ReflectionException $e){ + throw new \InvalidArgumentException("Class $className does not exist"); + } + + if(!$class->isSubclassOf($baseName)){ + throw new \InvalidArgumentException("Class $className does not " . ($base->isInterface() ? "implement" : "extend") . " " . $baseName); + } + if(!$class->isInstantiable()){ + throw new \InvalidArgumentException("Class $className cannot be constructed"); + } + } }