use strict;
use warnings;
-our $VERSION = '1.14';
-our $XS_VERSION = $VERSION;
-$VERSION = eval $VERSION;
our $AUTHORITY = 'cpan:STEVAN';
+use XSLoader;
+
+BEGIN {
+ XSLoader::load(
+ 'Moose',
+ $Moose::{VERSION} ? $Moose::{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 {
$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 = {};
}
$class->$exporter( $extra, @args );
-
- for my $name ( keys %{$is_reexport} ) {
- no strict 'refs';
- no warnings 'once';
- _flag_as_reexport( \*{ join q{::}, $CALLER, $name } );
- }
};
}
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