bump version and update Changes
[gitmo/Moose.git] / lib / Moose / Exporter.pm
index 58be754..3ca96b8 100644 (file)
@@ -3,6 +3,10 @@ package Moose::Exporter;
 use strict;
 use warnings;
 
+our $VERSION   = '0.73';
+$VERSION = eval $VERSION;
+our $AUTHORITY = 'cpan:STEVAN';
+
 use Class::MOP;
 use List::MoreUtils qw( first_index uniq );
 use Moose::Util::MetaRole;
@@ -36,7 +40,7 @@ sub build_import_methods {
 
     my ( $exports, $is_removable )
         = $class->_make_sub_exporter_params(
-        [ $exporting_package, @exports_from ], $export_recorder );
+        [ @exports_from, $exporting_package ], $export_recorder );
 
     my $exporter = Sub::Exporter::build_exporter(
         {
@@ -164,7 +168,7 @@ sub _make_sub_exporter_params {
 our $CALLER;
 
 sub _make_wrapped_sub {
-    shift;
+    my $self            = shift;
     my $fq_name         = shift;
     my $sub             = shift;
     my $export_recorder = shift;
@@ -178,8 +182,9 @@ sub _make_wrapped_sub {
     return sub {
         my $caller = $CALLER;
 
-        my $sub
-            = Class::MOP::subname( $fq_name => sub { $sub->( $caller, @_ ) } );
+        my $wrapper = $self->_make_wrapper($caller, $sub, $fq_name);
+
+        my $sub = Class::MOP::subname($fq_name => $wrapper);
 
         $export_recorder->{$sub} = 1;
 
@@ -187,6 +192,21 @@ sub _make_wrapped_sub {
     };
 }
 
+sub _make_wrapper {
+    my $class   = shift;
+    my $caller  = shift;
+    my $sub     = shift;
+    my $fq_name = shift;
+
+    my $wrapper = sub { $sub->($caller, @_) };
+    if (my $proto = prototype $sub) {
+        # XXX - Perl's prototype sucks. Use & to make set_prototype
+        # ignore the fact that we're passing a "provate variable"
+        &Scalar::Util::set_prototype($wrapper, $proto);
+    }
+    return $wrapper;
+}
+
 sub _make_import_sub {
     shift;
     my $exporting_package = shift;
@@ -232,6 +252,10 @@ sub _make_import_sub {
 
         my $did_init_meta;
         for my $c ( grep { $_->can('init_meta') } $class, @{$exports_from} ) {
+            # init_meta can apply a role, which when loaded uses
+            # Moose::Exporter, which in turn sets $CALLER, so we need
+            # to protect against that.
+            local $CALLER = $CALLER;
             $c->init_meta( for_class => $CALLER );
             $did_init_meta = 1;
         }
@@ -244,6 +268,7 @@ sub _make_import_sub {
             _apply_meta_traits( $CALLER, $traits );
         }
         elsif ( @{$traits} ) {
+            require Moose;
             Moose->throw_error(
                 "Cannot provide traits when $class does not have an init_meta() method"
             );
@@ -403,7 +428,9 @@ C<MooseX> module, as long as they all use C<Moose::Exporter>.
 
 This module provides two public methods:
 
-=head2 Moose::Exporter->setup_import_methods(...)
+=over 4
+
+=item  B<< Moose::Exporter->setup_import_methods(...) >>
 
 When you call this method, C<Moose::Exporter> build custom C<import>
 and C<unimport> methods for your module. The import method will export
@@ -415,7 +442,7 @@ exported functions.
 
 This method accepts the following parameters:
 
-=over 4
+=over 8
 
 =item * with_caller => [ ... ]
 
@@ -441,18 +468,23 @@ themselves, and therefore wants to keep it.
 This is a list of modules which contain functions that the caller
 wants to export. These modules must also use C<Moose::Exporter>. The
 most common use case will be to export the functions from C<Moose.pm>.
+Functions specified by C<with_caller> or C<as_is> take precedence over
+functions exported by modules specified by C<also>, so that a module
+can selectively override functions exported by another module.
 
 C<Moose::Exporter> also makes sure all these functions get removed
 when C<unimport> is called.
 
 =back
 
-=head2 Moose::Exporter->build_import_methods(...)
+=item B<< Moose::Exporter->build_import_methods(...) >>
 
 Returns two code refs, one for import and one for unimport.
 
 Used by C<setup_import_methods>.
 
+=back
+
 =head1 IMPORTING AND init_meta
 
 If you want to set an alternative base object class or metaclass
@@ -492,7 +524,7 @@ Stevan Little and others.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2008 by Infinity Interactive, Inc.
+Copyright 2009 by Infinity Interactive, Inc.
 
 L<http://www.iinteractive.com>