The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
BEGIN {
	$|  = 1;
	$^W = 1;
}

use Test::More tests => 10; 
use File::Temp;
use IO::File;
use Class::Autouse;

# write a temp directory of modules for testing
my $temp_dir;
BEGIN {
	$temp_dir = File::Temp::tempdir(CLEANUP => 1);
}
use lib $temp_dir;

sub try_class {
	my $class = shift;
	my $msg = shift;
	my $r;
	eval { $r = $class->can("mymethod") };
	ok(!$@, "no exception calling can() on class when $msg");
	ok($r, "the can() method works for a real method when $msg");
	eval { $r = $r->() };
	is($r,"$class mymethod", "return value is as expected when $msg");
}

mkfile(class_name => 'SomeClass::123');
use_ok("SomeClass::123");
try_class("SomeClass::123", "used normally");

mkfile(class_name => 'SomeClass::456');
Class::Autouse->autouse("SomeClass::456");
try_class("SomeClass::456","used via Class::Autouse directly");

mkfile(class_name => 'SomeClass::789');
Class::Autouse->autouse(sub { my $class = shift; if ($class =~ /SomeClass::789/) { eval "use $class"  } });
try_class("SomeClass::789","used via Class::Autouse via callback");

sub mkfile {
	my (%args) = @_;
	my $cname = $args{'class_name'};
	my $fname = $cname;
	$fname =~ s/::/\//g;
	my $dname = $fname;
	$dname =~ s/\/[^\/]+//;
	mkdir( "$temp_dir/$dname" );
	die $! unless -d "$temp_dir/$dname";
	$fname =~ s/::/\//g;
	my $n1 = "$temp_dir/${fname}.pm";
	my $m1 = IO::File->new(">$n1");
	die "failed to create file $n1: $!" unless $m1;
	my $src = class_src(@_);
	$m1->print($src);
	$m1->close;
}

sub class_src {
	my (%args) = @_;
	my ($cname, $pname, $ptype, $has_autoload) = @args{'class_name','parent_class_name', 'parent_class_type', 'has_autoload'};

	my $src = <<EOS;
package $cname;

sub mymethod { "$cname mymethod" }

1;
EOS
	#print "####\n$src\n###\n";
	return $src;
}