use strict;
use warnings FATAL => 'all';
-use Scalar::Util qw(blessed);
-use base qw(Exporter);
+use Scalar::Util ();
+use Exporter 5.57 qw(import);
-our $VERSION = '1.000003';
+our $VERSION = '1.000006';
our @EXPORT = qw($_call_if_object $_isa $_can $_does $_DOES);
our $_call_if_object = sub {
my ($obj, $method) = (shift, shift);
- return unless blessed($obj);
+ # This is intentionally a truth test, not a defined test, otherwise
+ # we gratuitously break modules like Scalar::Defer, which would be
+ # un-perlish.
+ return unless Scalar::Util::blessed($obj);
+ return $obj->isa(@_) if lc($method) eq 'does' and not $obj->can($method);
return $obj->$method(@_);
};
sub { my $obj = shift; $obj->$_call_if_object($method => @_) }
} qw(isa can does DOES);
+1;
+__END__
+
+=pod
+
=head1 NAME
Safe::Isa - Call isa, can, does and DOES safely on things that may not be objects
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
C<is_module_name> function from L<Module::Runtime> is a good way to check for
-somthing you might be able to call methods on if you want to do that.
+something you might be able to call methods on if you want to do that.
=head1 EXPORTS
If called on an object, calls C<method_name> on it and returns the result,
otherwise returns nothing.
+=head1 SEE ALSO
+
+I gave a lightning talk on this module (and L<curry> and L<Import::Into>) at
+L<YAPC::NA 2013|https://www.youtube.com/watch?v=wFXWV2yY7gE&t=46m05s>.
+
=head1 AUTHOR
mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>