NAME

MooseX::Getopt::Usage - Extend MooseX::Getopt with usage message generated from attribute meta.

VERSION

Version 0.07

SYNOPSIS

## In your class
package My::App;
use Moose;

with 'MooseX::Getopt::Usage';

has verbose => ( is => 'ro', isa => 'Bool', default => 0,
    documentation => qq{Say lots about what we are doing} );

has gumption => ( is => 'rw', isa => 'Int', default => 23,
    documentation => qq{How much gumption to apply} );

# ... rest of class

## In your script
#!/usr/bin/perl
use My::App;
my $app = My::App->new_with_options;

Can now get help,

$ synopsis.pl -?
Usage:
    synopsis.pl [OPTIONS]
Options:
    --help -? --usage - Bool. Display the usage message and exit
    --verbose         - Bool. Say lots about what we are doing
    --gumption        - Int. Default=23. How much gumption to apply

and trap errors with usage.

$ synopsis.pl --elbowgrease --gumption=Lots
Unknown option: elbowgrease
Value "Lots" invalid for option gumption (number expected)
Usage:
    synopsis.pl [OPTIONS]
Options:
    --help -? --usage - Bool. Display the usage message and exit
    --verbose         - Bool. Say lots about what we are doing
    --gumption        - Int. Default=23. How much gumption to apply

DESCRIPTION

Perl Moose Role that extends MooseX::Getopt to provide usage printing that inspects your classes meta information to build a (coloured) usage message including that meta information.

If stdout is a tty usage message is colourised. Setting the env var ANSI_COLORS_DISABLED will disable colour even on a tty.

Errors in command line option parsing will be displayed along with the usage, causing the program to exit with a non-zero status code when new_with_options is used.

ATTRIBUTES

help_flag

Indicates if any of -?, --help, or --usage where given in the command line args.

METHODS

getopt_usage( %args )

Generate the usage message and return or output to stdout and exit. Without exit arg returns the usage string, with an exit arg prints the usage to stdout and exits with the given exit code.

print $self->getopt_usage if $self->help_flag;

$self->getopt_usage( exit => 10, err => "Their all dead, Dave" );

Options are printed required first, then optional. These two sections get a heading unless headings arg or config is false.

%args can have any of the options from "CONFIGURATION", plus the following.

exit

If an exit arg is given and defined then this method will exit the program with that exit code after displaying usage to STDOUT.

err | error

Error message string to display before the usage. Will get the error highlight.

getopt_usage_config

Return a hash (ie a list) of config to override the defaults. Default returns empty list. See "CONFIGURATION" for details.

CONFIGURATION

The configuration used is the defaults, followed by the return from "getopt_usage_config", followed by any args passed direct to "getopt_usage". The easiest way to configure the usage message is to override "getopt_usage_config" in your class. e.g. to use a more compact layout.

use Moose;
with 'MooseX::Getopt::Usage';

sub getopt_usage_config {
   return (
       format   => "Usage: %c [OPTIONS]",
       headings => 0,
   );
}

Availiable config is:

format

String to format the top of the usage message. %c is substituted for the command name. Use %% for a literal %. Default:

format => "Usage:\n    %c [OPTIONS]",

attr_sort

Sub ref used to sort the attributes and hence the order they appear in the usage message. Default is the order the attributes are defined.

NB: the sort terms ($a and $b) are passed as the first two arguments, do not use $a and $b (you will get warnings). The arguments will be Moose::Meta::Attributes. e.g. to sort by name alphabetically:

attr_sort => sub { $_[0]->name cmp $_[1]->name }

headings

Whether to add headings of 'Options:' and 'Required:' to the list of options. Default is true.

colours | colors

Hash ref mapping highlight names to colours, given as strings to pass to Term::ANSIColor. Default looks like this:

colours   => {
    flag          => ['yellow'],
    heading       => ['bold'],
    command       => ['green'],
    type          => ['magenta'],
    default_value => ['cyan'],
    error         => ['red']
}

unexpand

Set $Text::Wrap::unexpand, see "OVERRIDES" in Text::Wrap.

tabstop

Set $Text::Wrap::tabstop, see "OVERRIDES" in Text::Wrap.

EXAMPLE

Put this is a file called hello.pl and make it executable.

#!/usr/bin/env perl
package Hello;
use Modern::Perl;
use Moose;

with 'MooseX::Getopt::Usage';

has verbose => ( is => 'ro', isa => 'Bool',
    documentation => qq{Say lots about what we do} );

has greet => ( is => 'ro', isa => 'Str', default => "World",
    documentation => qq{Who to say hello to.} );

has times => ( is => 'rw', isa => 'Int', required => 1,
    documentation => qq{How many times to say hello} );

sub run {
    my $self = shift;
    say "Printing message..." if $self->verbose;
    say "Hello " . $self->greet for (1..$self->times);
}

package main;
Hello->new_with_options->run;

Then call with any of these to get usage output.

$ ./hello.pl -?
$ ./hello.pl --help
$ ./hello.pl --usage

Which will look a bit like this, only in colour.

Usage:
    hello.pl [OPTIONS]
Required:
    --times           - Int. How many times to say hello
Options:
    --help -? --usage - Bool. Display the usage message and exit
    --verbose         - Bool. Say lots about what we do
    --greet           - Str. Default=World. Who to say hello to.

SEE ALSO

perl, Moose, MooseX::Getopt, Term::ANSIColor, Text::Wrap.

BUGS

All complex software has bugs lurking in it, and this module is no exception. Please report any bugs or feature requests via the github page at:

http://github.com/markpitchless/moosex-getopt-usage

SUPPORT

You can find documentation for this module with the perldoc command.

perldoc MooseX::Getopt::Usage

The source code and other information is hosted on github:

http://github.com/markpitchless/moosex-getopt-usage

AUTHOR

Mark Pitchless, <markpitchless at gmail.com>

ACKNOWLEDGEMENTS

COPYRIGHT & LICENSE

Copyright 2012 Mark Pitchless

This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.

See http://dev.perl.org/licenses/ for more information.