X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FMOP.pm;h=10764122cf7519b29a7d19f4098fd539ce0e9670;hb=b7bdaeb4dabcafe91153b5c3000ebdbc30aa8114;hp=3ea4fbdb9036cc42230b51bb858a92cd13532bfa;hpb=7716a8f9e4be04083165acaa98b71b7d0ce9134c;p=gitmo%2FClass-MOP.git diff --git a/lib/Class/MOP.pm b/lib/Class/MOP.pm index 3ea4fbd..1076412 100644 --- a/lib/Class/MOP.pm +++ b/lib/Class/MOP.pm @@ -10,6 +10,7 @@ use MRO::Compat; use Carp 'confess'; use Scalar::Util 'weaken', 'reftype', 'blessed'; +use Try::Tiny; use Class::MOP::Class; use Class::MOP::Attribute; @@ -24,7 +25,7 @@ BEGIN { *check_package_cache_flag = \&mro::get_pkg_gen; } -our $VERSION = '0.92_01'; +our $VERSION = '0.95'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; @@ -75,7 +76,7 @@ sub _class_to_pmfile { sub load_first_existing_class { my @classes = @_ - or return; + or return; foreach my $class (@classes) { unless ( _is_valid_class_name($class) ) { @@ -86,55 +87,40 @@ sub load_first_existing_class { my $found; my %exceptions; - for my $class (@classes) { - my $e = _try_load_one_class($class); - if ($e) { - my $pmfile = _class_to_pmfile($class); - $exceptions{$class} = $e; - last if $e !~ /^Can't locate \Q$pmfile\E in \@INC/; - } - else { - $found = $class; - last; - } - } + for my $class (@classes) { + my $file = _class_to_pmfile($class); - return $found if $found; + return $class if is_class_loaded($class);; - confess join( - "\n", - map { - sprintf( - "Could not load class (%s) because : %s", $_, - $exceptions{$_} - ) + return $class if try { + local $SIG{__DIE__}; + require $file; + return 1; + } + catch { + unless (/^Can't locate \Q$file\E in \@INC/) { + confess "Couldn't load class ($class) because: $_"; } - grep { - exists $exceptions{$_} - } @classes - ); -} -sub _try_load_one_class { - my $class = shift; - - return if is_class_loaded($class); - - my $file = _class_to_pmfile($class); + return; + }; + } - return do { - local $@; - local $SIG{__DIE__}; - eval { require($file) }; - $@; - }; + if ( @classes > 1 ) { + confess "Can't locate any of @classes in \@INC (\@INC contains: @INC)."; + } else { + confess "Can't locate " . _class_to_pmfile($classes[0]) . " in \@INC (\@INC contains: @INC)."; + } } sub load_class { load_first_existing_class($_[0]); - return; + # This is done to avoid breaking code which checked the return value. Said + # code is dumb. The return value was _always_ true, since it dies on + # failure! + return 1; } sub _is_valid_class_name { @@ -204,12 +190,12 @@ Class::MOP::Package->meta->add_attribute( ); Class::MOP::Package->meta->add_attribute( - Class::MOP::Attribute->new('methods' => ( + Class::MOP::Attribute->new('_methods' => ( reader => { # NOTE: # we just alias the original method # rather than re-produce it here - 'get_method_map' => \&Class::MOP::Package::get_method_map + '_full_method_map' => \&Class::MOP::Package::_full_method_map }, default => sub { {} } )) @@ -296,7 +282,7 @@ Class::MOP::Class->meta->add_attribute( # # we just alias the original method # rather than re-produce it here - 'get_attribute_map' => \&Class::MOP::Class::get_attribute_map + '_attribute_map' => \&Class::MOP::Class::_attribute_map }, default => sub { {} } )) @@ -914,6 +900,10 @@ loaded (as reported by C). This function can be used in place of tricks like C or using C unconditionally. +If the module cannot be loaded, an exception is thrown. + +For historical reasons, this function explicitly returns a true value. + =item B Returns a boolean indicating whether or not C<$class_name> has been