Mercurial > pub > Impl
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__