Fix a 5.70/5.80 behavior change in Catalyst::Utils::ensure_class_loaded, pointed...
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Utils.pm
index fd23d95..5d5cfc3 100644 (file)
@@ -6,8 +6,8 @@ use File::Spec;
 use HTTP::Request;
 use Path::Class;
 use URI;
-use Class::Inspector;
 use Carp qw/croak/;
+use Cwd;
 
 =head1 NAME
 
@@ -160,6 +160,7 @@ sub home {
 
             # find the @INC entry in which $file was found
             (my $path = $inc_entry) =~ s/$file$//;
+            $path ||= cwd() if !defined $path || !length $path;
             my $home = dir($path)->absolute->cleanup;
 
             # pop off /lib and /blib if they're there
@@ -171,8 +172,9 @@ sub home {
                 # clean up relative path:
                 # MyApp/script/.. -> MyApp
 
-                my ($lastdir) = $home->dir_list( -1, 1 );
-                if ( $lastdir eq '..' ) {
+                my $dir;
+                my @dir_list = $home->dir_list();
+                while (($dir = pop(@dir_list)) && $dir eq '..') {
                     $home = dir($home)->parent->parent;
                 }
 
@@ -257,20 +259,28 @@ sub ensure_class_loaded {
     croak "ensure_class_loaded should be given a classname, not a filename ($class)"
         if $class =~ m/\.pm$/;
 
+    # $opts->{ignore_loaded} can be set to true, and this causes the class to be required, even
+    # if it already has symbol table entries. This is to support things like Schema::Loader, which
+    # part-generate classes in memory, but then also load some of their contents from disk.
     return if !$opts->{ ignore_loaded }
-        && Class::Inspector->loaded( $class ); # if a symbol entry exists we don't load again
+        && Class::MOP::is_class_loaded($class); # if a symbol entry exists we don't load again
+
+    # FIXME - as soon as Class::MOP 0.67 + 1 is released Class::MOP::load_class($class) can be used instead
 
     # this hack is so we don't overwrite $@ if the load did not generate an error
     my $error;
     {
         local $@;
-        eval "require $class;";
+        my $file = $class . '.pm';
+        $file =~ s{::}{/}g;
+        eval { CORE::require($file) };
         $error = $@;
     }
 
     die $error if $error;
-    die "require $class was successful but the package is not defined"
-        unless Class::Inspector->loaded($class);
+
+    warn "require $class was successful but the package is not defined."
+        unless Class::MOP::is_class_loaded($class);
 
     return 1;
 }
@@ -326,10 +336,9 @@ sub env_value {
     return;
 }
 
-=head1 AUTHOR
+=head1 AUTHORS
 
-Sebastian Riedel, C<sri@cpan.org>
-Yuval Kogman, C<nothingmuch@woobling.org>
+Catalyst Contributors, see Catalyst.pm
 
 =head1 COPYRIGHT