$input JSON schema for the arguments * @param Closure(array):bool $permission * @param Closure(array):array $run * @param Closure(array):array{summary:string,before:string,after:string,plugin?:array}|null $preview * @param Closure(array,array):array|null $undo given the journal's before and after * @param Closure(array,Overlay):array{summary:string,before:string,after:string}|null $stage */ public function __construct( public readonly string $name, public readonly string $label, public readonly string $kind, public readonly string $description, public readonly array $input, public readonly Closure $permission, public readonly Closure $run, public readonly ?Closure $preview = null, public readonly ?Closure $undo = null, public readonly bool $consent = false, public readonly ?Closure $stage = null, ) { } /** @param array $args */ public function allowed(array $args): bool { return ($this->permission)($args); } /** @param array $args */ public function validate(array $args): ?string { return Schema::check($this->input, $args); } /** What Sarcio is told about this ability. */ public function describe(): array { return [ 'description' => $this->description, 'input' => $this->input, 'kind' => $this->kind, 'name' => $this->name, ]; } }