NAME
    Getopt::Again - Yet another attempt at a universal Getopt tool.

DESCRIPTION
    Getopt tool that takes short form "-abc" and/or long form "--alpha"
    options. Options may be boolen, or accept values. Values can be
    specified via "--foo val" or "--foo=val" forms. Can also use a regex to
    slurp up matching options. Ability to auto-generate usage and help
    strings for you when desired.

ANOTHER GETOPT TOOL!!!!
    Yeah... Sorry about that. Here is a relevant XKCD:
    <http://xkcd.com/927/>.

    I have not yet found a Getopt module that works the way I would like. It
    may exist, but the author is doing a poor job of reaching me and my
    searches have failed.

    I went a long time refusing to add yet more clutter to the Getopt
    namespace, but I am tired of writing custom parsing for options every
    time I write a script. So here it is, my way, and I don't care if nobody
    ever uses it, I won't force you.

SYNOPSYS
  SCRIPT
        use Getopt::Again enable_help => 1; # Default is 0

        opt_bools  qw/alpha beta/;  # Quickly define some boolean options
        opt_lists  qw/gamma zeta/;  # Quickly define some options that accept multiple args
        opt_params qw/foo bar/;     # Quickly define some options that accept a single arg
        opt_paths  qw/origin dest/; # Quickly define some options that take directory paths
        opt_files  qw/config/;      # Quickly define some options that take file paths

        # All arguments to opt_add are optional except the name.
        opt_add my_opt => (
            type        => 'string',           # Or 'bool', 'regex', 'path', 'file'
            list        => 1,                  # True to take multiple values
            default     => 'stuff',            # Default value
            example     => " 'a string'",      # Example value, for help/usage
            alias       => [ 'the_opt', 'm' ], # Alternate names
            process     => sub { ... },        # Can also be a validation regex
            description => "My option ..."     # For help/usage
            split_on    => ",",                # Split values (list only)
            regex       => qr/^foo-(.+)$/,     # Match options like this, use the capture for value
        );

        my $usage = opt_usage();
        my $help  = opt_help();

        # Get the options and args from @ARGV. @ARGV is not altered
        my (%opts, @args) = opt_parse(@ARGV);

  OOP
        use Getopt::Again();

        my $ga = Getopt::Again->new(enable_help => 1);

        $ga->add('my_opt' => (
            type        => 'string',           # Or 'bool', 'regex', 'path', 'file'
            list        => 1,                  # True to take multiple values
            default     => 'stuff',            # Default value
            example     => " 'a string'",      # Example value, for help/usage
            alias       => [ 'the_opt', 'm' ], # Alternate names
            process     => sub { ... },        # Can also be a validation regex
            description => "My option ..."     # For help/usage
            split_on    => ",",                # Split values (list only)
            regex       => qr/^foo-(.+)$/,     # Match options like this, use the capture for value
        ));

        my $usage = $ga->usage_string();
        my $help  = $ga->help_string();

        # Get the options and args from @ARGV, @ARGV is not altered
        my (%opts, @args) = $ga->parse(@ARGV);

PARSING RULES
    A single dash denotes 1-character options, so "-xyz" is seen as the x,
    y, and z options.
            command -xyz

            command -x -y -z

            command --xerxes --yolk --zebra

    The final option in a set of single dash options may have an argument.
            command -xf thing

            command -xyzf thing

    Double dash denotes long form "--foo" is seen as the 'foo' option.
            command --thing

    Options that accept arguments may take the "--opt=val" or "--opt val"
    forms.
            command --thing=val

            command --thing val

    Options that can have a list of values may specify a delimiter, and/or
    can be listed multiple times.
            command --thing x --thing y --thing z

            command --thing x,y,z

            command --thing x.y.z

    When it is not ambiguous, you may use the first character of the long
    form in a short form.
        These work:

            command --xerxes
            command -x

        This would not:

            command --xerxes
            command --xandu
            command -x # Nope! ambiguous (unless -x is defined directly)

    End of params is "--" as expected, nothing after this will be parsed,
    instead they are added to the list of arguments.
            command -xyz -- --this_is_not_an_opt --this_is_an_arg

EXPORTS
    $ga = opt_meta()
        Get the underlying Getopt::Again object.

    opt_bools(qw/awake alive/)
        Quickly define some boolean options.

    opt_lists(qw/friends family/)
        Quickly define some list options.

    opt_params(qw/name age/)
        Quickly define some options that take strings.

    opt_paths(qw/origin dest/)
        Quickly define some options that take paths (they must exist).

    opt_files(qw/input config/)
        Quickly define some options that take files (they must exist).

    opt_add(NAME, %OPTIONS)
        Add an option.

    $usage = opt_usage()
    opt_usage($set)
        Get or set the usage string (returns "$0 $string", do not include $0
        when setting).

    $help = opt_help()
        Get the help string.

    ($opts, $args) = opt_parse(...)
        Parse a parameters (@ARGV is the usual argument).

        An exception will be thrown if an unknown option is specified.

        $opts is a hashref, $args is an arrayref.

    opt_use_help()
        Enable the --help and -h options.

OPTION PROPERTIES
    type
        Values may be one of: 'string', 'bool', 'regex', 'file', 'path'.

        If none is specified it is guessed. Names with more than 1 character
        default to string, named with 1 character only default to bool.

    list
        True or false. When true the option will always be an arrayref
        containing 0 or more values.

    default
        Specify the default value when none was specified. For bools this
        gets normalized to true or false. For lists the default is a new
        empty array.

    example
        Example for documentation, usually an example value prefixed with
        either a space or equal sign:

            example => ' foo',

        or

            example => '=foo',

    process
        Post-processing on the value. If this is a regex than an exception
        will be thrown for any value that does not match.

        The value may also be a coderef. For the coderef $_ will be set to
        the value being processed. The value will also be passed in as the
        only argument. Whatever the coderef returns will replace the value,
        so this is a hook to allow you to modify the value.

    description
        Provide a long description of the option for the help string.

    split_on
        Specify a delimiter for list options.

    regex
        Specify a regex to be used to identify parameters. Use this if you
        want something like "enable-*" to be captured.

            list  => 1,
            regex => qr/^enable-(.*)$/,

        This will match all the following:

            --enable-food
            --enable-protection

        In these cases the value will be set to the first capture group, so
        in this case:

            [
                'food',
                'protection'
            ]

        If there is no capture $1, then the remaining string after the match
        $' will be used.

OBJECT METHODS
    $ga->opt_spec($name)
        Get the specification for an option.

    $ga->add($name => %properties)
        Add an option

    ($opts, $args) = $ga->parse(@ARGV)
        Parse a parameters (@ARGV is the usual argument).

        An exception will be thrown if an unknown option is specified.

        $opts is a hashref, $args is an arrayref.

    $ga->usage_string
        Get or set the usage string (returns "$0 $string", do not include $0
        when setting).

    $ga->help_string
        Get the help string

    $ga->enable_help
        Enable the help ("--help" and "-h") tools.

SEE ALSO
    Everything in the massive Getopt namespace.

    On second thought, don't, you do not have that much time.

AUTHORS
    Chad Granum exodist7@gmail.com

COPYRIGHT
    Copyright (C) 2014 Chad Granum

    Getopt-Again is free software; Standard perl license (GPL and Artistic).

    Getopt-Again is distributed in the hope that it will be useful, but
    WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the license for
    more details.

