1 package Moose::Exporter;
7 use namespace::clean 0.08 ();
13 sub build_import_methods {
17 my $exporting_package = caller();
19 $EXPORT_SPEC{$exporting_package} = \%args;
21 my ( $exporter, $exported ) = $class->_build_exporter(
22 exporting_package => $exporting_package,
26 my $import = $class->_make_import_sub(
27 $exporting_package, $args{init_meta_args},
31 my $unimport = $class->_make_unimport_sub($exported);
34 *{ $exporting_package . '::import' } = $import;
35 *{ $exporting_package . '::unimport' } = $unimport;
43 my $exporting_package = $args{exporting_package};
47 for my $name ( @{ $args{with_caller} } ) {
48 my $sub = do { no strict 'refs'; \&{ $exporting_package . '::' . $name } };
50 my $wrapped = Class::MOP::subname(
51 $exporting_package . '::' . $name => sub { $sub->( scalar caller(), @_ ) } );
53 $exports{$name} = sub { $wrapped };
55 push @exported_names, $name;
58 for my $name ( @{ $args{as_is} } ) {
63 $name = ( Class::MOP::get_code_info($name) )[1];
66 $sub = do { no strict 'refs'; \&{ $exporting_package . '::' . $name } };
68 push @exported_names, $name;
71 $exports{$name} = sub { $sub };
74 my $exporter = Sub::Exporter::build_exporter(
77 groups => { default => [':all'] }
81 return $exporter, \@exported_names;
84 sub _make_import_sub {
86 my $exporting_package = shift;
87 my $init_meta_args = shift;
91 my $caller = Moose::Exporter->_get_caller(@_);
93 # this works because both pragmas set $^H (see perldoc perlvar)
94 # which affects the current compilation - i.e. the file who use'd
95 # us - which is why we don't need to do anything special to make
96 # it affect that file rather than this one (which is already compiled)
101 # we should never export to main
102 if ( $caller eq 'main' ) {
104 qq{$exporting_package does not export its sugar to the 'main' package.\n};
108 if ( $exporting_package->can('_init_meta') ) {
109 $exporting_package->_init_meta(
110 for_class => $caller,
111 %{ $init_meta_args || {} }
120 # 1 extra level because it's called by import so there's a layer
125 ( ref $_[1] && defined $_[1]->{into} ) ? $_[1]->{into}
126 : ( ref $_[1] && defined $_[1]->{into_level} )
127 ? caller( $offset + $_[1]->{into_level} )
131 sub _make_unimport_sub {
133 my $exported = shift;
135 # [12:24] <mst> yes. that's horrible. I know. but it should work.
137 # This will hopefully be replaced in the future once
138 # namespace::clean has an API for it.
140 @_ = ( 'namespace::clean', @{$exported} );
142 goto &namespace::clean::import;