X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FMOP.pm;h=841d879ac4308398b995fd41574df0bc35aa4d4f;hb=c16a3087fabac823b511ab1fcfa10d0f64f53bf6;hp=d05de84cd6307575c072f0218120c6e65b51802f;hpb=a6844bfb972e5d883445dca38f1ca6cda868e3c6;p=gitmo%2FClass-MOP.git diff --git a/lib/Class/MOP.pm b/lib/Class/MOP.pm index d05de84..841d879 100644 --- a/lib/Class/MOP.pm +++ b/lib/Class/MOP.pm @@ -31,7 +31,7 @@ BEGIN { *check_package_cache_flag = \&mro::get_pkg_gen; } -our $VERSION = '0.67'; +our $VERSION = '0.74'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; @@ -100,24 +100,62 @@ sub _load_pure_perl { # because I don't yet see a good reason to do so. } -sub load_class { - my $class = shift; +sub load_first_existing_class { + my @classes = @_ + or return; - unless ( _is_valid_class_name($class) ) { - my $display = defined($class) ? $class : 'undef'; - confess "Invalid class name ($display)"; + foreach my $class (@classes) { + unless ( _is_valid_class_name($class) ) { + my $display = defined($class) ? $class : 'undef'; + confess "Invalid class name ($display)"; + } } - # if the class is not already loaded in the symbol table.. - unless (is_class_loaded($class)) { - # require it - my $file = $class . '.pm'; - $file =~ s{::}{/}g; - my $e = do { local $@; eval { require($file) }; $@ }; - confess "Could not load class ($class) because : $e" if $e; + my $found; + my %exceptions; + for my $class (@classes) { + my $e = _try_load_one_class($class); + + if ($e) { + $exceptions{$class} = $e; + } + else { + $found = $class; + last; + } } - get_metaclass_by_name($class) || $class if defined wantarray; + return $found if $found; + + confess join( + "\n", + map { + sprintf( + "Could not load class (%s) because : %s", $_, + $exceptions{$_} + ) + } @classes + ); +} + +sub _try_load_one_class { + my $class = shift; + + return if is_class_loaded($class); + + my $file = $class . '.pm'; + $file =~ s{::}{/}g; + + return do { + local $@; + eval { require($file) }; + $@; + }; +} + +sub load_class { + my $class = load_first_existing_class($_[0]); + return get_metaclass_by_name($class) || $class; } sub _is_valid_class_name { @@ -135,7 +173,7 @@ sub _is_valid_class_name { sub is_class_loaded { my $class = shift; - return 0 if ref($class) || !defined($class) || !length($class); + return 0 unless _is_valid_class_name($class); # walk the symbol table tree to avoid autovififying # \*{${main::}{"Foo::"}} == \*main::Foo:: @@ -615,12 +653,8 @@ undef Class::MOP::Instance->meta->{_package_cache_flag}; ## -------------------------------------------------------- ## Now close all the Class::MOP::* classes -# NOTE: -# we don't need to inline the -# constructors or the accessors -# this only lengthens the compile -# time of the MOP, and gives us -# no actual benefits. +# NOTE: we don't need to inline the the accessors this only lengthens +# the compile time of the MOP, and gives us no actual benefits. $_->meta->make_immutable( inline_constructor => 1, @@ -905,6 +939,16 @@ destruction. Otherwise it's a constant returning false. +=item B + +B + +Given a list of class names, this function will attempt to load each +one in turn. + +If it finds a class it can load, it will return that class' name. +If none of the classes can be loaded, it will throw an exception. + =back =head2 Metaclass cache functions @@ -1060,6 +1104,8 @@ B Brandon (blblack) Black +Florian (rafl) Ragwitz + Guillermo (groditi) Roditi Matt (mst) Trout