Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I'm trying to create a signature_for an import method that should be called like:

MyPackage->import(qw(symbol1 symbol2 symbol3));

I need to validate that: It's a proper method call (class name first) Followed by at least one non-empty string argument But I want the arguments to remain as individual scalars in @_, not get wrapped into an arrayref. Every approach I've tried with slurpy ends up forcing the string arguments into an arrayref:

use Type::Params qw( signature_for ); use Types::Standard qw( slurpy Any ); signature_for import => ( method => 1, pos => [ slurpy Any ], ); sub import { warn "Args: ", join(", ", map { ref($_) || $_ } @_), "\n"; # Shows: Args: MyPackage, ARRAY(0x...) }

Is there a way to make signature_for validate the method signature but leave the variable argument list as individual scalars in @_? Or is Type::Params fundamentally designed around restructuring arguments into containers?

Currently using Params::Validate which works fine, but curious if Type::Params can handle this use case.

  • Comment on Type::Params signature_for - can it handle method + variable string args without arrayref wrapping?
  • Select or Download Code

Replies are listed 'Best First'.
Re: Type::Params signature_for - can it handle method + variable string args without arrayref wrapping?
by LanX (Saint) on Sep 14, 2025 at 10:30 UTC
    I never used these modules, but do I understand you right in classic Perl terms?

    You want kind of¹ a method prototype with three scalars where the first is mandatory and exactly two more are optional?

    sub import($;$$)

    But since ->method calls don't allow classical prototypes you need those modules to check your input at run-time instead of compile-time?

    and you were able to achieve your goal with?

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    see Wikisyntax for the Monastery

    edit (after some server timeouts)

    ¹) I'm aware that here are dragons, it's an incomplete analogy. This prototype would enforce scalar context on each argument symbol, hence import(@two_args) wouldn't do what you wanted, even if it was supported with method calls Class->import()

    update
  • FWIW: The author of the Type(s):: modules tobyink is a semi-regular here, if you don't get a reply soon, my bet is that he will show up sooner or later.