Fix small typo
[gitmo/MooseX-Params-Validate.git] / lib / MooseX / Params / Validate.pm
index 2379008..6997aca 100644 (file)
@@ -5,10 +5,12 @@ use warnings;
 
 use Carp 'confess';
 use Devel::Caller 'caller_cv';
-use Scalar::Util 'blessed', 'refaddr';
+use Scalar::Util 'blessed', 'refaddr', 'reftype';
 
-use Moose::Util::TypeConstraints qw( find_type_constraint class_type role_type );
-use Params::Validate             ();
+use Moose 0.58 ();
+use Moose::Util::TypeConstraints
+    qw( find_type_constraint class_type role_type );
+use Params::Validate 0.88 ();
 use Sub::Exporter -setup => {
     exports => [
         qw( validated_hash validated_list pos_validated_list validate validatep )
@@ -19,9 +21,6 @@ use Sub::Exporter -setup => {
     },
 };
 
-our $VERSION   = '0.14';
-our $AUTHORITY = 'cpan:STEVAN';
-
 my %CACHED_SPECS;
 
 sub validated_hash {
@@ -29,6 +28,8 @@ sub validated_hash {
 
     my $cache_key = _cache_key( \%spec );
 
+    my $allow_extra = delete $spec{MX_PARAMS_VALIDATE_ALLOW_EXTRA};
+
     if ( exists $CACHED_SPECS{$cache_key} ) {
         ( ref $CACHED_SPECS{$cache_key} eq 'HASH' )
             || confess
@@ -49,15 +50,19 @@ sub validated_hash {
     my $instance;
     $instance = shift @$args if blessed $args->[0];
 
-    my %args = @$args;
+    my %args
+        = @$args == 1
+        && ref $args->[0]
+        && reftype( $args->[0] ) eq 'HASH' ? %{ $args->[0] } : @$args;
 
     $args{$_} = $spec{$_}{constraint}->coerce( $args{$_} )
         for grep { $spec{$_}{coerce} && exists $args{$_} } keys %spec;
 
     %args = Params::Validate::validate_with(
-        params => \%args,
-        spec   => \%spec,
-        called => _caller_name(),
+        params      => \%args,
+        spec        => \%spec,
+        allow_extra => $allow_extra,
+        called      => _caller_name(),
     );
 
     return ( ( defined $instance ? $instance : () ), %args );
@@ -72,6 +77,8 @@ sub validated_list {
 
     my $cache_key = _cache_key( \%spec );
 
+    my $allow_extra = delete $spec{MX_PARAMS_VALIDATE_ALLOW_EXTRA};
+
     my @ordered_spec;
     if ( exists $CACHED_SPECS{$cache_key} ) {
         ( ref $CACHED_SPECS{$cache_key} eq 'ARRAY' )
@@ -96,15 +103,19 @@ sub validated_list {
     my $instance;
     $instance = shift @$args if blessed $args->[0];
 
-    my %args = @$args;
+    my %args
+        = @$args == 1
+        && ref $args->[0]
+        && reftype( $args->[0] ) eq 'HASH' ? %{ $args->[0] } : @$args;
 
     $args{$_} = $spec{$_}{constraint}->coerce( $args{$_} )
         for grep { $spec{$_}{coerce} && exists $args{$_} } keys %spec;
 
     %args = Params::Validate::validate_with(
-        params => \%args,
-        spec   => \%spec,
-        called => _caller_name(),
+        params      => \%args,
+        spec        => \%spec,
+        allow_extra => $allow_extra,
+        called      => _caller_name(),
     );
 
     return (
@@ -125,6 +136,8 @@ sub pos_validated_list {
 
     my $cache_key = _cache_key( \%extra );
 
+    my $allow_extra = delete $extra{MX_PARAMS_VALIDATE_ALLOW_EXTRA};
+
     my @pv_spec;
     if ( exists $CACHED_SPECS{$cache_key} ) {
         ( ref $CACHED_SPECS{$cache_key} eq 'ARRAY' )
@@ -143,15 +156,16 @@ sub pos_validated_list {
             if $should_cache;
     }
 
-    my @args = @{$args};
+    my @args = @$args;
 
     $args[$_] = $pv_spec[$_]{constraint}->coerce( $args[$_] )
         for grep { $pv_spec[$_] && $pv_spec[$_]{coerce} } 0 .. $#args;
 
     @args = Params::Validate::validate_with(
-        params => \@args,
-        spec   => \@pv_spec,
-        called => _caller_name(),
+        params      => \@args,
+        spec        => \@pv_spec,
+        allow_extra => $allow_extra,
+        called      => _caller_name(),
     );
 
     return @args;
@@ -230,14 +244,12 @@ sub _caller_name {
 
 1;
 
+# ABSTRACT: an extension of Params::Validate using Moose's types
+
 __END__
 
 =pod
 
-=head1 NAME
-
-MooseX::Params::Validate - an extension of Params::Validate for using Moose's types
-
 =head1 SYNOPSIS
 
   package Foo;
@@ -249,7 +261,7 @@ MooseX::Params::Validate - an extension of Params::Validate for using Moose's ty
           \@_,
           bar => { isa => 'Str', default => 'Moose' },
       );
-      return "Horray for $params{bar}!";
+      return "Hooray for $params{bar}!";
   }
 
   sub bar {
@@ -270,11 +282,11 @@ to Moose. This is just one of many developing options, it should not
 be considered the "official" one by any means though.
 
 You might also want to explore C<MooseX::Method::Signatures> and
-C<MooseX::Declare>
+C<MooseX::Declare>.
 
 =head1 CAVEATS
 
-It is not possible to introspect the method parameter specs, they are
+It is not possible to introspect the method parameter specs; they are
 created as needed when the method is called and cached for subsequent
 calls.
 
@@ -284,12 +296,15 @@ calls.
 
 =item B<validated_hash( \@_, %parameter_spec )>
 
-This behaves similar to the standard Params::Validate C<validate>
+This behaves similarly to the standard Params::Validate C<validate>
 function and returns the captured values in a HASH. The one exception
-being that if it spots an instance in the C<@_>, then it will handle
+is where if it spots an instance in the C<@_>, then it will handle
 it appropriately (unlike Params::Validate which forces you to shift
 you C<$self> first).
 
+The values in C<@_> can either be a set of name-value pairs or a single hash
+reference.
+
 The C<%parameter_spec> accepts the following options:
 
 =over 4
@@ -343,6 +358,9 @@ We capture the order in which you defined the parameters and then
 return them as a list in the same order. If a param is marked optional
 and not included, then it will be set to C<undef>.
 
+The values in C<@_> can either be a set of name-value pairs or a single hash
+reference.
+
 Like C<validated_hash>, if it spots an object instance as the first
 parameter of C<@_>, it will handle it appropriately, returning it as
 the first argument.
@@ -369,6 +387,10 @@ Unlike the other functions, this function I<cannot> find C<$self> in
 the argument list. Make sure to shift it off yourself before doing
 validation.
 
+The values in C<@_> must be a list of values. You cannot pass the values as an
+array reference, because this cannot be distinguished from passing one value
+which is itself an array reference.
+
 If a parameter is marked as optional and is not present, it will
 simply not be returned.
 
@@ -389,6 +411,18 @@ below, simply pass them after the list of parameter validation specs:
 
 =back
 
+=head1 ALLOWING EXTRA PARAMETERS
+
+By default, any parameters not mentioned in the parameter spec cause this
+module to throw an error. However, you can have this module simply ignore them
+by setting C<MX_PARAMS_VALIDATE_ALLOW_EXTRA> to a true value when calling a
+validation subroutine.
+
+When calling C<validated_hash> or C<pos_validated_list> the extra parameters
+are simply returned in the hash or list as appropriate. However, when you call
+C<validated_list> the extra parameters will not be returned at all. You can
+get them by looking at the original value of C<@_>.
+
 =head1 EXPORTS
 
 By default, this module exports the C<validated_hash>,
@@ -400,11 +434,10 @@ them.
 
 =head1 IMPORTANT NOTE ON CACHING
 
-When C<validate> or C<validatep> are called the first time, the
-parameter spec is prepared and cached to avoid unnecessary
-regeneration. It uses the fully qualified name of the subroutine
-(package + subname) as the cache key.  In 99.999% of the use cases for
-this module, that will be the right thing to do.
+When a validation subroutine is called the first time, the parameter spec is
+prepared and cached to avoid unnecessary regeneration. It uses the fully
+qualified name of the subroutine (package + subname) as the cache key.  In
+99.999% of the use cases for this module, that will be the right thing to do.
 
 However, I have (ab)used this module occasionally to handle dynamic
 sets of parameters. In this special use case you can do a couple
@@ -442,25 +475,14 @@ the cache key will bypass the normal cache key generation.
 
 =back
 
-=head1 BUGS
-
-All complex software has bugs lurking in it, and this module is no
-exception. If you find a bug please either email me, or add the bug to
-cpan-RT.
-
-=head1 AUTHORS
-
-Stevan Little E<lt>stevan.little@iinteractive.comE<gt>
+=head1 MAINTAINER
 
 Dave Rolsky E<lt>autarch@urth.orgE<gt>
 
-=head1 COPYRIGHT AND LICENSE
-
-Copyright 2007-2009 by Infinity Interactive, Inc.
-
-L<http://www.iinteractive.com>
+=head1 BUGS
 
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
+Please submit bugs to the CPAN RT system at
+http://rt.cpan.org/NoAuth/ReportBug.html?Queue=moosex-params-validate or via
+email at bug-moosex-params-validate@rt.cpan.org.
 
 =cut