X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse.pm;h=d006137fc13b1fb1b67d41874e16735dbdeed234;hb=4f9945f5a128e120049ce8a7a30cf469d1568b9b;hp=98d19e568f6e12893c5b614953df10a798bd26b4;hpb=3a63a2e7ef8fbac5f61eab04baecbf5d19374b83;p=gitmo%2FMouse.git diff --git a/lib/Mouse.pm b/lib/Mouse.pm index 98d19e5..d006137 100644 --- a/lib/Mouse.pm +++ b/lib/Mouse.pm @@ -11,6 +11,7 @@ use Scalar::Util 'blessed'; use Mouse::Util; use Mouse::Meta::Attribute; +use Mouse::Meta::Module; # class_of() use Mouse::Meta::Class; use Mouse::Object; use Mouse::Util::TypeConstraints; @@ -191,12 +192,11 @@ sub unimport { sub load_class { my $class = shift; - if (ref($class) || !defined($class) || !length($class)) { + if (!Mouse::Util::is_valid_class_name($class)) { my $display = defined($class) ? $class : 'undef'; confess "Invalid class name ($display)"; } - return 1 if $class eq 'Mouse::Object'; return 1 if is_class_loaded($class); (my $file = "$class.pm") =~ s{::}{/}g; @@ -207,11 +207,14 @@ sub load_class { return 1; } +my %is_class_loaded_cache; sub is_class_loaded { my $class = shift; return 0 if ref($class) || !defined($class) || !length($class); + return 1 if exists $is_class_loaded_cache{$class}; + # walk the symbol table tree to avoid autovififying # \*{${main::}{"Foo::"}} == \*main::Foo:: @@ -222,25 +225,21 @@ sub is_class_loaded { } # check for $VERSION or @ISA - return 1 if exists ${$$pack}{VERSION} + return ++$is_class_loaded_cache{$class} if exists ${$$pack}{VERSION} && defined *{${$$pack}{VERSION}}{SCALAR}; - return 1 if exists ${$$pack}{ISA} + return ++$is_class_loaded_cache{$class} if exists ${$$pack}{ISA} && defined *{${$$pack}{ISA}}{ARRAY}; # check for any method foreach ( keys %{$$pack} ) { next if substr($_, -2, 2) eq '::'; - return 1 if defined *{${$$pack}{$_}}{CODE}; + return ++$is_class_loaded_cache{$class} if defined *{${$$pack}{$_}}{CODE}; } # fail return 0; } -sub class_of { - return Mouse::Meta::Class::class_of($_[0]); -} - 1; __END__