Skip to content

Instantly share code, notes, and snippets.

@jberger
Last active December 15, 2015 22:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jberger/5330790 to your computer and use it in GitHub Desktop.
Save jberger/5330790 to your computer and use it in GitHub Desktop.
defines a function looks_like_coderef which returns true if some value can behave like a coderef
#!/usr/bin/env perl
use Mojo::Base -strict;
use Scalar::Util qw/reftype blessed/;
use overload ();
sub looks_like_coderef {
my $val = shift;
return 1 if reftype $val eq 'CODE';
return 0 unless blessed $val;
return !! overload::Method($val, '&{}');
}
{
package mytest::overload;
use Mojo::Base -base;
use overload '&{}' => sub { return sub{} };
}
{
package mytest::coderef;
sub new { return bless sub{}, __PACKAGE__ }
}
use Test::More;
ok looks_like_coderef( sub{} ), 'coderef';
ok looks_like_coderef( mytest::overload->new ), 'overloading class';
ok looks_like_coderef( mytest::coderef->new ), 'blessed coderef';
ok ! looks_like_coderef( 'hi' ), 'string';
ok ! looks_like_coderef( 1 ), 'number';
ok ! looks_like_coderef( [] ), 'arrayref';
ok ! looks_like_coderef( {} ), 'hashref';
ok ! looks_like_coderef( bless {}, 'HashrefClass'), 'non-overloading class';
done_testing;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment