Finish moving Mouse::Attribute and Mouse::Class into Mouse::Meta::*
[gitmo/Mouse.git] / lib / Mouse.pm
index ee5a823..dae207d 100644 (file)
@@ -9,8 +9,8 @@ use Sub::Exporter;
 use Carp 'confess';
 use Scalar::Util 'blessed';
 
-use Mouse::Attribute;
-use Mouse::Class;
+use Mouse::Meta::Attribute;
+use Mouse::Meta::Class;
 use Mouse::Object;
 use Mouse::TypeRegistry;
 
@@ -19,7 +19,7 @@ do {
 
     my %exports = (
         meta => sub {
-            my $meta = Mouse::Class->initialize($CALLER);
+            my $meta = Mouse::Meta::Class->initialize($CALLER);
             return sub { $meta };
         },
 
@@ -37,7 +37,7 @@ do {
                 $names = [$names] if !ref($names);
 
                 for my $name (@$names) {
-                    Mouse::Attribute->create($package, $name, @_);
+                    Mouse::Meta::Attribute->create($package, $name, @_);
                 }
             };
         },
@@ -62,7 +62,7 @@ do {
         strict->import;
         warnings->import;
 
-        my $meta = Mouse::Class->initialize($CALLER);
+        my $meta = Mouse::Meta::Class->initialize($CALLER);
         $meta->superclasses('Mouse::Object')
             unless $meta->superclasses;
 
@@ -83,16 +83,28 @@ do {
 sub load_class {
     my $class = shift;
 
+    return 1 if is_class_loaded($class);
+
     (my $file = "$class.pm") =~ s{::}{/}g;
 
     eval { CORE::require($file) };
-    confess "Could not load class ($class) because : $@"
-        if $@
-        && $@ !~ /^Can't locate .*? at /;
+    confess "Could not load class ($class) because : $@" if $@;
 
     return 1;
 }
 
+sub is_class_loaded {
+    my $class = shift;
+
+    no strict 'refs';
+    return 1 if defined ${"${class}::VERSION"} || defined @{"${class}::ISA"};
+    foreach my $symbol (keys %{"${class}::"}) {
+            next if substr($symbol, -2, 2) eq '::';
+            return 1 if defined &{"${class}::${symbol}"};
+    }
+    return 0;
+}
+
 1;
 
 __END__
@@ -137,7 +149,7 @@ Moose.
 
 =head1 INTERFACE
 
-=head2 meta -> Mouse::Class
+=head2 meta -> Mouse::Meta::Class
 
 Returns this class' metaclass instance.