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.
Package Version | Update ID | Released | Package Hub Version | Platforms | Subpackages |
---|---|---|---|---|---|
1.000010-bp156.3.1 info | GA Release | 2023-07-22 | 15 SP6 |
|
|
1.000010-bp155.2.12 info | GA Release | 2023-05-17 | 15 SP5 |
|
|
1.000010-bp154.1.30 info | GA Release | 2022-05-09 | 15 SP4 |
|
|
1.000010-bp153.1.15 info | GA Release | 2021-03-06 | 15 SP3 |
|
|
1.000010-bp152.3.18 info | GA Release | 2020-04-16 | 15 SP2 |
|
|
1.000010-bp151.3.1 info | GA Release | 2019-07-16 | 15 SP1 |
|
|
1.000010-bp151.2.14 info | GA Release | 2019-05-18 | 15 SP1 |
|
|
1.000010-bp150.2.4 info | GA Release | 2018-07-30 | 15 |
|
|