App-Easer

 view release on metacpan or  search on metacpan

lib/App/Easer/Tutorial/V2_008.pod  view on Meta::CPAN

   use v5.24;
   use warnings;
   use English;
   use experimental qw< signatures >;

   use App::Easer::V2 qw< run >;

   my $app = {
      aliases => [qw< MAIN >],
      sources => 'v2.008',
      config_hash_key => 'v2.008',
      children => [
         {
            aliases => [qw< foo >],
            execute => sub ($self) {
               say 'foo here!';
               return 0;
            },
         },
         {
            aliases => [qw< bar >],
            execute => sub ($self) {
               say 'bar here!';
               return 0;
            },
         },
      ],

      #####################################################################
      # this sets what's done *by* the root command
      execute => sub ($self) {
         say 'MAIN (root) here!';
         return 0;
      },

      #####################################################################
      # this makes the command itself the default command to call when
      # nothing more is provided on the command line. The default value
      # is 'usage'.
      default_child => '-self',

   };

   exit(run($app, $0, @ARGV) // 0);

Sample calls:

   $ root-exec foo
   foo here!

   $ root-exec bar
   bar here!

   $ root-exec
   MAIN (root) here!


=head3 You might also want to set C<fallback_to>...

While the example in the previous section works, it's still a bit
fragile, because it makes the upper command able to run with regular
options but not with non-option command-line arguments (i.e. those that
end up populating C<residual_args>):

   $ root-exec galook
   cannot find sub-command 'galook'

This happens because L<App::Easer> defaults to looking for a child
command and complains under the assumption that the user I<might> have
mistyped a sub-command's name.

Again, this is not hardcoded but the effect of a configuration option,
namely C<fallback_to>. By setting it to C<-self> you can ask for using
the command itself as the fallback in case no sub-command can be found:

   #!/usr/bin/env perl
   use v5.24;
   use warnings;
   use English;
   use experimental qw< signatures >;

   use App::Easer::V2 qw< run >;

   my $app = {
      aliases => [qw< MAIN >],
      sources => 'v2.008',
      config_hash_key => 'v2.008',
      children => [
         {
            aliases => [qw< foo >],
            execute => sub ($self) {
               say 'foo here!';
               return 0;
            },
         },
         {
            aliases => [qw< bar >],
            execute => sub ($self) {
               say 'bar here!';
               return 0;
            },
         },
      ],
      execute => sub ($self) {
         my @args = $self->residual_args;
         say "MAIN (root) here! Also got (@args)";
         return 0;
      },
      default_child => '-self',

      #####################################################################
      # this sets the MAIN command as the default command to run if no
      # child is found when additional residual-args are provided on the
      # command line
      fallback_to   => '-self',
   };

   exit(run($app, $0, @ARGV) // 0);

This works now:



( run in 3.184 seconds using v1.01-cache-2.11-cpan-b16cb0d3907 )