perldoc > Type::Params

NAME
    Type::Params - sub signature validation using Type::Tiny type constraints and coercions

SYNOPSIS
     use v5.20;
     use strict;
     use warnings;
     use experimental 'signatures';

     package Horse {
       use Moo;
       use Types::Standard qw( Object );
       use Type::Params -sigs;
       use namespace::autoclean;

       ...;   # define attributes, etc

       signature_for add_child => (
         method     => 1,
         positional => [ Object ],
       );

       sub add_child ( $self, $child ) {

         push @{ $self->children }, $child;

         return $self;
       }
     }

     package main;

     my $boldruler = Horse->new;

     $boldruler->add_child( Horse->new );

     $boldruler->add_child( 123 );   # dies (123 is not an Object!)

STATUS
    This module is covered by the Type-Tiny stability policy.

DESCRIPTION
    This documents the details of the Type::Params package. Type::Tiny::Manual is a better starting
    place if you're new.

    Type::Params uses Type::Tiny constraints to validate the parameters to a sub. It takes the
    slightly unorthodox approach of separating validation into two stages:

    1.  Compiling the parameter specification into a coderef; then

    2.  Using the coderef to validate parameters.

    The first stage is slow (it might take a couple of milliseconds), but you only need to do it the
    first time the sub is called. The second stage is fast; according to my benchmarks faster even
    than the XS version of Params::Validate.

MODERN API
    The modern API can be exported using:

     use Type::Params -sigs;

    Or:

     use Type::Params -v2;

    Or by requesting functions by name:

     use Type::Params qw( signature signature_for );

  signature( %spec )
    The "signature" function takes a specification for your function's signature and returns a
    coderef. You then call the coderef in list context, passing @_ to it. The coderef will check,
    coerce, and apply other procedures to the values, and return the tidied values, or die with an
    error.

    The usual way of using it is:

     sub your_function {
       state $signature = signature( ... );
       my ( $arg1, $arg2, $arg3 ) = $signature->( @_ );

       ...;
     }

    Perl allows a slightly archaic way of calling coderefs without using parentheses, which may be
    slightly faster at the cost of being more obscure:

     sub your_function {
       state $signature = signature( ... );
       my ( $arg1, $arg2, $arg3 ) = &$signature;

       ...;
     }

    If you need to support Perl 5.8, which didn't have the "state" keyword:

     my $__your_function_sig;
     sub your_function {
       $__your_function_sig ||= signature( ... );
       my ( $arg1, $arg2, $arg3 ) = $__your_function_sig->( @_ );

       ...;
     }

    One important thing to note is how the signature is only compiled into a coderef the first time
    your function gets called, and thereafter will be reused.

   Signature Specification Options
    The signature specification is a hash which must contain either a "positional", "named", or
    "multiple" key indicating whether your function takes positional parameters, named parameters,
    or supports multiple calling conventions, but may also include other options.

   "positional" ArrayRef
    This is conceptually a list of type constraints, one for each positional parameter. For example,
    a signature for a function which accepts two integers:

     signature( positional => [ Int, Int ] )

    However, each type constraint is optionally followed by a hashref of options which affect that
    parameter. For example:

     signature( positional => [
       Int, { default => 40 },
       Int, { default =>  2 },
     ] )

    Type constraints can instead be given as strings, which will be looked up using "dwim_type" from
    Type::Utils.

     signature( positional => [
       'Int', { default => 40 },
       'Int', { default =>  2 },
     ] )

    See the section below for more information on parameter options.

    Optional parameters must follow required parameters, and can be specified using either the
    Optional parameterizable type constraint, the "optional" parameter option, or by providing a
    default.

     signature( positional => [
       Optional[Int],
       Int, { optional => !!1 },
       Int, { default  => 42 },
     ] )

    A single slurpy parameter may be provided at the end, using the Slurpy parameterizable type
    constraint, or the "slurpy" parameter option:

     signature( positional => [
       Int,
       Slurpy[ ArrayRef[Int] ],
     ] )

     signature( positional => [
       Int,
       ArrayRef[Int], { slurpy => !!1 },
     ] )

    The "positional" option can also be abbreviated to "pos".

    So "signature( pos => [...] )" can be used instead of the longer "signature( positional => [...]
    )".

    If a signature uses positional parameters, the values are returned by the coderef as a list:

     sub add_numbers {
       state $sig = signature( positional => [ Num, Num ] );
       my ( $num1, $num2 ) = $sig->( @_ );

       return $num1 + $num2;
     }

     say add_numbers( 2, 3 );   # says 5

   "named" ArrayRef
    This is conceptually a list of pairs of names and type constraints, one name+type pair for each
    positional parameter. For example, a signature for a function which accepts two integers:

     signature( named => [ foo => Int, bar => Int ] )

    However, each type constraint is optionally followed by a hashref of options which affect that
    parameter. For example:

     signature( named => [
       foo => Int, { default => 40 },
       bar => Int, { default =>  2 },
     ] )

    Type constraints can instead be given as strings, which will be looked up using "dwim_type" from
    Type::Utils.

     signature( named => [
       foo => 'Int', { default => 40 },
       bar => 'Int', { default =>  2 },
     ] )

    Optional and slurpy parameters are allowed, but unlike positional parameters, they do not need
    to be at the end.

    See the section below for more information on parameter options.

    If a signature uses named parameters, the values are returned by the coderef as an object:

     sub add_numbers {
       state $sig = signature( named => [ num1 => Num, num2 => Num ] );
       my ( $arg ) = $sig->( @_ );

       return $arg->num1 + $arg->num2;
     }

     say add_numbers(   num1 => 2, num2 => 3   );   # says 5
     say add_numbers( { num1 => 2, num2 => 3 } );   # also says 5

   "named_to_list" ArrayRef|Bool
    The "named_to_list" option is ignored for signatures using positional parameters, but for
    signatures using named parameters, allows them to be returned in a list instead of as an object:

     sub add_numbers {
       state $sig = signature(
         named         => [ num1 => Num, num2 => Num ],
         named_to_list => !!1,
       );
       my ( $num1, $num2 ) = $sig->( @_ );

       return $num1 + $num2;
     }

     say add_numbers(   num1 => 2, num2 => 3   );   # says 5
     say add_numbers( { num1 => 2, num2 => 3 } );   # also says 5

    You can think of "add_numbers" above as a function which takes named parameters from the
    outside, but receives positional parameters on the inside.

    You can use an arrayref to specify the order the paramaters will be returned in. (By default
    they are returned in the order they were defined in.)

     sub add_numbers {
       state $sig = signature(
         named         => [ num1 => Num, num2 => Num ],
         named_to_list => [ qw( num2 num1 ) ],
       );
       my ( $num2, $num1 ) = $sig->( @_ );

       return $num1 + $num2;
     }

   "head" Int|ArrayRef
    "head" provides an additional list of non-optional, positional parameters at the start of @_.
    This is often used for method calls. For example, if you wish to define a signature for:

     $object->my_method( foo => 123, bar => 456 );

    You could write it as this:

     sub my_method {
       state $signature = signature(
         head    => [ Object ],
         named   => [ foo => Optional[Int], bar => Optional[Int] ],
       );
       my ( $self, $arg ) = $signature->( @_ );

       ...;
     }

    If "head" is set as a number instead of an arrayref, it is the number of additional arguments at
    the start:

     sub my_method {
       state $signature = signature(
         head    => 1,
         named   => [ foo => Optional[Int], bar => Optional[Int] ],
       );
       my ( $self, $arg ) = $signature->( @_ );

       ...;
    }

    In this case, no type checking is performed on those additional arguments; it is just checked
    that they exist.

   "tail" Int|ArrayRef
    A "tail" is like a "head" except that it is for arguments at the *end* of @_.

     sub my_method {
       state $signature = signature(
         head    => [ Object ],
         named   => [ foo => Optional[Int], bar => Optional[Int] ],
         tail    => [ CodeRef ],
       );
       my ( $self, $arg, $callback ) = $signature->( @_ );

       ...;
     }

     $object->my_method( foo => 123, bar => 456, sub { ... } );

   "method" Bool|TypeTiny
    While "head" can be used for method signatures, a more declarative way is to set "method => 1".

    If you wish to be specific that this is an object method, intended to be called on blessed
    objects only, then you may use "method => Object", using the Object type from Types::Standard.
    If you wish to specify that it's a class method, then use "method => Str", using the Str type
    from Types::Standard. ("method => ClassName" is perhaps clearer, but it's a slower check.)

     sub my_method {
       state $signature = signature(
         method  => 1,
         named   => [ foo => Optional[Int], bar => Optional[Int] ],
       );
       my ( $self, $arg ) = $signature->( @_ );

       ...;
     }

    If "method" is true (or a type constraint) then any parameter defaults which are coderefs will
    be called as methods.

   "description" Str
    This is the description of the coderef that will show up in stack traces. It defaults to
    "parameter validation for X" where X is the caller sub name. Usually the default will be fine.

   "package" Str
    The package of the sub whose paramaters we're supposed to be checking. As well as showing up in
    stack traces, it's used by "dwim_type" if you provide any type constraints as strings.

    The default is probably fine, but if you're wrapping "signature" so that you can check
    signatures on behalf of another package, you may need to provide it.

   "subname" Str
    The name of the sub whose paramaters we're supposed to be checking.

    The default is probably fine, but if you're wrapping "signature" so that you can check
    signatures on behalf of another package, you may need to provide it.

   "caller_level" Int
    If you're wrapping "signature" so that you can check signatures on behalf of another package,
    then setting "caller_level" to 1 (or more, depending on the level of wrapping!) may be an
    alternative to manually setting the "package" and "subname".

   "on_die" Maybe[CodeRef]
    Usually when your coderef hits an error, it will throw an exception, which is a blessed
    Error::TypeTiny object.

    If you provide an "on_die" coderef, then instead the Error::TypeTiny object will be passed to
    it. If the "on_die" coderef returns something, then whatever it returns will be returned as your
    signature's parameters.

     sub add_numbers {
       state $sig = signature(
         positional => [ Num, Num ],
         on_die     => sub {
           my $error = shift;
           print "Existential crisis: $error\n";
           exit( 1 );
         },
       );
       my ( $num1, $num2 ) = $sig->( @_ );

       return $num1 + $num2;
     }

     say add_numbers();   # has an existential crisis

    This is probably not very useful.

   "goto_next" Bool|CodeLike
    This can be used for chaining coderefs. If you understand "on_die", it's more like an "on_live".

     sub add_numbers {
       state $sig = signature(
         positional => [ Num, Num ],
         goto_next  => sub {
           my ( $num1, $num2 ) = @_;

           return $num1 + $num2;
         },
       );

       my $sum = $sig->( @_ );
       return $sum;
     }

     say add_numbers( 2, 3 );   # says 5

    If set to a true boolean instead of a coderef, has a slightly different behaviour:

     sub add_numbers {
       state $sig = signature(
         positional => [ Num, Num ],
         goto_next  => !!1,
       );

       my $sum = $sig->(
         sub { return $_[0] + $_[1] },
         @_,
       );
       return $sum;
     }

     say add_numbers( 2, 3 );   # says 5

    This looks strange. Why would this be useful? Well, it works nicely with Moose's "around"
    keyword.

     sub add_numbers {
       return $_[1] + $_[2];
     }

     around add_numbers => signature(
       method     => !!1,
       positional => [ Num, Num ],
       goto_next  => !!1,
       package    => __PACKAGE__,
       subname    => 'add_numbers',
     );

     say __PACKAGE__->add_numbers( 2, 3 );   # says 5

    Note the way "around" works in Moose is that it expects a wrapper coderef as its final argument.
    That wrapper coderef then expects to be given a reference to the original function as its first
    parameter.

    This can allow, for example, a role to provide a signature wrapping a method defined in a class.

    This is kind of complex, and you're unlikely to use it, but it's been proven useful for tools
    that integrate Type::Params with Moose-like method modifiers.

   "strictness" Bool|Str
    If you set "strictness" to a false value (0, undef, or the empty string), then certain signature
    checks will simply never be done. The initial check that there's the correct number of
    parameters, plus type checks on parameters which don't coerce can be skipped.

    If you set it to a true boolean (i.e. 1) or do not set it at all, then these checks will always
    be done.

    Alternatively, it may be set to the quoted fully-qualified name of a Perl global variable or a
    constant, and that will be compiled into the coderef as a condition to enable strict checks.

     state $signature = signature(
       strictness => '$::CHECK_TYPES',
       positional => [ Int, ArrayRef ],
     );

     # Type checks are skipped
     {
       local $::CHECK_TYPES = 0;
       my ( $number, $list ) = $signature->( {}, {} );
     }

     # Type checks are performed
     {
       local $::CHECK_TYPES = 1;
       my ( $number, $list ) = $signature->( {}, {} );
     }

    A recommended use of this is with Devel::StrictMode.

     use Devel::StrictMode qw( STRICT );

     state $signature = signature(
       strictness => STRICT,
       positional => [ Int, ArrayRef ],
     );

   "multiple" ArrayRef
    This option allows your signature to support multiple calling conventions. Each entry in the
    array is an alternative signature, as a hashref:

     state $signature = signature(
       multiple => [
         {
           positional => [ ArrayRef, Int ],
         },
         {
           named      => [ array => ArrayRef, index => Int ],
           named_to_list => 1,
         },
       ],
     );

    That signature will allow your function to be called as:

     your_function( $arr, $ix )
     your_function( array => $arr, index => $ix )
     your_function( { array => $arr, index => $ix } )

    Sometimes the alternatives will return the parameters in a different order:

     state $signature = signature(
       multiple => [
         { positional => [ ArrayRef, Int ] },
         { positional => [ Int, ArrayRef ] },
       ],
     );
     my ( $xxx, $yyy ) = $signature->( @_ );

    So how does your sub know whether $xxx or $yyy is the arrayref? One option is to use the
    "${^_TYPE_PARAMS_MULTISIG}" global variable which will be set to the index of the signature
    which was used:

     my @results = $signature->( @_ );
     my ( $arr, $ix ) = ${^_TYPE_PARAMS_MULTISIG} == 1
       ? reverse( @results )
       : @results;

    A neater solution is to use a "goto_next" coderef to re-order alternative signature results into
    your preferred order:

     state $signature = signature(
       multiple => [
         { positional => [ ArrayRef, Int ] },
         { positional => [ Int, ArrayRef ], goto_next => sub { reverse @_ } },
       ],
     );
     my ( $arr, $ix ) = $signature->( @_ );

    While conceptally "multiple" is an arrayref of hashrefs, it is also possible to use arrayrefs in
    the arrayref.

     multiple => [
       [ ArrayRef, Int ],
       [ Int, ArrayRef ],
     ]

    When an arrayref is used like that, it is a shortcut for a positional signature.

    Coderefs may additionally be used:

     state $signature = signature(
       multiple => [
         [ ArrayRef, Int ],
         { positional => [ Int, ArrayRef ], goto_next => sub { reverse @_ } },
         sub { ... },
         sub { ... },
       ],
     );

    The coderefs should be subs which return a list of parameters if they succeed and throw an
    exception if they fail.

    The following signatures are equivalent:

     state $sig_1 = signature(
       multiple => [
         { method => 1, positional => [ ArrayRef, Int ] },
         { method => 1, positional => [ Int, ArrayRef ] },
       ],
     );

     state $sig_2 = signature(
       method   => 1,
       multiple => [
         { positional => [ ArrayRef, Int ] },
         { positional => [ Int, ArrayRef ] },
       ],
     );

    The "multiple" option can also be abbreviated to "multi".

    So "signature( multi => [...] )" can be used instead of the longer "signature( multiple => [...]
    )". Three whole keystrokes saved!

    (Note: in older releases of Type::Params, "${^_TYPE_PARAMS_MULTISIG}" was called
    "${^TYPE_PARAMS_MULTISIG}". The latter name is deprecated, and support for it will be removed in
    a future release of Type::Params.)

   "message" Str
    Only used by "multiple" signatures. The error message to throw when no signatures match.

   "want_source" Bool
    Instead of returning a coderef, return Perl source code string. Handy for debugging.

   "want_details" Bool
    Instead of returning a coderef, return a hashref of stuff including the coderef. This is mostly
    for people extending Type::Params and I won't go into too many details about what else this
    hashref contains.

   "bless" Bool|ClassName, "class" ClassName|ArrayRef, and "constructor" Str
    Named parameters are usually returned as a blessed object:

     sub add_numbers {
       state $sig = signature( named => [ num1 => Num, num2 => Num ] );
       my ( $arg ) = $sig->( @_ );

       return $arg->num1 + $arg->num2;
     }

    The class they are blessed into is one built on-the-fly by Type::Params. However, these three
    signature options allow you more control over that process.

    Firstly, if you set "bless => false" and do not set "class" or "constructor", then $arg will
    just be an unblessed hashref.

     sub add_numbers {
       state $sig = signature(
         named        => [ num1 => Num, num2 => Num ],
         bless        => !!0,
       );
       my ( $arg ) = $sig->( @_ );

       return $arg->{num1} + $arg->{num2};
     }

    This is a good speed boost, but having proper methods for each named parameter is a helpful way
    to catch misspelled names.

    If you wish to manually create a class instead of relying on Type::Params generating one
    on-the-fly, you can do this:

     package Params::For::AddNumbers {
       sub num1 { return $_[0]{num1} }
       sub num2 { return $_[0]{num2} }
       sub sum {
         my $self = shift;
         return $self->num1 + $self->num2;
       }
     }

     sub add_numbers {
       state $sig = signature(
         named        => [ num1 => Num, num2 => Num ],
         bless        => 'Params::For::AddNumbers',
       );
       my ( $arg ) = $sig->( @_ );

       return $arg->sum;
     }

    Note that "Params::For::AddNumbers" here doesn't include a "new" method because Type::Params
    will directly do "bless( $arg, $opts{bless} )".

    If you want Type::Params to use a proper constructor, you should use the "class" option instead:

     package Params::For::AddNumbers {
       use Moo;
       has [ 'num1', 'num2' ] => ( is => 'ro' );
       sub sum {
         my $self = shift;
         return $self->num1 + $self->num2;
       }
     }

     sub add_numbers {
       state $sig = signature(
         named        => [ num1 => Num, num2 => Num ],
         class        => 'Params::For::AddNumbers',
       );
       my ( $arg ) = $sig->( @_ );

       return $arg->sum;
     }

    If you wish to use a constructor named something other than "new", then use:

     state $sig = signature(
       named        => [ num1 => Num, num2 => Num ],
       class        => 'Params::For::AddNumbers',
       constructor  => 'new_from_hashref',
     );

    Or as a shortcut:

     state $sig = signature(
       named        => [ num1 => Num, num2 => Num ],
       class        => [ 'Params::For::AddNumbers', 'new_from_hashref' ],
     );

    It is doubtful you want to use any of these options, except "bless => false".

   Parameter Options
    In the parameter lists for the "positional" and "named" signature options, each parameter may be
    followed by a hashref of options specific to that parameter:

     signature(
       positional => [
         Int, \%options_for_first_parameter,
         Int, \%options_for_other_parameter,
       ],
       %more_options_for_signature,
     );

     signature(
       named => [
         foo => Int, \%options_for_foo,
         bar => Int, \%options_for_bar,
       ],
       %more_options_for_signature,
     );

    The following options are supported for parameters.

   "optional" Bool
    An option *called* optional!

    This makes a parameter optional:

     sub add_nums {
       state $sig = signature(
         positional => [
           Int,
           Int,
           Bool, { optional => !!1 },
         ],
       );

       my ( $num1, $num2, $debug ) = $sig->( @_ );

       my $sum = $num1 + $num2;
       warn "$sum = $num1 + $num2" if $debug;

       return $sum;
     }

     add_nums( 2, 3, 1 );   # prints warning
     add_nums( 2, 3, 0 );   # no warning
     add_nums( 2, 3    );   # no warning

    Types::Standard also provides a Optional parameterizable type which may be a neater way to do
    this:

     state $sig = signature(
       positional => [ Int, Int, Optional[Bool] ],
     );

    In signatures with positional parameters, any optional parameters must be defined *after*
    non-optional parameters. The "tail" option provides a workaround for required parameters at the
    end of @_.

    In signatures with named parameters, the order of optional and non-optional parameters is
    unimportant.

   "slurpy" Bool
    A signature may contain a single slurpy parameter, which mops up any other arguments the caller
    provides your function.

    In signatures with positional parameters, slurpy params must always have some kind of ArrayRef
    or HashRef type constraint, must always appear at the *end* of the list of positional
    parameters, and they work like this:

     sub add_nums {
       state $sig = signature(
         positional => [
           Num,
           ArrayRef[Num], { slurpy => !!1 },
         ],
       );
       my ( $first_num, $other_nums ) = $sig->( @_ );

       my $sum = $first_num;
       $sum += $_ for @$other_nums;

       return $sum;
     }

     say add_nums( 1 );            # says 1
     say add_nums( 1, 2 );         # says 3
     say add_nums( 1, 2, 3 );      # says 6
     say add_nums( 1, 2, 3, 4 );   # says 10

    In signatures with named parameters, slurpy params must always have some kind of HashRef type
    constraint, and they work like this:

     use builtin qw( true false );

     sub process_data {
       state $sig = signature(
         method => true,
         named  => [
           input   => FileHandle,
           output  => FileHandle,
           flags   => HashRef[Bool], { slurpy => true },
         ],
       );
       my ( $self, $arg ) = @_;
       warn "Beginning data processing" if $arg->flags->{debug};

       ...;
     }

     $widget->process_data(
       input  => \*STDIN,
       output => \*STDOUT,
       debug  => true,
     );

    The Slurpy type constraint from Types::Standard may be used as a shortcut to specify slurpy
    parameters:

     signature(
       positional => [ Num, Slurpy[ ArrayRef[Num] ] ],
     )

    The type Slurpy[Any] is handled specially and treated as a slurpy ArrayRef in signatures with
    positional parameters, and a slurpy HashRef in signatures with named parameters, but has some
    additional optimizations for speed.

   "default" CodeRef|ScalarRef|Ref|Str|Undef
    A default may be provided for a parameter.

     state $check = signature(
       positional => [
         Int,
         Int, { default => "666" },
         Int, { default => "999" },
       ],
     );

    Supported defaults are any strings (including numerical ones), "undef", and empty hashrefs and
    arrayrefs. Non-empty hashrefs and arrayrefs are *not allowed as defaults*.

    Alternatively, you may provide a coderef to generate a default value:

     state $check = signature(
       positional => [
         Int,
         Int, { default => sub { 6 * 111 } },
         Int, { default => sub { 9 * 111 } },
       ]
     );

    That coderef may generate any value, including non-empty arrayrefs and non-empty hashrefs. For
    undef, simple strings, numbers, and empty structures, avoiding using a coderef will make your
    parameter processing faster.

    Instead of a coderef, you can use a reference to a string of Perl source code:

     state $check = signature(
       positional => [
         Int,
         Int, { default => \ '6 * 111' },
         Int, { default => \ '9 * 111' },
       ],
     );

    Defaults *will* be validated against the type constraint, and potentially coerced.

    Any parameter with a default will automatically be optional.

    Note that having *any* defaults in a signature (even if they never end up getting used) can slow
    it down, as Type::Params will need to build a new array instead of just returning @_.

   "coerce" Bool
    Speaking of which, the "coerce" option allows you to indicate that a value should be coerced
    into the correct type:

     state $sig = signature(
       positional => [
         Int,
         Int,
         Bool, { coerce => true },
       ],
     );

    Setting "coerce" to false will disable coercion.

    If "coerce" is not specified, so is neither true nor false, then coercion will be enabled if the
    type constraint has a coercion, and disabled otherwise.

    Note that having *any* coercions in a signature (even if they never end up getting used) can
    slow it down, as Type::Params will need to build a new array instead of just returning @_.

   "clone" Bool
    If this is set to true, it will deep clone incoming values via "dclone" from Storable (a core
    module since Perl 5.7.3).

    In the below example, $arr is a reference to a *clone of* @numbers, so pushing additional
    numbers to it leaves @numbers unaffected.

     sub foo {
       state $check = signature(
         positional => [
           ArrayRef, { clone => 1 }
         ],
       );
       my ( $arr ) = &$check;

       push @$arr, 4, 5, 6;
     }

     my @numbers = ( 1, 2, 3 );
     foo( \@numbers );

     print "@numbers\n";  ## 1 2 3

    Note that cloning will significantly slow down your signature.

   "name" Str
    This overrides the name of a named parameter. I don't know why you would want to do that.

    The following signature has two parameters: "foo" and "bar". The name "fool" is completely
    ignored.

     signature(
       named => [
         fool   => Int, { name => 'foo' },
         bar    => Int,
       ],
     )

    You can, however, also name positional parameters, which don't usually have names.

     signature(
       positional => [
         Int, { name => 'foo' },
         Int, { name => 'bar' },
       ],
     )

    The names of positional parameters are not really *used* for anything at the moment, but may be
    incorporated into error messages or similar in the future.

   "getter" Str
    For signatures with named parameters, specifies the method name used to retrieve this
    parameter's value from the $arg object.

     sub process_data {
       state $sig = signature(
         method => true,
         named  => [
           input   => FileHandle,    { getter => 'in' },
           output  => FileHandle,    { getter => 'out' },
           flags   => HashRef[Bool], { slurpy => true },
         ],
       );
       my ( $self, $arg ) = @_;
       warn "Beginning data processing" if $arg->flags->{debug};

       my ( $in, $out ) = ( $arg->in, $arg->out );
       ...;
     }

     $widget->process_data(
       input  => \*STDIN,
       output => \*STDOUT,
       debug  => true,
     );

    Ignored by signatures with positional parameters.

   "predicate" Str
    The $arg object provided by signatures with named parameters will also include "has" methods for
    any optional arguments. For example:

     state $sig = signature(
       method => true,
       named  => [
         input   => Optional[ FileHandle ],
         output  => Optional[ FileHandle ],
         flags   => Slurpy[ HashRef[Bool] ],
       ],
     );
     my ( $self, $arg ) = $sig->( @_ );

     if ( $self->has_input and $self->has_output ) {
       ...;
     }

    Setting a "predicate" option allows you to choose a different name for this method.

    It is also possible to set a "predicate" for non-optional parameters, which don't normally get a
    "has" method.

    Ignored by signatures with positional parameters.

   "alias" Str|ArrayRef[Str]
    A list of alternative names for the parameter, or a single alternative name.

     sub add_numbers {
       state $sig = signature(
         named => [
           first_number   => Int, { alias => [ 'x' ] },
           second_number  => Int, { alias =>   'y'   },
         ],
       );
       my ( $arg ) = $sig->( @_ );

       return $arg->first_number + $arg->second_number;
     }

     say add_numbers( first_number => 40, second_number => 2 );  # 42
     say add_numbers( x            => 40, y             => 2 );  # 42
     say add_numbers( first_number => 40, y             => 2 );  # 42
     say add_numbers( first_number => 40, x => 1, y => 2 );      # dies!

    Ignored by signatures with positional parameters.

   "strictness" Bool|Str
    Overrides the signature option "strictness" on a per-parameter basis.

  "signature_for $function_name => ( %spec )"
    Like "signature", but instead of returning a coderef, wraps an existing function, so you don't
    need to deal with the mechanics of generating the signature at run-time, calling it, and
    extracting the returned values.

    The following three examples are roughly equivalent:

     sub add_nums {
       state $signature = signature(
         positional => [ Num, Num ],
       );
       my ( $x, $y ) = $signature->( @_ );

       return $x + $y;
     }

    Or:

     signature_for add_nums => (
       positional => [ Num, Num ],
     );

     sub add_nums {
       my ( $x, $y ) = @_;

       return $x + $y;
     }

    Or since Perl 5.20:

     signature_for add_nums => (
       positional => [ Num, Num ],
     );

     sub add_nums ( $x, $y ) {
       return $x + $y;
     }

    The "signature_for" keyword turns "signature" inside-out.

    The same signature specification options are supported, with the exception of "want_source",
    "want_details", and "goto_next" which will not work. (If using the "multiple" option, then
    "goto_next" is still supported in the *nested* signatures.)

    If you are providing a signature for a sub in another package, then "signature_for
    "Some::Package::some_sub" => ( ... )" will work, as will "signature_for some_sub => ( package =>
    "Some::Package", ... )". If "method" is true, then "signature_for" will respect inheritance when
    determining which sub to wrap. "signature_for" will not be able to find lexical subs, so use
    "signature" within the sub instead.

    The "goto_next" option is what "signature_for" uses to "connect" the signature to the body of
    the sub, so do not use it unless you understand the consequences and want to override the normal
    behaviour.

    If the sub being wrapped cannot be found, then "signature_for" will usually throw an error. If
    you want it to "work" in this situation, use the "fallback" option. "fallback =>
    \&alternative_coderef_to_wrap" will instead wrap a different coderef if the original cannot be
    found. "fallback => 1" is a shortcut for "fallback => sub {}". An example where this might be
    useful is if you're adding signatures to methods which are inherited from a parent class, but
    you are not 100% confident will exist (perhaps dependent on the version of the parent class).

     signature_for add_nums => (
       positional => [ Num, Num ],
       fallback   => sub { $_[0] + $_[1] },
     );

    "signature_for( \@functions, %opts )" is a useful shortcut if you have multiple functions with
    the same signature.

     signature_for [ 'add_nums', 'subtract_nums' ] => (
       positional => [ Num, Num ],
     );

LEGACY API
    The following functions were the API prior to Type::Params v2. They are still supported, but
    their use is now discouraged.

    If you don't provide an import list at all, you will import "compile" and "compile_named":

     use Type::Params;

    This does the same:

      use Type::Params -v1;

    The following exports "compile", "compile_named", and "compile_named_oo":

     use Type::Params -compile;

    The following exports "wrap_subs" and "wrap_methods":

     use Type::Params -wrap;

  compile( @pos_params )
    Equivalent to "signature( positional => \@pos_params )".

    "compile( \%spec, @pos_params )" is equivalent to "signature( %spec, positional => \@pos_params
    )".

  compile_named( @named_params )
    Equivalent to "signature( bless => 0, named => \@named_params )".

    "compile_named( \%spec, @named_params )" is equivalent to "signature( bless => 0, %spec, named
    => \@named_params )".

  compile_named_oo( @named_params )
    Equivalent to "signature( bless => 1, named => \@named_params )".

    "compile_named_oo( \%spec, @named_params )" is equivalent to "signature( bless => 1, %spec,
    named => \@named_params )".

  "validate( \@args, @pos_params )"
    Equivalent to "signature( positional => \@pos_params )->( @args )".

    The "validate" function has *never* been recommended, and is not exported unless requested by
    name.

  "validate_named( \@args, @named_params )"
    Equivalent to "signature( bless => 0, named => \@named_params )->( @args )".

    The "validate_named" function has *never* been recommended, and is not exported unless requested
    by name.

  "wrap_subs( func1 => \@params1, func2 => \@params2, ... )"
    Equivalent to:

     signature_for func1 => ( positional => \@params1 );
     signature_for func2 => ( positional => \@params2 );

    One slight difference is that instead of arrayrefs, you can provide the output of one of the
    "compile" functions:

     wrap_subs( func1 => compile_named( @params1 ) );

    "wrap_subs" is not exported unless requested by name.

  "wrap_methods( func1 => \@params1, func2 => \@params2, ... )"
    Equivalent to:

     signature_for func1 => ( method => 1, positional => \@params1 );
     signature_for func2 => ( method => 1, positional => \@params2 );

    One slight difference is that instead of arrayrefs, you can provide the output of one of the
    "compile" functions:

      wrap_methods( func1 => compile_named( @params1 ) );

    "wrap_methods" is not exported unless requested by name.

  multisig( @alternatives )
    Equivalent to:

      signature( multiple => \@alternatives )

    "multisig( \%spec, @alternatives )" is equivalent to "signature( %spec, multiple =>
    \@alternatives )".

TYPE CONSTRAINTS
    Although Type::Params is not a real type library, it exports two type constraints. Their use is
    no longer recommended.

  Invocant
    Type::Params exports a type Invocant on request. This gives you a type constraint which accepts
    classnames *and* blessed objects.

     use Type::Params qw( compile Invocant );

     sub my_method {
       state $check = signature(
         method     => Invocant,
         positional => [ ArrayRef, Int ],
       );
       my ($self_or_class, $arr, $ix) = $check->(@_);

       return $arr->[ $ix ];
     }

    "Invocant" is not exported unless requested by name.

    Recommendation: use Defined from Types::Standard instead.

  ArgsObject
    Type::Params exports a parameterizable type constraint ArgsObject. It accepts the kinds of
    objects returned by signature checks for named parameters.

      package Foo {
        use Moo;
        use Type::Params 'ArgsObject';

        has args => (
          is  => 'ro',
          isa => ArgsObject['Bar::bar'],
        );
      }

      package Bar {
        use Types::Standard -types;
        use Type::Params 'signature';

        sub bar {
          state $check = signature(
            named => [
              xxx => Int,
              yyy => ArrayRef,
            ],
          );
          my ( $got ) = $check->( @_ );

          return 'Foo'->new( args => $got );
        }
      }

      Bar::bar( xxx => 42, yyy => [] );

    The parameter "Bar::bar" refers to the caller when the check is compiled, rather than when the
    parameters are checked.

    "ArgsObject" is not exported unless requested by name.

    Recommendation: use Object from Types::Standard instead.

ENVIRONMENT
    "PERL_TYPE_PARAMS_XS"
        Affects the building of accessors for $arg objects. If set to true, will use
        Class::XSAccessor. If set to false, will use pure Perl. If this environment variable does
        not exist, will use Class::XSAccessor.

        If Class::XSAccessor is not installed or is too old, pure Perl will always be used as a
        fallback.

BUGS
    Please report any bugs to <https://github.com/tobyink/p5-type-tiny/issues>.

SEE ALSO
    The Type::Tiny homepage <https://typetiny.toby.ink/>.

    Type::Tiny, Type::Coercion, Types::Standard.

AUTHOR
    Toby Inkster <tobyink AT cpan.org>.

COPYRIGHT AND LICENCE
    This software is copyright (c) 2013-2014, 2017-2023 by Toby Inkster.

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

DISCLAIMER OF WARRANTIES
    THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
    WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
    PURPOSE.

Type::Params □✕
NAME SYNOPSIS STATUS DESCRIPTION MODERN API LEGACY API TYPE CONSTRAINTS
Invocant ArgsObject
ENVIRONMENT BUGS SEE ALSO AUTHOR COPYRIGHT AND LICENCE DISCLAIMER OF WARRANTIES

Generated by phpman v4.11.2-19-g5bf0025 · Markdown · JSON · MCP Author: Che Dong Under GNU General Public License
2026-10-02 21:51 @216.73.216.55
CrawledBy Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
Valid XHTML 1.0 Transitional!Valid CSS!

^_top_^