Checking in changes prior to tagging of version 0.42. Changelog diff is:
[gitmo/Mouse.git] / lib / Mouse / Exporter.pm
index 636399d..fc3bfb0 100644 (file)
@@ -14,7 +14,7 @@ require Mouse::Util;
 
 sub import{
     $^H              |= _strict_bits;         # strict->import;
-    ${^WARNING_BITS}  = $warnings::Bits{all}; # warnings->import;
+    ${^WARNING_BITS} |= $warnings::Bits{all}; # warnings->import;
     return;
 }
 
@@ -143,10 +143,17 @@ sub do_import {
     my $into = _get_caller_package(ref($args[0]) ? shift @args : undef);
 
     my @exports;
+    my @traits;
 
-    foreach my $arg(@args){
+    while(@args){
+        my $arg = shift @args;
         if($arg =~ s/^-//){
-            Mouse::Util::not_supported("-$arg");
+            if($arg eq 'traits'){
+                push @traits, ref($args[0]) ? @{shift(@args)} : shift(@args);
+            }
+            else {
+                Mouse::Util::not_supported("-$arg");
+            }
         }
         elsif($arg =~ s/^://){
             my $group = $spec->{groups}{$arg}
@@ -159,19 +166,31 @@ sub do_import {
     }
 
     $^H              |= _strict_bits;         # strict->import;
-    ${^WARNING_BITS}  = $warnings::Bits{all}; # warnings->import;
-
-    if($into eq 'main' && !$spec->{_export_to_main}){
-        warn qq{$package does not export its sugar to the 'main' package.\n};
-        return;
-    }
+    ${^WARNING_BITS} |= $warnings::Bits{all}; # warnings->import;
 
     if($spec->{INIT_META}){
+        my $meta;
         foreach my $init_meta(@{$spec->{INIT_META}}){
-            $into->$init_meta(for_class => $into);
+            $meta = $into->$init_meta(for_class => $into);
         }
 
-        # _apply_meta_traits($into); # TODO
+        if(@traits){
+            my $type = (split /::/, ref $meta)[-1]; # e.g. "Class" for "My::Meta::Class"
+            @traits =
+                map{
+                    ref($_) ? $_
+                            : Mouse::Util::resolve_metaclass_alias($type => $_, trait => 1)
+                } @traits;
+
+            require Mouse::Util::MetaRole;
+            Mouse::Util::MetaRole::apply_metaclass_roles(
+                for_class       => $into,
+                metaclass_roles => \@traits,
+            );
+        }
+    }
+    elsif(@traits){
+        Carp::confess("Cannot provide traits when $package does not have an init_meta() method");
     }
 
     if(@exports){
@@ -234,7 +253,6 @@ sub _get_caller_package {
 #sub _spec{ %SPEC }
 
 1;
-
 __END__
 
 =head1 NAME
@@ -243,7 +261,7 @@ Mouse::Exporter - make an import() and unimport() just like Mouse.pm
 
 =head1 VERSION
 
-This document describes Mouse version 0.38
+This document describes Mouse version 0.42
 
 =head1 SYNOPSIS