Subject: | validated_hash fails when used in an overloaded stringify method |
This is a fairly edge case - but the fix is simple enough ...
package Foo;
use Moose;
use MooseX::Params::Validate;
use overload (
qw{""} => 'to_string',
);
has 'id' => ( is => 'ro', isa => 'Str', default => '1.10.100' );
sub to_string {
my ($self, %args) = validated_hash( \@_,
padded => { isa => 'Bool', optional => 1, default => 0 },
);
# 1.10.100 => 0001.0010.0100
my $id = $args{ padded }
? join( '.', map { sprintf( "%04d", $_ ) } split( /\./,
$self->id ) )
: $self->id;
return $id;
}
The following would fail since $instance is being evaluated
(stringified) before it is returned:
is( Foo->new->to_string, '1.10.100', 'to_string' );
The fix is essentially:
- return ( ( $instance ? $instance : () ), %args );
+ return ( ( defined $instance ? $instance : () ), %args );
(patch attached)
Cheers,
Ian
Subject: | MooseX-Params-Validate-0.13-overload_string.patch |
diff --exclude='*~' -NcrB MooseX-Params-Validate-0.13/lib/MooseX/Params/Validate.pm MooseX-Params-Validate-0.13-overload_string/lib/MooseX/Params/Validate.pm
*** MooseX-Params-Validate-0.13/lib/MooseX/Params/Validate.pm Sun Nov 29 16:42:34 2009
--- MooseX-Params-Validate-0.13-overload_string/lib/MooseX/Params/Validate.pm Tue Dec 8 16:16:59 2009
***************
*** 60,66 ****
called => _caller_name(),
);
! return ( ( $instance ? $instance : () ), %args );
}
*validate = \&validated_hash;
--- 60,66 ----
called => _caller_name(),
);
! return ( ( defined $instance ? $instance : () ), %args );
}
*validate = \&validated_hash;
***************
*** 108,114 ****
);
return (
! ( $instance ? $instance : () ),
@args{@ordered_spec}
);
}
--- 108,114 ----
);
return (
! ( defined $instance ? $instance : () ),
@args{@ordered_spec}
);
}
diff --exclude='*~' -NcrB MooseX-Params-Validate-0.13/t/010.overloaded.t MooseX-Params-Validate-0.13-overload_string/t/010.overloaded.t
*** MooseX-Params-Validate-0.13/t/010.overloaded.t Thu Jan 1 01:00:00 1970
--- MooseX-Params-Validate-0.13-overload_string/t/010.overloaded.t Tue Dec 8 16:16:06 2009
***************
*** 0 ****
--- 1,36 ----
+
+ package Foo;
+ use Moose;
+ use MooseX::Params::Validate;
+ use overload (
+ qw{""} => 'to_string',
+ );
+
+ has 'id' => ( is => 'ro', isa => 'Str', default => '1.10.100' );
+
+ sub to_string {
+ my ($self, %args) = validated_hash( \@_,
+ padded => { isa => 'Bool', optional => 1, default => 0 },
+ );
+
+ # 1.10.100 => 0001.0010.0100
+ my $id = $args{ padded }
+ ? join( '.', map { sprintf( "%04d", $_ ) } split( /\./, $self->id ) )
+ : $self->id;
+
+ return $id;
+ }
+
+ package main;
+ use Test::More tests => 4;
+ use strict;
+ use warnings;
+
+ isa_ok( my $foo = Foo->new(), 'Foo', 'new' );
+
+ is( $foo->id, '1.10.100', 'id' );
+
+ is( $foo->to_string, '1.10.100', 'to_string' );
+
+ is( $foo->to_string( padded => 1 ), '0001.0010.0100', 'to_string( padded => 1 )' );
+