The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!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";
}