Firstly, I'm not planning on breaking compatibility with Type::Params. The new API would live under a different namespace, such as Type::Params2.
The API for Type::Params is currently:
use feature 'state';
use Type::Params qw( compile compile_named_oo );
use Types::Standard -types;
sub function_with_positional_parameters {
state $check = compile( ArrayRef, Int, Int );
my ( $list, $start, $end ) = $check->( @_ );
my @slice = @{$list}[ $start .. $end ];
return \@slice;
}
sub function_with_named_parameters {
state $check = compile_named_oo( list => ArrayRef, start => Int, end
+ => Int );
my ( $arg ) = $check->( @_ );
my @slice = @{$arg->list}[ $arg->start .. $arg->end ];
return \@slice;
}
Alternatively, there's:
use Type::Params qw( wrap_subs compile_named_oo );
use Types::Standard -types;
wrap_subs function_with_positional_parameters => [ ArrayRef, Int, Int
+];
sub function_with_positional_parameters {
my ( $list, $start, $end ) = @_;
my @slice = @{$list}[ $start .. $end ];
return \@slice;
}
wrap_subs function_with_named_parameters =>
compile_named_oo( list => ArrayRef, start => Int, end => Int );
sub function_with_named_parameters {
my ( $arg ) = @_;
my @slice = @{$arg->list}[ $arg->start .. $arg->end ];
return \@slice;
}
My suggested API is:
use feature 'state';
use Type::Params2;
use Types::Standard -types;
sub function_with_positional_parameters {
state $check = signature(
pos => [ ArrayRef, Int, Int ],
);
my ( $list, $start, $end ) = $check->( @_ );
my @slice = @{$list}[ $start .. $end ];
return \@slice;
}
sub function_with_named_parameters {
state $check = signature(
named => [ list => ArrayRef, start => Int, end => Int ],
);
my ( $arg ) = $check->( @_ );
my @slice = @{$arg->list}[ $arg->start .. $arg->end ];
return \@slice;
}
It would also support the inside-out technique:
use Type::Params2;
use Types::Standard -types;
signature_for function_with_positional_parameters => (
pos => [ ArrayRef, Int, Int ],
);
sub function_with_positional_parameters {
my ( $list, $start, $end ) = @_;
my @slice = @{$list}[ $start .. $end ];
return \@slice;
}
signature_for function_with_named_parameters => (
named => [ list => ArrayRef, start => Int, end => Int ],
);
sub function_with_named_parameters {
my ( $arg ) = @_;
my @slice = @{$arg->list}[ $arg->start .. $arg->end ];
return \@slice;
}
There would be a shortcut for methods:
signature_for method_with_named_parameters => (
method => 1,
named => [ list => ArrayRef, start => Int, end => Int ],
);
sub method_with_named_parameters {
my ( $self, $arg ) = @_;
my @slice = @{$arg->list}[ $arg->start .. $arg->end ];
return \@slice;
}
Comments? Do people think this would be an improvement?
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.