NAME

    Acme::Signature::Arity - provides reliable, production-ready signature
    introspection

DESCRIPTION

    You'll know if you need this.

    If you're just curious, perhaps start with
    https://www.nntp.perl.org/group/perl.perl5.porters/2021/11/msg262009.html.

    No part of this is expected to work in any way when given a sub that
    has a prototype. There are other tools for those: Sub::Util.

    For subs that don't have a prototype, this is also not expected to
    work. It might help demonstrate where to look if you wanted to write
    something proper, though.

Exported functions

 arity

    Returns the UNOP_aux details for the first opcode for a coderef CV. If
    that code uses signatures, this might give you some internal details
    which mean something about the expected parameters.

    Expected return information, as a list:

      * number of required scalar parameters

      * number of optional scalar parameters (probably because there are
      defaults)

      * a character representing the slurping behaviour, might be '@' or
      '%', or nothing (undef?) if it's just a fixed list of scalar
      parameters

    This can also throw exceptions. That should only happen if you give it
    something that isn't a coderef, or if internals change enough that the
    entirely-unjustified assumptions made by this module are somehow no
    longer valid. Maybe they never were in the first place.

 max_arity

    Takes a coderef, returns a number or undef.

    If the code uses signatures, this tells you how many parameters you
    could pass when calling before it complains - undef means unlimited.

    Should also work when there are no signatures, just gives undef again.

 min_arity

    Takes a coderef, returns a number or undef.

    If the code uses signatures, this tells you how many parameters you
    need to pass when calling - 0 means that no parameters are required.

    Should also work when there are no signatures, returning 0 in that
    case.

 coderef_ignoring_extra

    Given a coderef, returns a coderef (either the original or wrapped)
    which won't complain if you try to pass more parameters than it was
    expecting.

    This is intended for library authors in situations like this:

     $useful_library->each(sub ($item) { say "item here: $item" });

    where you later want to add optional new parameters, and don't trust
    your users to include the mandatory , @ signature definition that
    indicates excess parameters can be dropped.

    Usage - let's say your first library version looked like this:

     sub each ($self, $callback) {
      my $code = $callback;
      for my $item ($self->{items}->@*) {
       $code->($item);
      }
     }

    and you later want to pass the index as an extra parameter, without
    breaking existing code that assumed there would only ever be one
    callback parameter...

     sub each ($self, $callback) {
      my $code = coderef_ignoring_extra($callback);
      for my $idx (0..$#{$self->{items}}) {
       $code->($self->{items}{$idx}, $idx);
      }
     }

    Your library is now at least somewhat backwards-compatible, without
    sacrificing too many signature-related arity checking features: code
    expecting the new version will still complain if required parameters
    are not provided.

AUTHOR

    TEAM@cpan.org

WARRANTY

    None, it's an Acme module, you shouldn't even be reading this.