7

I have a package with multiple main and I want to define several options:

My code is something like this:

package Perl6::Documentable::CLI {
    proto MAIN(|) is export {*}
    my %*SUB-MAIN-OPTS = :named-everywhere;

    multi MAIN(
        "setup"
    ) { ... }

    multi MAIN (
        "start"                           ,
        Str  :$topdir              = "doc",
        Bool :v(:verbose($v))      = False
    ) { ... }

But when I try to actually execute it with:

perl6 -Ilib bin/documentable start -v --topdir=ss

It outputs this line:

Usage:
  bin/documentable [--topdir=<Str>] [-v|--verbose] start

I am using %*SUB-MAIN-OPTS but it looks like it does not work neither.

Elizabeth Mattijsen
  • 25,654
  • 3
  • 75
  • 105
Antonio Gamiz Delgado
  • 1,871
  • 1
  • 12
  • 33

1 Answers1

11

The simplest solution would be to export the dynamic variable %*SUB-MAIN-OPTS, but that is still Not Yet Implemented completely: the export works sorta, but winds up being an empty hash. So not very useful.

Rakudo will call a subroutine called RUN-MAIN when it decides there is a MAIN sub to be run. You can actually export a RUN-MAIN from your module, and set up the dynamic variable, and then call the original RUN-MAIN:

sub RUN-MAIN(|c) is export {
    my %*SUB-MAIN-OPTS = :named-anywhere;
    CORE::<&RUN-MAIN>(|c)
}

For more information about RUN-MAIN, see: https://docs.raku.org/language/create-cli#index-entry-RUN-MAIN

Elizabeth Mattijsen
  • 25,654
  • 3
  • 75
  • 105