diff --git a/src/CliProgram/BaseCommand.php b/src/CliProgram/BaseCommand.php index 3096b7a..6154979 100644 --- a/src/CliProgram/BaseCommand.php +++ b/src/CliProgram/BaseCommand.php @@ -14,19 +14,70 @@ use Throwable; */ class BaseCommand extends Command { /** - * Initialize the command - * - * @param string|null $name The command name, Null = class name - * @param string ...$aliases The command aliases + * @return string|null The command default name */ - public function __construct (?string $name = null, string ...$aliases) { - if ($name === null) { - $classShortName = (new ReflectionClass($this))->getShortName(); - $name = mb_strtolower(mb_substr($classShortName, 0, 1)) . mb_substr($classShortName, 1); + public static function getDefaultName (): ?string { + $reflectionClass = new ReflectionClass(static::class); + if ($attribute = $reflectionClass->getAttributes(CliCommand::class)) { + /** @var CliCommand $cliCommandAttribute */ + $cliCommandAttribute = $attribute[0]->newInstance(); + return $cliCommandAttribute->name; + } + if (($name = parent::getDefaultName()) !== null) { + return $name; } + $classShortName = $reflectionClass->getShortName(); + return mb_strtolower(mb_substr($classShortName, 0, 1)) . mb_substr($classShortName, 1); + } + /** + * @return string[] The command default aliases + */ + public static function getDefaultAliases (): array { + $reflectionClass = new ReflectionClass(static::class); + if ($attribute = $reflectionClass->getAttributes(CliCommand::class)) { + /** @var CliCommand $cliCommandAttribute */ + $cliCommandAttribute = $attribute[0]->newInstance(); + return $cliCommandAttribute->aliases; + } + return []; + } + /** + * @return string|null The command default description + */ + public static function getDefaultDescription (): ?string { + if ($attribute = (new ReflectionClass(static::class))->getAttributes(CliCommand::class)) { + /** @var CliCommand $cliCommandAttribute */ + $cliCommandAttribute = $attribute[0]->newInstance(); + return $cliCommandAttribute->description; + } + return parent::getDefaultDescription(); + } + /** + * @return bool Is the command hidden from command list by default ? + */ + public static function getDefaultHidden (): bool { + if ($attribute = (new ReflectionClass(static::class))->getAttributes(CliCommand::class)) { + /** @var CliCommand $cliCommandAttribute */ + $cliCommandAttribute = $attribute[0]->newInstance(); + return $cliCommandAttribute->hidden; + } + return false; + } + + /** + * Initialize the command + * + * @param string|null $name The command name ; Null if the default one (cf. {@see static::getDefaultName()}) + * @param string[]|null $aliases The command aliases ; Null if the default one (cf. {@see static::getDefaultAliases()}) + * @param string|null $description The command description ; Null if the default one (cf. {@see static::getDefaultDescription()}) + * @param bool|null $hidden Is the command hidden from command list ? Null if the default one (cf. {@see static::getDefaultHidden()}) + */ + public function __construct (?string $name = null, ?array $aliases = null, ?string $description = null, ?bool $hidden = null) { parent::__construct($name); - $this->setAliases($aliases); + $this->setAliases($aliases ?? static::getDefaultAliases()); + $this->setDescription($description ?? $this->getDescription()); + $this->setHidden($hidden ?? static::getDefaultHidden()); } /** diff --git a/src/CliProgram/CliCommand.php b/src/CliProgram/CliCommand.php new file mode 100644 index 0000000..60d28eb --- /dev/null +++ b/src/CliProgram/CliCommand.php @@ -0,0 +1,47 @@ +name = $name; + $this->description = $description; + $this->aliases = $aliases; + $this->hidden = $hidden; + } +} \ No newline at end of file