NAME
    Declare::Opts - Simple and Sane Command Line Argument processing

DESCRIPTION
    Declare-Opts is a sane and declarative way to define and consume command
    line options. Any number of dashes can be used, it is not picky about
    -opt or --opt. You can use '-opt value' or '-opt=value', it will just
    work. Shortest unambiguous substring of any opt name can be used to
    specify the option.

WHY NOT GETOPT?
    The Getopt ecosystem is bloated. Type getopt into search.cpan.org and
    you will be given pages and pages of results. Normally this would be a
    good thing, the issue is that each package provides specialised
    functionality, and most cannot operate together.

    The Getopt ecosystem is also very crufty. Getopt is an old module that
    uses many outdated practices, and an even more outdated interface.
    Unfortunately this has been carried forward into the new getopt modules,
    possibly for compatability/familiarity reasons.

    Declare::Opts is a full on break from the Getopt ecosystem. Designed
    from scratch using modern practices and interface design.

SYNOPSIS
  DECLARATIVE
    Code:

        #!/usr/bin/env perl
        use Declare::Opts;

        # Define a simple opt, any value works:
        opt 'simple';

        # Define a boolean opt
        opt with_x => ( bool => 1 );

        # Define a list
        opt items => ( list => 1 );

        # Other Options
        opt complex => (
            alias       => $name_or_array_of_names,
            default     => $val_or_sub,
            check       => $bultin_regex_or_sub,
            transform   => sub { my $opt = shift; ...; return $opt },
            description => "This is a complex option",
        );

        # Get the (opts => descriptions) hash, useful for a help() function
        my $info = opt_info();

        #########################
        # Now process some opts #
        #########################

        my ( $args, $opts ) = parse_opts( @ARGV );

        # $args contains the items from @ARGV that are not specified opts (or their
        # values)
        # $opts is a hashref containing the opts and their values.

    Command Line:

        ./my_command.pl -simple simple_value -with_x --items "a,b, c"

    The shortest unambiguous string can be used for each parameter. For
    instance we only have one option defined above that starts with 's',
    that is 'simple':

        ./my_command.pl -s simple_value

  OBJECT ORIENTED
        require Declare::Opts;

        # Create
        my $opts = Declare::Opts->new( %opts );

        # Add an opt
        $opts->opt( $name, %config );

        # Get info
        my $info = $opts->info;

        # Parse some opts
        my ( $args_array, $opts_hash ) = $opts->parse( @ARGV );

META OBJECT
    When you import Declare::Opts a meta-object is created in your package.
    The meta object can be accessed via the OPTS_META() method/function.
    This object is an instance of Declare::Opts and can be manipulated just
    like any Declare::Opts object.

EXPORTS
    opt( $name, %config );
    opt name => ( %config );
        Define an option

    my $info = opt_info();
        Get a ( name => description ) hashref for use in help output.

    my ( $args, $opts ) = parse_opts( @OPTS );
        Parse some options. $list contains the options leftovers (those that
        do not start with '-'), $opts is a hashref containing the values of
        all the dashed opts.

METHODS
    $class->new( %opts );
        Create a new instance.

    my $class = $opts->class;
        If the object was created as a meta-object this will contain the
        class to which it applies. When created directly this will always be
        empty.

    $opts->opt( $name, %config );
        Define an option

    my $info = $opts->info();
        Get a ( name => description ) hashref for use in help output.

    my ( $args_array, $opts_hash ) = $opts->parse( @OPTS );
        Parse some options. $list contains the options leftovers (those that
        do not start with '-'), $opts is a hashref containing the values of
        all the dashed opts.

OPTION PROPERTIES
    alias => $name
    alias => [ $name1, $name2 ]
        Set aliases for the option.

    list => $true_or_false
        If true, the option can be provided on the command line any number
        of times, and comma seperated lists will be split for you.

    bool => $true_or_false
        If true, the option does not require a value and turns the option on
        or off. A value can be specified using the '--opt=VAL' format.
        However '--opt val' will not treat 'val' as the option value.

    default => $scalar
    default => sub { ... }
        Set the default value. If the opt is not specified on the command
        line this value will be used. If the value is not a simple scalar it
        must be wrapped in a code block.

    check => 'builtin'
    check => qr/.../
    check => sub { my $val = shift; ...; return $bool }
        Used to validate option values. Can be a coderef, a regexp, or one
        of these bultins:

            'number'    The value(s) must be numeric (only contains digit characters)
            'file'      The value(s) must be a file (uses -f check)
            'dir'       The value(s) must be a directory (-d check)

    transform => sub { my $orig = shift; ...; return $new }
        Function to transform the provided value into something else.
        Applies to eahc item of a list when list is true.

    description => $description_string
        Used to describe an option, useful for help() output.

AUTHORS
    Chad Granum exodist7@gmail.com

COPYRIGHT
    Copyright (C) 2012 Chad Granum

    Declare-Opts is free software; Standard perl licence.

    Declare-Opts 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.

