use cluck for this warning
[gitmo/Moose.git] / lib / Moose / Exporter.pm
CommitLineData
e606ae5f 1package Moose::Exporter;
2
3use strict;
4use warnings;
5
b6cca0d5 6our $VERSION = '1.14';
79dad293 7our $XS_VERSION = $VERSION;
ae18d5ec 8$VERSION = eval $VERSION;
9our $AUTHORITY = 'cpan:STEVAN';
10
e606ae5f 11use Class::MOP;
12use List::MoreUtils qw( first_index uniq );
3b400403 13use Moose::Deprecated;
e606ae5f 14use Moose::Util::MetaRole;
f88cfe7c 15use Scalar::Util qw(reftype);
091ac4b7 16use Sub::Exporter 0.980;
9f2230e9 17use Sub::Name qw(subname);
e606ae5f 18
8fa582b1 19use XSLoader;
20
79dad293 21XSLoader::load( 'Moose', $XS_VERSION );
8fa582b1 22
e606ae5f 23my %EXPORT_SPEC;
24
25sub setup_import_methods {
26 my ( $class, %args ) = @_;
27
28 my $exporting_package = $args{exporting_package} ||= caller();
29
95056a1e 30 $class->build_import_methods(
31 %args,
32 install => [qw(import unimport init_meta)]
33 );
e606ae5f 34}
35
36sub build_import_methods {
37 my ( $class, %args ) = @_;
38
39 my $exporting_package = $args{exporting_package} ||= caller();
40
41 $EXPORT_SPEC{$exporting_package} = \%args;
42
8fa582b1 43 my @exports_from = $class->_follow_also($exporting_package);
e606ae5f 44
45 my $export_recorder = {};
8fa582b1 46 my $is_reexport = {};
e606ae5f 47
e0d3eb10 48 my $exports = $class->_make_sub_exporter_params(
8fa582b1 49 [ @exports_from, $exporting_package ],
50 $export_recorder,
51 $is_reexport,
e0d3eb10 52 );
e606ae5f 53
54 my $exporter = Sub::Exporter::build_exporter(
55 {
56 exports => $exports,
0661fc1a 57 groups => { default => [':all'] }
e606ae5f 58 }
59 );
60
95056a1e 61 my %methods;
8fa582b1 62 $methods{import} = $class->_make_import_sub(
63 $exporting_package,
64 $exporter,
65 \@exports_from,
66 $is_reexport
67 );
e606ae5f 68
8fa582b1 69 $methods{unimport} = $class->_make_unimport_sub(
70 $exporting_package,
71 $exports,
72 $export_recorder,
73 $is_reexport
74 );
95056a1e 75
8fa582b1 76 $methods{init_meta} = $class->_make_init_meta(
77 $exporting_package,
78 \%args
79 );
95056a1e 80
81 my $package = Class::MOP::Package->initialize($exporting_package);
906eabcd 82 for my $to_install ( @{ $args{install} || [] } ) {
95056a1e 83 my $symbol = '&' . $to_install;
906eabcd 84 next
85 unless $methods{$to_install}
86 && !$package->has_package_symbol($symbol);
87 $package->add_package_symbol( $symbol, $methods{$to_install} );
95056a1e 88 }
e606ae5f 89
8fa582b1 90 return ( $methods{import}, $methods{unimport}, $methods{init_meta} );
e606ae5f 91}
92
93{
94 my $seen = {};
95
96 sub _follow_also {
97 my $class = shift;
98 my $exporting_package = shift;
99
100 local %$seen = ( $exporting_package => 1 );
101
102 return uniq( _follow_also_real($exporting_package) );
103 }
104
105 sub _follow_also_real {
106 my $exporting_package = shift;
107
8fa582b1 108 if ( !exists $EXPORT_SPEC{$exporting_package} ) {
ba1a3c2f 109 my $loaded = Class::MOP::is_class_loaded($exporting_package);
110
111 die "Package in also ($exporting_package) does not seem to "
8fa582b1 112 . "use Moose::Exporter"
113 . ( $loaded ? "" : " (is it loaded?)" );
ba1a3c2f 114 }
e606ae5f 115
116 my $also = $EXPORT_SPEC{$exporting_package}{also};
117
118 return unless defined $also;
119
120 my @also = ref $also ? @{$also} : $also;
121
8fa582b1 122 for my $package (@also) {
123 die
124 "Circular reference in 'also' parameter to Moose::Exporter between $exporting_package and $package"
e606ae5f 125 if $seen->{$package};
126
127 $seen->{$package} = 1;
128 }
129
130 return @also, map { _follow_also_real($_) } @also;
131 }
132}
133
f88cfe7c 134sub _parse_trait_aliases {
135 my $class = shift;
136 my ($package, $aliases) = @_;
137
138 my @ret;
139 for my $alias (@$aliases) {
140 my $name;
141 if (ref($alias)) {
142 reftype($alias) eq 'ARRAY'
143 or Moose->throw_error(reftype($alias) . " references are not "
144 . "valid arguments to the 'trait_aliases' "
145 . "option");
146
147 ($alias, $name) = @$alias;
148 }
149 else {
150 ($name = $alias) =~ s/.*:://;
151 }
152 push @ret, subname "${package}::${name}" => sub () { $alias };
153 }
154
155 return @ret;
156}
157
e606ae5f 158sub _make_sub_exporter_params {
8fa582b1 159 my $class = shift;
160 my $packages = shift;
161 my $export_recorder = shift;
162 my $is_reexport = shift;
e606ae5f 163
164 my %exports;
165
166 for my $package ( @{$packages} ) {
167 my $args = $EXPORT_SPEC{$package}
168 or die "The $package package does not use Moose::Exporter\n";
169
5ac14e89 170 for my $name ( @{ $args->{with_meta} } ) {
0dd4228e 171 my $sub = $class->_sub_from_package( $package, $name )
172 or next;
e6a5040f 173
e606ae5f 174 my $fq_name = $package . '::' . $name;
175
5ac14e89 176 $exports{$name} = $class->_make_wrapped_sub_with_meta(
e606ae5f 177 $fq_name,
178 $sub,
179 $export_recorder,
180 );
181 }
182
5ac14e89 183 for my $name ( @{ $args->{with_caller} } ) {
0dd4228e 184 my $sub = $class->_sub_from_package( $package, $name )
185 or next;
e6a5040f 186
45975bce 187 my $fq_name = $package . '::' . $name;
188
5ac14e89 189 $exports{$name} = $class->_make_wrapped_sub(
45975bce 190 $fq_name,
191 $sub,
192 $export_recorder,
193 );
45975bce 194 }
195
f88cfe7c 196 my @extra_exports = $class->_parse_trait_aliases(
197 $package, $args->{trait_aliases},
198 );
199 for my $name ( @{ $args->{as_is} }, @extra_exports ) {
8fa582b1 200 my ( $sub, $coderef_name );
e606ae5f 201
202 if ( ref $name ) {
e0d3eb10 203 $sub = $name;
e05fb8ae 204
e05fb8ae 205 my $coderef_pkg;
e6a5040f 206 ( $coderef_pkg, $coderef_name )
207 = Class::MOP::get_code_info($name);
e05fb8ae 208
e0d3eb10 209 if ( $coderef_pkg ne $package ) {
8fa582b1 210 $is_reexport->{$coderef_name} = 1;
e0d3eb10 211 }
e606ae5f 212 }
213 else {
0dd4228e 214 $sub = $class->_sub_from_package( $package, $name )
215 or next;
e6a5040f 216
e6a5040f 217 $coderef_name = $name;
e606ae5f 218 }
219
220 $export_recorder->{$sub} = 1;
221
8fa582b1 222 $exports{$coderef_name} = sub {$sub};
e606ae5f 223 }
224 }
225
e0d3eb10 226 return \%exports;
e606ae5f 227}
228
0dd4228e 229sub _sub_from_package {
8fa582b1 230 my $sclass = shift;
0dd4228e 231 my $package = shift;
8fa582b1 232 my $name = shift;
0dd4228e 233
234 my $sub = do {
235 no strict 'refs';
236 \&{ $package . '::' . $name };
237 };
238
239 return $sub if defined &$sub;
240
8fa582b1 241 Carp::cluck "Trying to export undefined sub ${package}::${name}";
0dd4228e 242
243 return;
244}
245
96bb13ea 246our $CALLER;
247
248sub _make_wrapped_sub {
b4f00a34 249 my $self = shift;
96bb13ea 250 my $fq_name = shift;
251 my $sub = shift;
252 my $export_recorder = shift;
253
254 # We need to set the package at import time, so that when
255 # package Foo imports has(), we capture "Foo" as the
256 # package. This lets other packages call Foo::has() and get
257 # the right package. This is done for backwards compatibility
258 # with existing production code, not because this is a good
259 # idea ;)
260 return sub {
261 my $caller = $CALLER;
262
8fa582b1 263 my $wrapper = $self->_curry_wrapper( $sub, $fq_name, $caller );
b4f00a34 264
8fa582b1 265 my $sub = subname( $fq_name => $wrapper );
96bb13ea 266
267 $export_recorder->{$sub} = 1;
268
269 return $sub;
270 };
271}
e606ae5f 272
45975bce 273sub _make_wrapped_sub_with_meta {
274 my $self = shift;
275 my $fq_name = shift;
276 my $sub = shift;
277 my $export_recorder = shift;
278
279 return sub {
280 my $caller = $CALLER;
281
8fa582b1 282 my $wrapper = $self->_late_curry_wrapper(
283 $sub, $fq_name,
284 sub { Class::MOP::class_of(shift) } => $caller
285 );
45975bce 286
8fa582b1 287 my $sub = subname( $fq_name => $wrapper );
45975bce 288
289 $export_recorder->{$sub} = 1;
290
291 return $sub;
292 };
293}
294
6de00734 295sub _curry_wrapper {
badbc528 296 my $class = shift;
b4f00a34 297 my $sub = shift;
298 my $fq_name = shift;
6de00734 299 my @extra = @_;
b4f00a34 300
8fa582b1 301 my $wrapper = sub { $sub->( @extra, @_ ) };
302 if ( my $proto = prototype $sub ) {
303
2d7e979b 304 # XXX - Perl's prototype sucks. Use & to make set_prototype
6de00734 305 # ignore the fact that we're passing "private variables"
8fa582b1 306 &Scalar::Util::set_prototype( $wrapper, $proto );
badbc528 307 }
308 return $wrapper;
b4f00a34 309}
310
45975bce 311sub _late_curry_wrapper {
312 my $class = shift;
313 my $sub = shift;
314 my $fq_name = shift;
315 my $extra = shift;
316 my @ex_args = @_;
317
318 my $wrapper = sub {
8fa582b1 319
45975bce 320 # resolve curried arguments at runtime via this closure
8fa582b1 321 my @curry = ( $extra->(@ex_args) );
322 return $sub->( @curry, @_ );
45975bce 323 };
324
8fa582b1 325 if ( my $proto = prototype $sub ) {
326
45975bce 327 # XXX - Perl's prototype sucks. Use & to make set_prototype
328 # ignore the fact that we're passing "private variables"
8fa582b1 329 &Scalar::Util::set_prototype( $wrapper, $proto );
45975bce 330 }
331 return $wrapper;
332}
333
96bb13ea 334sub _make_import_sub {
335 shift;
336 my $exporting_package = shift;
337 my $exporter = shift;
338 my $exports_from = shift;
8fa582b1 339 my $is_reexport = shift;
96bb13ea 340
341 return sub {
342
343 # I think we could use Sub::Exporter's collector feature
344 # to do this, but that would be rather gross, since that
345 # feature isn't really designed to return a value to the
346 # caller of the exporter sub.
347 #
348 # Also, this makes sure we preserve backwards compat for
349 # _get_caller, so it always sees the arguments in the
350 # expected order.
351 my $traits;
352 ( $traits, @_ ) = _strip_traits(@_);
353
8f30b86e 354 my $metaclass;
355 ( $metaclass, @_ ) = _strip_metaclass(@_);
8fa582b1 356 $metaclass
357 = Moose::Util::resolve_metaclass_alias( 'Class' => $metaclass )
358 if defined $metaclass && length $metaclass;
8f30b86e 359
d65bfd76 360 my $no_meta;
361 ( $no_meta, @_ ) = _strip_no_meta(@_);
362
96bb13ea 363 # Normally we could look at $_[0], but in some weird cases
364 # (involving goto &Moose::import), $_[0] ends as something
365 # else (like Squirrel).
366 my $class = $exporting_package;
367
368 $CALLER = _get_caller(@_);
369
370 # this works because both pragmas set $^H (see perldoc
371 # perlvar) which affects the current compilation -
372 # i.e. the file who use'd us - which is why we don't need
373 # to do anything special to make it affect that file
374 # rather than this one (which is already compiled)
375
376 strict->import;
377 warnings->import;
378
96bb13ea 379 my $did_init_meta;
380 for my $c ( grep { $_->can('init_meta') } $class, @{$exports_from} ) {
8fa582b1 381
816208bc 382 # init_meta can apply a role, which when loaded uses
383 # Moose::Exporter, which in turn sets $CALLER, so we need
384 # to protect against that.
fdeb8354 385 local $CALLER = $CALLER;
d65bfd76 386 $c->init_meta(
387 for_class => $CALLER,
388 metaclass => $metaclass,
389 no_meta => $no_meta,
390 );
96bb13ea 391 $did_init_meta = 1;
392 }
e606ae5f 393
96bb13ea 394 if ( $did_init_meta && @{$traits} ) {
8fa582b1 395
96bb13ea 396 # The traits will use Moose::Role, which in turn uses
397 # Moose::Exporter, which in turn sets $CALLER, so we need
398 # to protect against that.
399 local $CALLER = $CALLER;
400 _apply_meta_traits( $CALLER, $traits );
401 }
402 elsif ( @{$traits} ) {
70ea9161 403 require Moose;
96bb13ea 404 Moose->throw_error(
405 "Cannot provide traits when $class does not have an init_meta() method"
406 );
407 }
e606ae5f 408
8fa582b1 409 my ( undef, @args ) = @_;
410 my $extra = shift @args if ref $args[0] eq 'HASH';
411
412 $extra ||= {};
413 if ( !$extra->{into} ) {
414 $extra->{into_level} ||= 0;
415 $extra->{into_level}++;
416 }
417
418 $class->$exporter( $extra, @args );
419
420 for my $name ( keys %{$is_reexport} ) {
421 no strict 'refs';
422 no warnings 'once';
423 _flag_as_reexport( \*{ join q{::}, $CALLER, $name } );
424 }
96bb13ea 425 };
e606ae5f 426}
427
428sub _strip_traits {
429 my $idx = first_index { $_ eq '-traits' } @_;
430
431 return ( [], @_ ) unless $idx >= 0 && $#_ >= $idx + 1;
432
433 my $traits = $_[ $idx + 1 ];
434
435 splice @_, $idx, 2;
436
8fa582b1 437 $traits = [$traits] unless ref $traits;
e606ae5f 438
439 return ( $traits, @_ );
440}
441
8f30b86e 442sub _strip_metaclass {
443 my $idx = first_index { $_ eq '-metaclass' } @_;
444
445 return ( undef, @_ ) unless $idx >= 0 && $#_ >= $idx + 1;
446
447 my $metaclass = $_[ $idx + 1 ];
448
449 splice @_, $idx, 2;
450
451 return ( $metaclass, @_ );
452}
453
d65bfd76 454sub _strip_no_meta {
455 my $idx = first_index { $_ eq '-no_meta' } @_;
456
457 return ( undef, @_ ) unless $idx >= 0 && $#_ >= $idx + 1;
458
459 my $no_meta = $_[ $idx + 1 ];
460
461 splice @_, $idx, 2;
462
463 return ( $no_meta, @_ );
464}
465
e606ae5f 466sub _apply_meta_traits {
467 my ( $class, $traits ) = @_;
468
469 return unless @{$traits};
470
2571a16d 471 my $meta = Class::MOP::class_of($class);
e606ae5f 472
473 my $type = ( split /::/, ref $meta )[-1]
c245d69b 474 or Moose->throw_error(
e606ae5f 475 'Cannot determine metaclass type for trait application . Meta isa '
8fa582b1 476 . ref $meta );
e606ae5f 477
8fa582b1 478 my @resolved_traits = map {
479 ref $_
480 ? $_
481 : Moose::Util::resolve_metatrait_alias( $type => $_ )
482 } @$traits;
e606ae5f 483
484 return unless @resolved_traits;
485
f785aad8 486 my %args = ( for => $class );
487
488 if ( $meta->isa('Moose::Meta::Role') ) {
489 $args{role_metaroles} = { role => \@resolved_traits };
490 }
491 else {
492 $args{class_metaroles} = { class => \@resolved_traits };
493 }
494
495 Moose::Util::MetaRole::apply_metaroles(%args);
e606ae5f 496}
497
498sub _get_caller {
8fa582b1 499
e606ae5f 500 # 1 extra level because it's called by import so there's a layer
501 # of indirection
502 my $offset = 1;
503
504 return
505 ( ref $_[1] && defined $_[1]->{into} ) ? $_[1]->{into}
506 : ( ref $_[1] && defined $_[1]->{into_level} )
507 ? caller( $offset + $_[1]->{into_level} )
508 : caller($offset);
509}
510
511sub _make_unimport_sub {
512 shift;
513 my $exporting_package = shift;
514 my $exports = shift;
515 my $export_recorder = shift;
8fa582b1 516 my $is_reexport = shift;
e606ae5f 517
518 return sub {
519 my $caller = scalar caller();
520 Moose::Exporter->_remove_keywords(
521 $caller,
522 [ keys %{$exports} ],
523 $export_recorder,
8fa582b1 524 $is_reexport,
e606ae5f 525 );
526 };
527}
528
529sub _remove_keywords {
530 shift;
531 my $package = shift;
532 my $keywords = shift;
533 my $recorded_exports = shift;
8fa582b1 534 my $is_reexport = shift;
e606ae5f 535
536 no strict 'refs';
537
8fa582b1 538 foreach my $name ( @{$keywords} ) {
e606ae5f 539 if ( defined &{ $package . '::' . $name } ) {
540 my $sub = \&{ $package . '::' . $name };
541
542 # make sure it is from us
543 next unless $recorded_exports->{$sub};
544
8fa582b1 545 if ( $is_reexport->{$name} ) {
546 no strict 'refs';
547 next
548 unless _export_is_flagged(
549 \*{ join q{::} => $package, $name } );
550 }
551
e606ae5f 552 # and if it is from us, then undef the slot
553 delete ${ $package . '::' }{$name};
554 }
555 }
556}
557
95056a1e 558sub _make_init_meta {
559 shift;
906eabcd 560 my $class = shift;
561 my $args = shift;
95056a1e 562
f785aad8 563 my %old_style_roles;
906eabcd 564 for my $role (
565 map {"${_}_roles"}
f785aad8 566 qw(
567 metaclass
906eabcd 568 attribute_metaclass
569 method_metaclass
570 wrapped_method_metaclass
571 instance_metaclass
572 constructor_class
573 destructor_class
574 error_class
f785aad8 575 )
906eabcd 576 ) {
f785aad8 577 $old_style_roles{$role} = $args->{$role}
578 if exists $args->{$role};
95056a1e 579 }
580
581 my %base_class_roles;
906eabcd 582 %base_class_roles = ( roles => $args->{base_class_roles} )
95056a1e 583 if exists $args->{base_class_roles};
584
f785aad8 585 my %new_style_roles = map { $_ => $args->{$_} }
586 grep { exists $args->{$_} } qw( class_metaroles role_metaroles );
587
588 return unless %new_style_roles || %old_style_roles || %base_class_roles;
95056a1e 589
590 return sub {
591 shift;
592 my %options = @_;
906eabcd 593
594 return unless Class::MOP::class_of( $options{for_class} );
595
3b400403 596 if ( %new_style_roles || %old_style_roles ) {
597 Moose::Util::MetaRole::apply_metaroles(
598 for => $options{for_class},
599 %new_style_roles,
600 %old_style_roles,
601 );
602 }
906eabcd 603
95056a1e 604 Moose::Util::MetaRole::apply_base_class_roles(
605 for_class => $options{for_class},
606 %base_class_roles,
906eabcd 607 )
608 if Class::MOP::class_of( $options{for_class} )
609 ->isa('Moose::Meta::Class');
610
611 return Class::MOP::class_of( $options{for_class} );
95056a1e 612 };
613}
614
e2fa092d 615sub import {
616 strict->import;
617 warnings->import;
618}
619
e606ae5f 6201;
621
622__END__
623
624=head1 NAME
625
626Moose::Exporter - make an import() and unimport() just like Moose.pm
627
628=head1 SYNOPSIS
629
630 package MyApp::Moose;
631
e606ae5f 632 use Moose ();
633 use Moose::Exporter;
634
635 Moose::Exporter->setup_import_methods(
5ac14e89 636 with_meta => [ 'has_rw', 'sugar2' ],
637 as_is => [ 'sugar3', \&Some::Random::thing ],
638 also => 'Moose',
e606ae5f 639 );
640
82ad7804 641 sub has_rw {
5ac14e89 642 my ( $meta, $name, %options ) = @_;
643 $meta->add_attribute(
644 $name,
82ad7804 645 is => 'rw',
646 %options,
647 );
648 }
649
e606ae5f 650 # then later ...
651 package MyApp::User;
652
653 use MyApp::Moose;
654
655 has 'name';
6daad0b9 656 has_rw 'size';
e606ae5f 657 thing;
658
659 no MyApp::Moose;
660
661=head1 DESCRIPTION
662
fd7ab111 663This module encapsulates the exporting of sugar functions in a
95056a1e 664C<Moose.pm>-like manner. It does this by building custom C<import>,
37e4fe95 665C<unimport>, and C<init_meta> methods for your module, based on a spec you
666provide.
e606ae5f 667
37e4fe95 668It also lets you "stack" Moose-alike modules so you can export Moose's sugar
669as well as your own, along with sugar from any random C<MooseX> module, as
670long as they all use C<Moose::Exporter>. This feature exists to let you bundle
671a set of MooseX modules into a policy module that developers can use directly
672instead of using Moose itself.
e606ae5f 673
10e0127a 674To simplify writing exporter modules, C<Moose::Exporter> also imports
675C<strict> and C<warnings> into your exporter module, as well as into
676modules that use it.
677
e606ae5f 678=head1 METHODS
679
680This module provides two public methods:
681
4b68e0de 682=over 4
683
684=item B<< Moose::Exporter->setup_import_methods(...) >>
e606ae5f 685
95056a1e 686When you call this method, C<Moose::Exporter> builds custom C<import>,
37e4fe95 687C<unimport>, and C<init_meta> methods for your module. The C<import> method
688will export the functions you specify, and can also re-export functions
689exported by some other module (like C<Moose.pm>).
e606ae5f 690
37e4fe95 691The C<unimport> method cleans the caller's namespace of all the exported
cee38bb4 692functions. This includes any functions you re-export from other
693packages. However, if the consumer of your package also imports those
694functions from the original package, they will I<not> be cleaned.
e606ae5f 695
37e4fe95 696If you pass any parameters for L<Moose::Util::MetaRole>, this method will
697generate an C<init_meta> for you as well (see below for details). This
ff526a65 698C<init_meta> will call C<Moose::Util::MetaRole::apply_metaroles> and
37e4fe95 699C<Moose::Util::MetaRole::apply_base_class_roles> as needed.
95056a1e 700
701Note that if any of these methods already exist, they will not be
702overridden, you will have to use C<build_import_methods> to get the
703coderef that would be installed.
e606ae5f 704
705This method accepts the following parameters:
706
4b68e0de 707=over 8
e606ae5f 708
5ac14e89 709=item * with_meta => [ ... ]
e606ae5f 710
37e4fe95 711This list of function I<names only> will be wrapped and then exported. The
5ac14e89 712wrapper will pass the metaclass object for the caller as its first argument.
713
714Many sugar functions will need to use this metaclass object to do something to
715the calling package.
e606ae5f 716
717=item * as_is => [ ... ]
718
37e4fe95 719This list of function names or sub references will be exported as-is. You can
720identify a subroutine by reference, which is handy to re-export some other
721module's functions directly by reference (C<\&Some::Package::function>).
e606ae5f 722
37e4fe95 723If you do export some other package's function, this function will never be
724removed by the C<unimport> method. The reason for this is we cannot know if
725the caller I<also> explicitly imported the sub themselves, and therefore wants
726to keep it.
e05fb8ae 727
f88cfe7c 728=item * trait_aliases => [ ... ]
729
730This is a list of package names which should have shortened alias exported,
731similar to the functionality of L<aliased>. Each element in the list can be
732either a package name, in which case the export will be named as the last
733namespace component of the package, or an arrayref, whose first element is the
734package to alias to, and second element is the alias to export.
735
e606ae5f 736=item * also => $name or \@names
737
738This is a list of modules which contain functions that the caller
739wants to export. These modules must also use C<Moose::Exporter>. The
740most common use case will be to export the functions from C<Moose.pm>.
5ac14e89 741Functions specified by C<with_meta> or C<as_is> take precedence over
ae8817b6 742functions exported by modules specified by C<also>, so that a module
743can selectively override functions exported by another module.
e606ae5f 744
745C<Moose::Exporter> also makes sure all these functions get removed
746when C<unimport> is called.
747
748=back
749
f785aad8 750You can also provide parameters for C<Moose::Util::MetaRole::apply_metaroles>
751and C<Moose::Util::MetaRole::base_class_roles>. Specifically, valid parameters
15851b87 752are "class_metaroles", "role_metaroles", and "base_class_roles".
95056a1e 753
4b68e0de 754=item B<< Moose::Exporter->build_import_methods(...) >>
e606ae5f 755
95056a1e 756Returns two or three code refs, one for C<import>, one for
757C<unimport>, and optionally one for C<init_meta>, if the appropriate
758options are passed in.
759
37e4fe95 760Accepts the additional C<install> option, which accepts an arrayref of method
761names to install into your exporting package. The valid options are C<import>,
762C<unimport>, and C<init_meta>. Calling C<setup_import_methods> is equivalent
763to calling C<build_import_methods> with C<< install => [qw(import unimport
764init_meta)] >> except that it doesn't also return the methods.
e606ae5f 765
766Used by C<setup_import_methods>.
767
4b68e0de 768=back
769
e606ae5f 770=head1 IMPORTING AND init_meta
771
37e4fe95 772If you want to set an alternative base object class or metaclass class, see
773above for details on how this module can call L<Moose::Util::MetaRole> for
774you.
775
776If you want to do something that is not supported by this module, simply
777define an C<init_meta> method in your class. The C<import> method that
778C<Moose::Exporter> generates for you will call this method (if it exists). It
779will always pass the caller to this method via the C<for_class> parameter.
e606ae5f 780
781Most of the time, your C<init_meta> method will probably just call C<<
782Moose->init_meta >> to do the real work:
783
784 sub init_meta {
785 shift; # our class name
786 return Moose->init_meta( @_, metaclass => 'My::Metaclass' );
787 }
788
95056a1e 789Keep in mind that C<build_import_methods> will return an C<init_meta>
790method for you, which you can also call from within your custom
37e4fe95 791C<init_meta>:
792
793 my ( $import, $unimport, $init_meta ) =
794 Moose::Exporter->build_import_methods( ... );
795
796 sub import {
797 my $class = shift;
798
799 ...
800
801 $class->$import(...);
802
803 ...
804 }
805
806 sub unimport { goto &$unimport }
807
808 sub init_meta {
809 my $class = shift;
810
811 ...
812
813 $class->$init_meta(...);
814
815 ...
816 }
95056a1e 817
e606ae5f 818=head1 METACLASS TRAITS
819
820The C<import> method generated by C<Moose::Exporter> will allow the
821user of your module to specify metaclass traits in a C<-traits>
822parameter passed as part of the import:
823
824 use Moose -traits => 'My::Meta::Trait';
825
826 use Moose -traits => [ 'My::Meta::Trait', 'My::Other::Trait' ];
827
828These traits will be applied to the caller's metaclass
829instance. Providing traits for an exporting class that does not create
830a metaclass for the caller is an error.
831
c5fc2c21 832=head1 BUGS
833
834See L<Moose/BUGS> for details on reporting bugs.
835
e606ae5f 836=head1 AUTHOR
837
838Dave Rolsky E<lt>autarch@urth.orgE<gt>
839
840This is largely a reworking of code in Moose.pm originally written by
841Stevan Little and others.
842
843=head1 COPYRIGHT AND LICENSE
844
2840a3b2 845Copyright 2009 by Infinity Interactive, Inc.
e606ae5f 846
847L<http://www.iinteractive.com>
848
849This library is free software; you can redistribute it and/or modify
850it under the same terms as Perl itself.
851
852=cut