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