Provided by: libcli-osprey-perl_0.08-2_all bug

NAME

       CLI::Osprey - MooX::Options + MooX::Cmd + Sanity

VERSION

       version 0.08

SYNOPSIS

       in Hello.pm

           package Hello;
           use Moo;
           use CLI::Osprey;

           option 'message' => (
               is => 'ro',
               format => 's',
               doc => 'The message to display',
               default => 'Hello world!',
           );

           sub run {
               my ($self) = @_;
               print $self->message, "\n";
           }

       In hello.pl

           use Hello;
           Hello->new_with_options->run;

DESCRIPTION

       CLI::Osprey is a module to assist in writing commandline applications with M* OO modules (Moose, Moo,
       Mo). With it, you structure your app as one or more modules, which get instantiated with the commandline
       arguments as attributes.  Arguments are parsed using Getopt::Long::Descriptive, and both long and short
       help messages as well as complete manual pages are automatically generated. An app can be a single
       command with options, or have sub-commands (like "git"). Sub-commands can be defined as modules (with
       options of their own) or as simple coderefs.

   Differences from MooX::Options
       Osprey is deliberately similar to MooX::Options, and porting an app that uses MooX::Options to Osprey
       should be fairly simple in most cases. However there are a few important differences:

       •   Osprey  is  pure-perl,  without  any  mandatory  XS dependencies, meaning it can be used in fatpacked
           scripts, and other situations where you may need to run on diverse machines, where a C  compiler  and
           control over the ennvironment aren't guaranteed.

       •   Osprey's  support  for  sub-commands is built-in from the beginning. We think this makes for a better
           experience than MooX::Options + MooX::Cmd.

       •   While MooX::Options requires an option's primary name to be the same as the attribute that holds  it,
           and  MooX::Cmd  derives  a  sub-command's name from the name of the module that implements it, Osprey
           separates these, so  that  Perl  identifier  naming  conventions  don't  dictate  your  command  line
           interface.

       •   Osprey  doesn't  use  an  automatic module finder (like Module::Pluggable) to locate modules for sub-
           commands; their names are given explicitly. This small amount of additional  typing  gives  you  more
           control and less fragility.

       There are also a few things MooX::Options has that Osprey lacks. While they may be added in the future, I
       haven't  seen  the  need  yet.  Currently  known  missing  feeatures are JSON options, "config_from_file"
       support, "autosplit", and "autorange".

       For JSON support, you can use a coercion on the attribute,  turning  it  from  a  string  to  a  ref  via
       "decode_json".

       To  default  an  app's  options from a config file, you may want to do something like this in your script
       file:

           use JSON 'decode_json';
           use Path::Tiny;

           MyApp->new_with_options(
               map decode_json(path($_)->slurp),
               grep -f,
               "$ENV{HOME}/.myapprc"
           )->run;

       Provided that "prefer_commandline" is true (which is the default), any options in ".myapprc" will be used
       as defaults if that file exists, but will still be overrideable from the commandline.

IMPORTED METHODS

       The following methods, will be imported into a class that uses CLI::Osprey:

   new_with_options
       Parses commandline arguments, validates them, and calls the "new" method with the  resulting  parameters.
       Any parameters passed to "new_with_options" will also be passed to "new"; the "prefer_commandline" import
       option controls which overrides which.

   option
       The  "option"  keyword  acts  like  "has"  (and  accepts  all of the arguments that "has" does), but also
       registers the attribute as a commandline option. See "OPTION PARAMETERS" for usage.

   osprey_usage($code, @messages)
       Displays a short usage message, the same as if the app was invoked with the "-h"  option.  Also  displays
       the  lines of text in @messages if any are passed. If $code is passed a defined value, exits with that as
       a status.

   osprey_help($code)
       Displays a more substantial usage message, the same as if the app was invoked with the  "--help"  option.
       If $code is passed a defined value, exits with that as a status.

   osprey_man
       Displays a manual page for the app, containing long descriptive text (if provided) about each command and
       option, then exits.

IMPORT PARAMETERS

       The  parameters  to  "use  CLI::Osprey"  serve  two roles: to customize Osprey's behavior, and to provide
       information about the app and its options for use in the usage messages. They are:

   abbreviate
       Default: true.

       If "abbreviate" is set to a true value, then long options can be abbreviated to the point of  uniqueness.
       That  is,  "--long-option-name"  can  be called as "--lon" as long as there are no other options starting
       with those letters. An option can always be called by its full name, even if  it  is  a  prefix  of  some
       longer  option's name. If "abbreviate" is false, options must always be called by their full names (or by
       a defined short name).

   added_order
       Default: true.

       If "added_order" is set to a true value, then two options with the same "order" (or  none  at  all)  will
       appear  in the help text in the same order as their "option" keywords were executed. If it is false, they
       will appear in alphabetical order instead.

   desc
       Default: none.

       A short description of the command, to be shown at the top of the manual page,  and  in  the  listing  of
       subcommands if this command is a subcommand.

   description_pod
       Default: none.

       A description, of any length, in POD format, to be included as the "DESCRIPTION" section of the command's
       manual page.

   extra_pod
       Default: none.

       Arbitrary extra POD to be included between the "DESCRIPTION" and "OPTIONS" sections of the manual page.

   getopt_options
       Default: "['require_order']".

       Contains  a  list  of  options  to  control  option  parsing  behavior (see "Configuring Getopt::Long" in
       Getopt::Long). Note, however, that many of these are not helpful with Osprey, and  that  using  "permute"
       will likely break subcommands entirely. MooX::Options calls this parameter "flavour".

   prefer_commandline
       Default: true.

       If  true,  command-line  options  override  key/value  pairs  passed to "new_with_options". If false, the
       reverse is true.

   preserve_argv
       Default: false.

       If true, the @ARGV array will be localized for the duration of "new_with_options", and will  be  left  in
       the  same  state  after  option  parsing  as it was before. If false, the @ARGV array will be modified by
       option parsing, removing any  recognized  options,  values,  and  subcommands,  and  leaving  behind  any
       positional parameters or anything after and including a "--" separator.

   usage_string
       Default: "USAGE: $program_name %o"

       Provides  the  header  of  the usage message printed in response to the "-h" option or an error in option
       processing. The format of the string is described in "$usage_desc" in Getopt::Long::Descriptive.

   on_demand
       Default: false

       If set to a true value, the commands' modules won't be loaded at compile time,  but  if  the  command  is
       invoked.  This  is  useful  for  minimizing  compile time if the application has a lot of commands or the
       commands are on the heavy side. Note that enabling the feature may interfere with the ability to  fatpack
       the application.

OPTION PARAMETERS

   doc
       Default: None.

       Documentation  for  the option, used in "--help" output. For best results, should be no more than a short
       paragraph.

   format
       Default: None (i.e. boolean).

       The format of the option argument, same as Getopt::Long. An option with  no  format  is  a  boolean,  not
       taking an additional argument. Other formats are:

       s   string

       i   decimal integer

       o   integer (supports "0x" for hex, "0b" for binary, and 0 for octal).

       f   floating-point number

   format_doc
       Default: depends on "format".

       Describes  the  type  of  an  option's  argument. For example, if the string option "copy-to" specifies a
       hostname, you can give it "format_doc => "hostname"" and it will display as "--copy-to hostname"  in  the
       help text, instead of "--copy-to string".

   hidden
       Default: false.

       A "hidden" option will be recognized, but not listed in automatically generated documentation.

   negatable
       Default: false.

       Adds  the  "--no-"  version  of  the  option,  which  sets  it  to  a  false value.  Equivalent to "!" in
       Getopt::Long.

   option
       Default: Same as the attribute name, with underscores replaced by hyphens.

       Allows the command-line option for an attribute to differ from the  attribute  name  --  like  "init_arg"
       except for the commandline.

   long_doc
       Default: none.

       Long  documentation  of  the option for the manual page. This is POD, so POD formatting is available, and
       paragraphs need to be separated by "\n\n". If not provided, the short documentation will be used instead.

   order
       Default: None.

       Allows controlling the order that options are listed in the help text. Options without an order attribute
       are sorted by the order their "option"  statements  are  executed,  if  "added_order"  is  true,  and  by
       alphabetical order otherwise.  They are placed as though they had order 9999, so use small values to sort
       before automaticall-sorted options, and values of 10000 and up to sort at the end.

   repeatable
       Default: false.

       Allows  an  option to be specified more than once. When used on a "boolean" option with no "format", each
       appearace of the option will increment the value by 1 (equivalent to "+" in Getopt::Long. When used on an
       option with arguments, produces an arrayref, one value per appearance of the option.

   required
       Default: false.

       This is a Moo/Moose feature honored by Osprey. A "required" attribute must be passed on  the  commandline
       unless it's passed to the constructor. Generated documentation will show the option as non-optional.

   short
       Default: None.

       Gives an option a single-character "short" form, e.g. "-v" for "--verbose".

   spacer_before
       Default: false.

       Causes a blank line to appear before this option in help output.

   spacer_after
       Default: false.

       Causes a blank line to appear after this option in help output.

SUBCOMMANDS

       An  Osprey  command  can  have  subcommands  with  their  own  options, documentation, etc., allowing for
       complicated applications under the roof of a single command.  Osprey will parse the options  for  all  of
       the  commands  in  the chain, and construct them in top-to-bottom order, with each subcommand receiving a
       reference to its parent.

   Subcommand Classes
       A subcommand can be another class, which also uses "CLI::Osprey". For example:

           package MyApp;
           use Moo;
           use CLI::Osprey;

           option verbose => (
               is => 'ro',
               short => 'v',
           );

           subcommand frobnicate => 'MyApp::Frobnicate';

           package MyApp::Frobnicate;
           use Moo;
           use CLI::Osprey;

           option target => (
               is => 'ro',
               format => 's',
           );

           sub run {
               my ($self) = @_;
               if ($self->parent_command->verbose) {
                   say "Be dangerous, and unpredictable... and make a lot of noise.";
               }
               $self->do_something_with($self->target);
           }

   Inline Subcommands
       A subcommand can also be specified as a coderef, for when  a  separate  class  would  be  excessive.  For
       example:

           package Greet;
           use Moo;
           use CLI::Osprey;

           option target => (
               is => 'ro',
               default => "world",
           );

           subcommand hello => sub {
               my ($self, $parent) = @_;
               say "Hello ", $parent->target;
           };

           subcommand goodbye => sub {
               my ($self, $parent) = @_;
               say "Goodbye ", $parent->target;
           };

       which  can  be  invoked  as  "greet  --target  world  hello".  Inline  subcommands  are implemented using
       CLI::Osprey::InlineSubcommand.

THANKS

       This module is based heavily on code from MooX::Options and takes strong inspiration from  MooX::Cmd  and
       MooX::Options::Actions. Thanks to celogeek, Jens Reshack, Getty, Tom Bloor, and all contributors to those
       modules. Thanks to mst for prodding me to do this. Thanks Grinnz for helping me update my dzillage.

AUTHOR

       Andrew Rodland <arodland@cpan.org>

COPYRIGHT AND LICENSE

       This software is copyright (c) 2020 by Andrew Rodland.

       This  is  free  software;  you  can  redistribute  it and/or modify it under the same terms as the Perl 5
       programming language system itself.

perl v5.32.1                                       2021-10-21                                   CLI::Osprey(3pm)