use Scalar::Util directly
[gitmo/Mouse.git] / lib / Mouse.pm
index b8e8f97..2f61610 100644 (file)
@@ -1,33 +1,25 @@
-#!/usr/bin/env perl
+
 package Mouse;
 use strict;
 use warnings;
-use base 'Exporter';
-
-our $VERSION = '0.12';
 use 5.006;
+use base 'Exporter';
 
-if ($ENV{SHIKA_DEBUG}) {
-    *DEBUG = sub (){ 1 };
-} else {
-    *DEBUG = sub (){ 0 };
-}
-
-our $PurePerl;
-$PurePerl = $ENV{SHIKA_PUREPERL} unless defined $PurePerl;
+our $VERSION;
 
+BEGIN {
+    $VERSION  = '0.12';
 
-if (! $PurePerl) {
-    local $@;
-    local $^W = 0;
-    require XSLoader;
-    $PurePerl = !eval{ XSLoader::load(__PACKAGE__, $VERSION); 1 };
-    warn "Failed to load XS mode: $@" if $@ && Mouse::DEBUG();
+    if ($ENV{MOUSE_DEBUG}) {
+        *DEBUG = sub (){ 1 };
+    } else {
+        *DEBUG = sub (){ 0 };
+    }
 }
 
-
 use Carp 'confess';
-use Mouse::Util 'blessed';
+use Scalar::Util 'blessed';
+use Mouse::Util;
 
 use Mouse::Meta::Attribute;
 use Mouse::Meta::Class;
@@ -85,18 +77,12 @@ sub around {
 }
 
 sub with {
-    my $meta = Mouse::Meta::Class->initialize(caller);
-
-    my $role  = shift;
-    my $args  = shift || {};
-
-    confess "Mouse::Role only supports 'with' on individual roles at a time" if @_ || !ref $args;
-
-    Mouse::load_class($role);
-    $role->meta->apply($meta, %$args);
+    Mouse::Util::apply_all_roles((caller)[0], @_);
 }
 
 sub import {
+    my $class = shift;
+
     strict->import;
     warnings->import;
 
@@ -110,7 +96,15 @@ sub import {
     no warnings 'redefine';
     *{$caller.'::meta'} = sub { $meta };
 
-    Mouse->export_to_level(1, @_);
+    if (@_) {
+        __PACKAGE__->export_to_level( 1, $class, @_);
+    } else {
+        # shortcut for the common case of no type character
+        no strict 'refs';
+        for my $keyword (@EXPORT) {
+            *{ $caller . '::' . $keyword } = *{__PACKAGE__ . '::' . $keyword};
+        }
+    }
 }
 
 sub unimport {
@@ -130,6 +124,7 @@ sub load_class {
         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;