use strict;
use warnings;
-our $VERSION = '1.15';
-our $XS_VERSION = $VERSION;
-$VERSION = eval $VERSION;
-our $AUTHORITY = 'cpan:STEVAN';
+use XSLoader;
+
+BEGIN {
+ XSLoader::load(
+ 'Moose',
+ $Moose::Exporter::{VERSION} ? ${ $Moose::Exporter::{VERSION} } : ()
+ );
+}
use Class::MOP;
use List::MoreUtils qw( first_index uniq );
-use Moose::Deprecated;
use Moose::Util::MetaRole;
use Scalar::Util qw(reftype);
use Sub::Exporter 0.980;
use Sub::Name qw(subname);
-use XSLoader;
-
-XSLoader::load( 'Moose', $XS_VERSION );
-
my %EXPORT_SPEC;
sub setup_import_methods {
my ( $class, %args ) = @_;
- my $exporting_package = $args{exporting_package} ||= caller();
+ $args{exporting_package} ||= caller();
$class->build_import_methods(
%args,
$is_reexport,
);
- my $exporter = Sub::Exporter::build_exporter(
- {
- exports => $exports,
- groups => { default => [':all'] }
- }
- );
+ my $exporter = $class->_make_exporter($exports, $is_reexport);
my %methods;
$methods{import} = $class->_make_import_sub(
return ( $methods{import}, $methods{unimport}, $methods{init_meta} );
}
+sub _make_exporter {
+ my ($class, $exports, $is_reexport) = @_;
+
+ return Sub::Exporter::build_exporter(
+ {
+ exports => $exports,
+ groups => { default => [':all'] },
+ installer => sub {
+ my ($arg, $to_export) = @_;
+ my $meta = Class::MOP::class_of($arg->{into});
+
+ goto &Sub::Exporter::default_installer unless $meta;
+
+ # don't overwrite existing symbols with our magically flagged
+ # version of it if we would install the same sub that's already
+ # in the importer
+
+ my @filtered_to_export;
+ my %installed;
+ for (my $i = 0; $i < @{ $to_export }; $i += 2) {
+ my ($as, $cv) = @{ $to_export }[$i, $i + 1];
+
+ next if !ref($as)
+ && $meta->has_package_symbol('&' . $as)
+ && $meta->get_package_symbol('&' . $as) == $cv;
+
+ push @filtered_to_export, $as, $cv;
+ $installed{$as} = 1 unless ref $as;
+ }
+
+ Sub::Exporter::default_installer($arg, \@filtered_to_export);
+
+ for my $name ( keys %{$is_reexport} ) {
+ no strict 'refs';
+ no warnings 'once';
+ next unless exists $installed{$name};
+ _flag_as_reexport( \*{ join q{::}, $arg->{into}, $name } );
+ }
+ },
+ }
+ );
+}
+
{
my $seen = {};
local %$seen = ( $exporting_package => 1 );
- return uniq( _follow_also_real($exporting_package) );
+ return reverse uniq( _follow_also_real($exporting_package) );
}
sub _follow_also_real {
my $class = shift;
my $packages = shift;
my $export_recorder = shift;
- my $is_reexport = shift;
+ my $is_reexport = shift;
my %exports;
my $exporting_package = shift;
my $exporter = shift;
my $exports_from = shift;
- my $is_reexport = shift;
+ my $is_reexport = shift;
return sub {
}
$class->$exporter( $extra, @args );
-
- for my $name ( keys %{$is_reexport} ) {
- no strict 'refs';
- no warnings 'once';
- _flag_as_reexport( \*{ join q{::}, $CALLER, $name } );
- }
};
}
my $exporting_package = shift;
my $exports = shift;
my $export_recorder = shift;
- my $is_reexport = shift;
+ my $is_reexport = shift;
return sub {
my $caller = scalar caller();
my $package = shift;
my $keywords = shift;
my $recorded_exports = shift;
- my $is_reexport = shift;
+ my $is_reexport = shift;
no strict 'refs';
1;
-__END__
+# ABSTRACT: make an import() and unimport() just like Moose.pm
-=head1 NAME
-
-Moose::Exporter - make an import() and unimport() just like Moose.pm
+__END__
=head1 SYNOPSIS
=item * trait_aliases => [ ... ]
-This is a list of package names which should have shortened alias exported,
+This is a list of package names which should have shortened aliases exported,
similar to the functionality of L<aliased>. Each element in the list can be
either a package name, in which case the export will be named as the last
namespace component of the package, or an arrayref, whose first element is the
See L<Moose/BUGS> for details on reporting bugs.
-=head1 AUTHOR
-
-Dave Rolsky E<lt>autarch@urth.orgE<gt>
-
-This is largely a reworking of code in Moose.pm originally written by
-Stevan Little and others.
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright 2009 by Infinity Interactive, Inc.
-
-L<http://www.iinteractive.com>
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
=cut