$action(); } throw new \Dogs\Exceptions\UnknownActionException($name); } /** * Make an instance of dog * * @param string $kind * @return self * @throws \Dogs\Exceptions\UnknownKindException */ public static function buildDog(string $kind) : self { if (static::isDog($kind)) { $kindClass = '\\Dogs\\Kinds\\' . studly_case($kind); return new $kindClass(); } throw new \Dogs\Exceptions\UnknownKindException($kind); } /** * Is specified kind is a dog * * @param string $kind * @return boolean */ public static function isDog(string $kind) : bool { $kindClass = studly_case($kind); return class_exists("\\Dogs\\Kinds\\{$kindClass}"); } /** * @return array|string[] */ public static function getKnownKinds() : array { return [ static::KIND_PLUSH_LABRADOR, static::KIND_PUG, static::KIND_RUBBER_DACHSHUND, static::KIND_SHIBA_INU ]; } public static function getKnownActions() : array { $allMethods = get_class_methods(static::class); $actionMethods = array_filter($allMethods, function (string $methodName) { return strpos($methodName, 'make') === 0; }); return array_map(function (string $methodName) { $action = str_replace('make', '', $methodName); return kebab_case($action); }, $actionMethods); } }