Fix an issue in Mouse::Object::new to throw informative messages
[gitmo/Mouse.git] / lib / Mouse / Exporter.pm
index 881a6aa..910456c 100644 (file)
@@ -6,14 +6,14 @@ use Carp qw(confess);
 
 my %SPEC;
 
-my $strict_bits = strict::bits(qw(subs refs vars));
+use constant _strict_bits => strict::bits(qw(subs refs vars));
 
 # it must be "require", because Mouse::Util depends on Mouse::Exporter,
 # which depends on Mouse::Util::import()
 require Mouse::Util;
 
 sub import{
-    $^H              |= $strict_bits;         # strict->import;
+    $^H              |= _strict_bits;         # strict->import;
     ${^WARNING_BITS}  = $warnings::Bits{all}; # warnings->import;
     return;
 }
@@ -24,6 +24,30 @@ sub setup_import_methods{
 
     my $exporting_package = $args{exporting_package} ||= caller();
 
+    my($import, $unimport) = $class->build_import_methods(%args);
+
+    no strict 'refs';
+
+    *{$exporting_package . '::import'}    = $import;
+    *{$exporting_package . '::unimport'}  = $unimport;
+
+    # for backward compatibility
+    *{$exporting_package . '::export_to_level'} = sub{
+        my($package, $level, undef, @args) = @_; # the third argument is redundant
+        $package->import({ into_level => $level + 1 }, @args);
+    };
+    *{$exporting_package . '::export'} = sub{
+        my($package, $into, @args) = @_;
+        $package->import({ into => $into }, @args);
+    };
+    return;
+}
+
+sub build_import_methods{
+    my($class, %args) = @_;
+
+    my $exporting_package = $args{exporting_package} ||= caller();
+
     $SPEC{$exporting_package} = \%args;
 
     # canonicalize args
@@ -78,7 +102,7 @@ sub setup_import_methods{
 
             if(my $init_meta = $package->can('init_meta')){
                 if(!grep{ $_ == $init_meta } @init_meta_methods){
-                    unshift @init_meta_methods, $init_meta;
+                    push @init_meta_methods, $init_meta;
                 }
             }
         }
@@ -105,23 +129,7 @@ sub setup_import_methods{
         }
     }
 
-    no strict 'refs';
-
-    *{$exporting_package . '::import'}    = \&do_import;
-    *{$exporting_package . '::unimport'}  = \&do_unimport;
-
-    # for backward compatibility
-
-    *{$exporting_package . '::export_to_level'} = sub{
-        my($package, $level, @args) = @_;
-        do_import($package, { into_level => $level + 1 }, @args);
-    };
-    *{$exporting_package . '::export'} = sub{
-        my($package, $into, @args) = @_;
-        do_import($package, { into => $into }, @args);
-    };
-
-    return;
+    return (\&do_import, \&do_unimport);
 }
 
 
@@ -150,7 +158,7 @@ sub do_import {
         }
     }
 
-    $^H              |= $strict_bits;         # strict->import;
+    $^H              |= _strict_bits;         # strict->import;
     ${^WARNING_BITS}  = $warnings::Bits{all}; # warnings->import;
 
     if($into eq 'main' && !$spec->{_export_to_main}){
@@ -223,6 +231,8 @@ sub _get_caller_package {
     }
 }
 
+#sub _spec{ %SPEC }
+
 1;
 
 __END__
@@ -231,6 +241,10 @@ __END__
 
 Mouse::Exporter - make an import() and unimport() just like Mouse.pm
 
+=head1 VERSION
+
+This document describes Mouse version 0.39
+
 =head1 SYNOPSIS
 
     package MyApp::Mouse;\r
@@ -273,8 +287,15 @@ C<unimport> methods for your module, based on a spec you provide.
 Note that C<Mouse::Exporter> does not provide the C<with_meta> option,
 but you can easily get the metaclass by C<< caller->meta >> as L</SYNOPSIS> shows.
 
+=head1 METHODS
+
+=head2 C<< setup_import_methods( ARGS ) >>
+
+=head2 C<< build_import_methods( ARGS ) -> (\&import, \&unimport) >>
+
 =head1 SEE ALSO
 
 L<Moose::Exporter>
 
 =cut
+