Class-Load
view release on metacpan or search on metacpan
lib/Class/Load.pm view on Meta::CPAN
use strict;
use warnings;
package Class::Load; # git description: v0.24-5-g22a44fd
# ABSTRACT: A working (require "Class::Name") and more
# KEYWORDS: class module load require use runtime
our $VERSION = '0.25';
use base 'Exporter';
use Data::OptList 0.110 ();
use Module::Implementation 0.04;
use Module::Runtime 0.012 ();
use Try::Tiny;
{
my $loader = Module::Implementation::build_loader_sub(
implementations => [ 'XS', 'PP' ],
symbols => ['is_class_loaded'],
);
$loader->();
}
our @EXPORT_OK = qw/load_class load_optional_class try_load_class is_class_loaded load_first_existing_class/;
our %EXPORT_TAGS = (
all => \@EXPORT_OK,
);
our $ERROR;
sub load_class {
my $class = shift;
my $options = shift;
my ($res, $e) = try_load_class($class, $options);
return $class if $res;
_croak($e);
}
sub load_first_existing_class {
my $classes = Data::OptList::mkopt(\@_)
or return;
foreach my $class (@{$classes}) {
Module::Runtime::check_module_name($class->[0]);
}
for my $class (@{$classes}) {
my ($name, $options) = @{$class};
# We need to be careful not to pass an undef $options to this sub,
# since the XS version will blow up if that happens.
return $name if is_class_loaded($name, ($options ? $options : ()));
my ($res, $e) = try_load_class($name, $options);
return $name if $res;
my $file = Module::Runtime::module_notional_filename($name);
next if $e =~ /^Can't locate \Q$file\E in \@INC/;
next
if $options
&& defined $options->{-version}
&& $e =~ _version_fail_re($name, $options->{-version});
_croak("Couldn't load class ($name) because: $e");
}
my @list = map {
$_->[0]
. ( $_->[1] && defined $_->[1]{-version}
( run in 2.214 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )