The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

use Test::Without::Module;
use Test::More tests => 5;

sub tryload {
  my $module = shift;
  my $failed = !eval "require $module; 1";
  my $error = $@;
  $error =~ s/(\(\@INC contains: ).*\)/$1...)/;
  $error =~ s/\n+\z//;
  my $inc_status =     !exists $INC{"$module.pm"} ? 'missing'
    : !defined $INC{"$module.pm"} ? 'undef'
    : !$INC{"$module.pm"} ? 'false'
    : '"'.$INC{"$module.pm"}.'"'
    ;
  return $failed, $error, $inc_status;
}

my ($failed,$error,$inc) = tryload( 'Nonexisting::Module' );
is $failed, 1, "Self-test, a non-existing module fails to load";
like $error, qr!^Can't locate Nonexisting/Module.pm in \@INC( \(you may need to install the Nonexisting::Module module\))? \(\@INC contains: ...\) line (\d+).!,
    'Self-test, error message shows @INC';
#diag $error;

# Now, hide a module that has not been loaded:
ok !$INC{'IO/Socket.pm'}, "Module 'IO/Socket.pm' has not been loaded yet";
Test::Without::Module->import('IO::Socket');

($failed,$error,$inc) = tryload( 'IO::Socket' );
is $failed, 1, "a non-existing module fails to load";
like $error, qr!Can't locate IO/Socket.pm in \@INC( \(you may need to install the IO::Socket module\))? \(\@INC contains: ...\) line (\d+)!, 'error message for hidden module shows @INC';
#diag $error;