-
-
25 Apr 2018 23:14:08 UTC
- Distribution: Safe-Isa
- Module version: 1.000010
- Source (raw)
- Browse (raw)
- Changes
- How to Contribute
- Repository
- Issues (1)
- Testers (10137 / 0 / 0)
- Kwalitee
Bus factor: 6- 100.00% Coverage
- License: perl_5
- Perl: v5.6.0
- Activity
24 month- Tools
- Download (6.39KB)
- MetaCPAN Explorer
- Permissions
- Subscribe to distribution
- Permalinks
- This version
- Latest version
NAME
Safe::Isa - Call isa, can, does and DOES safely on things that may not be objects
SYNOPSIS
use strict; use warnings; { package Foo; sub new { bless({}, $_[0]) } } { package Bar; our @ISA = qw(Foo); sub bar { 1 } } my $foo = Foo->new; my $bar = Bar->new; my $blam = [ 42 ]; # basic isa usage - $foo->isa('Foo'); # true $bar->isa('Foo'); # true $blam->isa('Foo'); # BOOM $foo->can('bar'); # false $bar->can('bar'); # true $blam->can('bar'); # BOOM # Safe::Isa usage - use Safe::Isa; $foo->$_isa('Foo'); # true $bar->$_isa('Foo'); # true $blam->$_isa('Foo'); # false, no boom today $foo->$_can('bar'); # false $bar->$_can('bar'); # true $blam->$_can('bar'); # false, no boom today
Similarly:
$maybe_an_object->$_does('RoleName'); # true or false, no boom today $maybe_an_object->$_DOES('RoleName'); # true or false, no boom today
And just in case we missed a method or two:
$maybe_an_object->$_call_if_object(name => @args); $maybe_an_object->$_call_if_can(name => @args);
Or to re-use a previous example for purposes of explication:
$foo->$_call_if_object(isa => 'Foo'); # true $bar->$_call_if_object(isa => 'Foo'); # true $blam->$_call_if_object(isa => 'Foo'); # false, no boom today
DESCRIPTION
How many times have you found yourself writing:
if ($obj->isa('Something')) {
and then shortly afterwards cursing and changing it to:
if (Scalar::Util::blessed($obj) and $obj->isa('Something')) {
Right. That's why this module exists.
Since perl allows us to provide a subroutine reference or a method name to the -> operator when used as a method call, and a subroutine doesn't require the invocant to actually be an object, we can create safe versions of isa, can and friends by using a subroutine reference that only tries to call the method if it's used on an object. So:
my $isa_Foo = $maybe_an_object->$_call_if_object(isa => 'Foo');
is equivalent to
my $isa_Foo = do { if (Scalar::Util::blessed($maybe_an_object)) { $maybe_an_object->isa('Foo'); } else { undef; } };
Note that we don't handle trying class names, because many things are valid class names that you might not want to treat as one (like say "Matt") - the
is_module_name
function from Module::Runtime is a good way to check for something you might be able to call methods on if you want to do that.We are careful to make sure that scalar/list context is preserved for the method that is eventually called.
EXPORTS
$_isa
$maybe_an_object->$_isa('Foo');
If called on an object, calls
isa
on it and returns the result, otherwise returns nothing.$_can
$maybe_an_object->$_can('Foo');
If called on an object, calls
can
on it and returns the result, otherwise returns nothing.$_does
$maybe_an_object->$_does('Foo');
If called on an object, calls
does
on it and returns the result, otherwise returns nothing. If thedoes
method does not exist, returns nothing rather than failing.$_DOES
$maybe_an_object->$_DOES('Foo');
If called on an object, calls
DOES
on it and returns the result, otherwise returns nothing. On perl versions prior to 5.10.0, the built in coreDOES
method doesn't exist. If the method doesn't exist, this will fall back to callingisa
just like the coreDOES
method.$_call_if_object
$maybe_an_object->$_call_if_object(method_name => @args);
If called on an object, calls
method_name
on it and returns the result, otherwise returns nothing.$_call_if_can
$maybe_an_object->$_call_if_can(name => @args);
If called on an object, calls
can
on it; if that returns true, then callsmethod_name
on it and returns the result; if any condition is false returns nothing.SEE ALSO
I gave a lightning talk on this module (and curry and Import::Into) at YAPC::NA 2013.
AUTHOR
mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
CONTRIBUTORS
None yet. Well volunteered? :)
COPYRIGHT
Copyright (c) 2012 the Safe::Isa "AUTHOR" and "CONTRIBUTORS" as listed above.
LICENSE
This library is free software and may be distributed under the same terms as perl itself.
Module Install Instructions
To install Safe::Isa, copy and paste the appropriate command in to your terminal.
cpanm Safe::Isa
perl -MCPAN -e shell install Safe::Isa
For more information on module installation, please visit the detailed CPAN module installation guide.