1 package Mouse::Exporter;
7 use Mouse::Util qw(get_code_info);
11 sub setup_import_methods{
12 my($class, %args) = @_;
14 my $exporting_package = $args{exporting_package} ||= caller();
16 $SPEC{$exporting_package} = \%args;
22 my @stack = ($exporting_package);
24 while(my $current = shift @stack){
25 push @export_from, $current;
27 my $also = $SPEC{$current}{also} or next;
28 push @stack, grep{ !$seen{$_}++ } @{ $also };
32 @export_from = ($exporting_package);
39 foreach my $package(@export_from){
40 my $spec = $SPEC{$package} or next;
42 if(my $as_is = $spec->{as_is}){
43 foreach my $thingy (@{$as_is}){
49 ($code_package, $name) = get_code_info($code);
54 $code = \&{ $package . '::' . $name };
57 $exports{$name} = $code;
58 push @removables, $name;
62 $args{EXPORTS} = \%exports;
63 $args{REMOVABLES} = \@removables;
65 $args{group}{default} ||= \@removables;
66 $args{group}{all} ||= \@removables;
71 *{$exporting_package . '::import'} = \&do_import;
72 *{$exporting_package . '::unimport'} = \&do_unimport;
74 if(!defined &{$exporting_package . '::init_meta'}){
75 *{$exporting_package . '::init_meta'} = \&do_init_meta;
80 # the entity of general init_meta()
82 my($class, %args) = @_;
84 my $spec = $SPEC{$class}
85 or confess("The package $class does not use Mouse::Exporter");
87 my $for_class = $args{for_class}
88 or confess("Cannot call init_meta without specifying a for_class");
90 my $base_class = $args{base_class} || 'Mouse::Object';
91 my $metaclass = $args{metaclass} || 'Mouse::Meta::Class';
93 my $meta = $metaclass->initialize($for_class);
95 $meta->add_method(meta => sub{
96 $metaclass->initialize(ref($_[0]) || $_[0]);
99 $meta->superclasses($base_class)
100 unless $meta->superclasses;
105 # the entity of general import()
107 my($class, @args) = @_;
109 my $spec = $SPEC{$class}
110 or confess("The package $class does not use Mouse::Exporter");
112 my $into = _get_caller_package(ref($args[0]) ? shift @args : undef);
115 foreach my $arg(@args){
116 if($arg =~ s/^[-:]//){
117 my $group = $spec->{group}{$arg} or confess(qq{group "$arg" is not exported by the $class module});
118 push @exports, @{$group};
128 if($into eq 'main' && !$spec->{_not_export_to_main}){
129 warn qq{$class does not export its sugar to the 'main' package.\n};
133 if($class->can('init_meta')){
134 my $meta = $class->init_meta(
138 # TODO: process -metaclass and -traits
143 my $exports_ref = @exports ? \@exports : $spec->{group}{default};
145 foreach my $keyword(@{$exports_ref}){
147 *{$into.'::'.$keyword} = $spec->{EXPORTS}{$keyword}
148 or confess(qq{"$keyword" is not exported by the $class module});
153 # the entity of general unimport()
155 my($class, $arg) = @_;
157 my $spec = $SPEC{$class}
158 or confess("The package $class does not use Mouse::Exporter");
160 my $from = _get_caller_package($arg);
167 for my $keyword (@{ $spec->{REMOVABLES} }) {
168 delete $stash->{$keyword};
173 sub _get_caller_package {
176 # 2 extra level because it's called by import so there's a layer
\r
181 return defined($arg->{into}) ? $arg->{into}
182 : defined($arg->{into_level}) ? scalar caller($offset + $arg->{into_level})
183 : scalar caller($offset);
186 return scalar caller($offset);
196 Mouse - The Mouse Exporter
203 Mouse::Exporter->setup_import_methods(