NAME
    Getopt::Type::Tiny - Clean Getopt::Long wrapper with Type::Tiny support

VERSION
    version 0.03

SYNOPSIS
        use Getopt::Type::Tiny qw(get_opts Str Int);
        my %opts = get_opts(
            foo => { isa => Str },
            bar => { isa => Int, default => 42 },
            'verbose|v', # defaults to Bool
        );
    
        # %opts now contains the parsed options:
        # (
        #    foo     => 'value of foo',
        #    bar     => 42,
        #    verbose => 1,
        # )

DESCRIPTION
    This module is a thin wrapper around Getopt::Long that adds support for
    Type::Tiny type constraints. It is intended to be a clean and simple way
    to parse command line options with type constraints.

FUNCTIONS
  get_opts
        my %opts = get_opts(
            foo => { isa => Str },
            bar => { isa => Int, default => 42 },
            'verbose|v', # defaults to Bool
        );

    Parses the command line options and returns a hash of the parsed
    options. The arguments to "get_opts" are a list of option
    specifications.

OPTION SPECIFICATIONS
    Option specifications are passed to "get_opts" as a list of key/value
    pairs. If no option spec is passed, the option is assumed to be a
    boolean option:

        my %options = get_opts( qw/
          dryrun
          enabled
          verbose
        / );

    isa The "isa" key specifies the type constraint for the option. This can
        be any Types::Standard, Types::Common::Numeric, or
        Types::Common::String type. If more complex types are needed, you
        can create your own type constraints with Type::Tiny.

    coerce
        The "coerce" key enables type coercions, if the type indicated by
        "isa" supports coercions.

    default
        The "default" key specifies the default value for the option. If the
        option is not present on the command line, this value will be used.

    rename
        The "rename" key specifies a new name for the option. The value of
        the option will be stored in the hash under this new name.

    required
        The "required" key specifies that the option is required. If the
        option is not present on the command line, an error will be thrown.

HELP OPTIONS
    By default, "get_opts" will add a "--help|?" and "man" options that use
    Pod::Usage to display the usage message and exit. The "--help" and "-?"
    options will display a brief usage message and exit. The "--man" option
    will display the full documentation and exit.

MULTI-VALUE OPTIONS
    Multi-value options (arrays and hashes) are automatically detected from
    "ArrayRef" and "HashRef" types:

        my %opts = get_opts(
            servers => { isa => ArrayRef[Str] },    # --servers=a --servers=b
            config  => { isa => HashRef[Int] },     # --config=k1=1 --config=k2=2
        );

  Supported Types
    The following type mappings are supported:

        ArrayRef[Str]  => =s@    ArrayRef[Int]  => =i@    ArrayRef[Num]  => =f@
        HashRef[Str]   => =s%    HashRef[Int]   => =i%    HashRef[Num]   => =f%

    Subtypes are also supported (e.g., "ArrayRef[PositiveInt]" maps to
    "=i@"). "ArrayRef[Any]" and "HashRef[Any]" map to string modifiers.

  Auto-Defaults
    "ArrayRef" types default to "[]" and "HashRef" types default to "{}"
    when no default is specified. You can override this with an explicit
    "default" or use "required => 1".

  Explicit Syntax
    You can still use explicit Getopt::Long syntax if needed:

        'servers=s@' => { isa => ArrayRef[Str] }

    If the explicit syntax differs from what would be inferred, a warning is
    issued. Use "nowarn => 1" to suppress it:

        'servers=s@' => { isa => ArrayRef[Int], nowarn => 1 }

AUTHOR
    Curtis "Ovid" Poe <curtis.poe@gmail.com>

COPYRIGHT AND LICENSE
    This software is Copyright (c) 2025 by Curtis "Ovid" Poe.

    This is free software, licensed under:

      The Artistic License 2.0 (GPL Compatible)

