#!perl -w
use strict;
use Benchmark qw(:all);
use FindBin qw($Bin);
use lib $Bin;
use Common;
use Data::Util qw(:all), @ARGV;
use Params::Util qw(_INVOCANT);
signeture 'Data::Util' => \&is_invocant, 'Params::Util' => \&_INVOCANT;
BEGIN{
package Base;
sub new{
bless {} => shift;
}
package Foo;
our @ISA = qw(Base);
package Foo::X;
our @ISA = qw(Foo);
package Foo::X::X;
our @ISA = qw(Foo::X);
package Foo::X::X::X;
our @ISA = qw(Foo::X::X);
}
print "Benchmark: Data::Util::is_invocant() vs. Params::Util::_INVOCANT() vs. eval{}\n";
foreach my $x (Foo->new, Foo::X::X::X->new(), 'Foo', 'Foo::X::X::X', undef, {}){
print 'For ', neat($x), "\n";
my $i = 0;
cmpthese -1 => {
'eval{}' => sub{
for(1 .. 10){
$i++ if eval{ $x->VERSION; 1 };
}
},
'_INVOCANT' => sub{
for(1 .. 10){
$i++ if _INVOCANT($x);
}
},
'is_invocant' => sub{
for(1 .. 10){
$i++ if is_invocant($x);
}
},
};
print "\n";
}