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

require can handle recursive module references
author sergey
date Fri, 16 Nov 2012 16:44:16 +0400
parents 6d8092d8ce1b
children 34a3f8668b58
line wrap: on
line diff
--- a/Lib/IMPL/declare.pm	Wed Nov 07 04:17:53 2012 +0400
+++ b/Lib/IMPL/declare.pm	Fri Nov 16 16:44:16 2012 +0400
@@ -5,6 +5,12 @@
 use Carp qw(carp);
 use IMPL::Class::PropertyInfo();
 use IMPL::Const qw(:access);
+use IMPL::require();
+
+BEGIN {
+	*_require = *IMPL::require::_require;
+	*_trace = *IMPL::require::_trace;
+}
 
 sub import {
 	my ( $self, $args ) = @_;
@@ -18,8 +24,13 @@
 	my $caller = caller;
 
 	my $aliases = $args->{require} || {};
+	
+	_trace("declare $caller");
+	$IMPL::require::level++;
 
 	while ( my ( $alias, $class ) = each %$aliases ) {
+		_trace("$alias => $class");
+		$IMPL::require::level ++;
 		my $c = _require($class);
 
 		*{"${caller}::$alias"} = set_prototype(
@@ -28,6 +39,7 @@
 			},
 			''
 		);
+		$IMPL::require::level --;
 	}
 
 	my $base = $args->{base} || {};
@@ -39,7 +51,10 @@
 		carp "Odd elements number in require"
 		  unless scalar(@$base) % 2 == 0;
 		while ( my ( $class, $mapper ) = splice @$base, 0, 2 ) {
+			_trace("parent $class");
+			$IMPL::require::level ++;
 			$class = $aliases->{$class} || _require($class);
+			$IMPL::require::level --;
 
 			push @isa, $class;
 			$ctor{$class} = $mapper;
@@ -47,7 +62,10 @@
 	}
 	elsif ( ref $base eq 'HASH' ) {
 		while ( my ( $class, $mapper ) = each %$base ) {
+			_trace("parent $class");
+			$IMPL::require::level ++;
 			$class = $aliases->{$class} || _require($class);
+			$IMPL::require::level --;
 
 			push @isa, $class;
 			$ctor{$class} = $mapper;
@@ -86,16 +104,8 @@
 			$propInfo->Implement();
 		}
 	}
-}
-
-sub _require {
-	my ($class) = @_;
-
-	if ( not $class =~ s/^-// ) {
-		( my $file = $class ) =~ s/::|'/\//g;
-		require "$file.pm";
-	}
-	$class;
+	
+	$IMPL::require::level--;
 }
 
 1;