John Peacock wrote:
> Michael G Schwern wrote:
>> Go ahead and use isa() to check the class of the version object.  Can't hurt.
> 
> ...said the man who wasn't working on the patch. ;-)

...said the man who doesn't really want it in the first place. :P  But if
we're going to do it we're going to do it right.

Don't worry, I'll stop torturing you soon.


> OK, here's my compromise:  we still use ref for the first pass through (so it
> will handle the base version objects)

Hold up.  Why won't isa() work on base version objects?  What's a "base"
version object?  Did you instead mean so it will work on non-object references
(ie. hash refs, etc...)?  Or did you mean normal string/number versions?


> and we try real hard to use isa() safely
> if that fails.  Here's that block of the diff:
> 
> @@ -120,8 +121,8 @@
>          }
> 
>          my @sigs   = ref $sig ? @$sig : $sig;
> -        my $given = lc ref $val;
> -        unless( grep $given eq $_, @sigs ) {
> +        my $given  = ref $val;
> +        unless( grep { $given eq $_ || ($_ && eval{$val->isa($_)}) } @sigs ) 
> {
>              my $takes = join " or ", map { $_ ne '' ? "$_ reference"
>                                                      : "string/number"
>                                           } @sigs;
> 
> I'm going to write a test that exercises this code, but I already confirmed 
> that
> a subclass of version will fail the first || term and pass the second.  Now 
> that
> I look at it again, I'd like to rewrite that grep block to be
> 
>       { $_ && ($given eq $_ || eval{$val->isa($_)) }
> 
> which is (to my mind) a little clearer about the intent of the tests.  Of 
> course
> I personally would also edit the next line to eliminate the useless "ne ''"
> (which isn't clearer to my eyes).

If you eliminate that how will it display the right message when it accepts a
non-reference?

The code looks ok to me.  Stick it on RT as a patch so I won't forget it.

Reply via email to