diff Lib/IMPL/require.pm @ 251:9f394b27dccf

require can handle recursive module references
author sergey
date Fri, 16 Nov 2012 16:44:16 +0400
parents b8c724f6de36
children 34a3f8668b58
line wrap: on
line diff
--- a/Lib/IMPL/require.pm	Wed Nov 07 04:17:53 2012 +0400
+++ b/Lib/IMPL/require.pm	Fri Nov 16 16:44:16 2012 +0400
@@ -1,7 +1,12 @@
 package IMPL::require;
 use Scalar::Util qw(set_prototype);
 use strict;
-require IMPL::Code::Loader;
+#require IMPL::Code::Loader;
+
+our %PENDING;
+our $LOADER_LOG;
+
+our $level = 0;
 
 sub import {
 	my ($self, $aliases) = @_;
@@ -15,11 +20,16 @@
 	no strict 'refs';
 	
 	while( my ($alias, $class) = each %$aliases ) {
+		_trace("$alias => $class");
+		$level++;
+	    
 	    $class = _require($class);
 		
 		*{"${caller}::$alias"} = set_prototype(sub {
             $class
         }, '');
+        
+        $level--;
 	}
 }
 
@@ -28,11 +38,27 @@
 
     if ( not $class =~ s/^-// ) {
         ( my $file = $class ) =~ s/::|'/\//g;
+        _trace("already pending") and return
+            if $PENDING{$class};
+        $PENDING{$class} = 1;
+        _trace("loading $file.pm");
+        $level++;
         require "$file.pm";
+        $level--;
+        _trace("loaded $file.pm");
+        delete $PENDING{$class};
     }
     $class;
 }
 
+sub _trace {
+	my ($message) = @_;
+	
+	$LOADER_LOG->print("\t" x $level ,"$message\n") if $LOADER_LOG;
+	
+	return 1;
+}
+
 1;
 
 __END__