1 package Moose::Exporter;
11 # 1 extra level because it's called by import so there's a layer of indirection
15 (ref $_[1] && defined $_[1]->{into})
17 : (ref $_[1] && defined $_[1]->{into_level})
18 ? caller($offset + $_[1]->{into_level})
22 sub build_import_methods {
26 my $exporting_package = caller();
28 my $exporter = $class->_build_exporter( exporting_package => $exporting_package, %args );
30 my $also = $args{also};
33 my $caller = Moose::Exporter->get_caller(@_);
35 # this works because both pragmas set $^H (see perldoc perlvar)
36 # which affects the current compilation - i.e. the file who use'd
37 # us - which is why we don't need to do anything special to make
38 # it affect that file rather than this one (which is already compiled)
43 # we should never export to main
44 if ( $caller eq 'main' ) {
46 qq{$exporting_package does not export its sugar to the 'main' package.\n};
50 $also->($caller) if $also;
56 my $caller = Moose::Exporter->get_caller(@_);
58 Moose::Exporter->remove_keywords(
59 source => $exporting_package,
65 *{ $exporting_package . '::import' } = $import;
66 *{ $exporting_package . '::unimport' } = $unimport;
74 my $exporting_package = $args{exporting_package};
77 for my $name ( @{ $args{with_caller} } ) {
78 my $sub = do { no strict 'refs'; \&{ $exporting_package . '::' . $name } };
80 my $wrapped = Class::MOP::subname(
81 $exporting_package . '::' . $name => sub { $sub->( scalar caller(), @_ ) } );
83 $exports{$name} = sub { $wrapped };
85 push @{ $EXPORTED{$exporting_package} }, $name;
88 for my $name ( @{ $args{as_is} } ) {
93 $name = ( Class::MOP::get_code_info($name) )[1];
96 $sub = do { no strict 'refs'; \&{ $exporting_package . '::' . $name } };
98 push @{ $EXPORTED{$exporting_package} }, $name;
101 $exports{$name} = sub { $sub };
104 return Sub::Exporter::build_exporter(
106 exports => \%exports,
107 groups => { default => [':all'] }
112 sub remove_keywords {
118 for my $name ( @{ $EXPORTED{ $args{source} } } ) {
119 if ( defined &{ $args{from} . '::' . $name } ) {
120 my $keyword = \&{ $args{from} . '::' . $name };
122 # make sure it is from us
123 my ($pkg_name) = Class::MOP::get_code_info($keyword);
124 next if $pkg_name ne $args{source};
126 # and if it is from us, then undef the slot
127 delete ${ $args{from} . '::' }{$name};