← Index
NYTProf Performance Profile   « block view • line view • sub view »
For 05.Domain_and_Item.t
  Run on Tue May 4 17:21:41 2010
Reported on Tue May 4 17:23:01 2010

File /usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Moose/Exporter.pm
Statements Executed 11423
Statement Execution Time 20.9ms
Subroutines — ordered by exclusive time
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
1114.59ms66.1msMoose::Exporter::::BEGIN@11Moose::Exporter::BEGIN@11
384114.28ms7.33msMoose::Exporter::::__ANON__[:263]Moose::Exporter::__ANON__[:263]
31112.86ms2.92msMoose::Exporter::::_remove_keywordsMoose::Exporter::_remove_keywords
5957502.85ms130msMoose::Exporter::::__ANON__[:389]Moose::Exporter::__ANON__[:389]
384112.31ms2.31msMoose::Exporter::::_late_curry_wrapperMoose::Exporter::_late_curry_wrapper
111685µs835µsMoose::Exporter::::BEGIN@13Moose::Exporter::BEGIN@13
5911587µs782µsMoose::Exporter::::_strip_traitsMoose::Exporter::_strip_traits
37211485µs485µsMoose::Exporter::::__ANON__[:193]Moose::Exporter::__ANON__[:193]
111414µs1.00msMoose::Exporter::::BEGIN@12Moose::Exporter::BEGIN@12
511403µs681µsMoose::Exporter::::_make_sub_exporter_paramsMoose::Exporter::_make_sub_exporter_params
5911365µs438µsMoose::Exporter::::_strip_metaclassMoose::Exporter::_strip_metaclass
11011364µs1.00msMoose::Exporter::::__ANON__[:255]Moose::Exporter::__ANON__[:255]
313129318µs3.24msMoose::Exporter::::__ANON__[:478]Moose::Exporter::__ANON__[:478]
511303µs3.40msMoose::Exporter::::build_import_methodsMoose::Exporter::build_import_methods
5031163µs163µsMoose::Exporter::::_sub_from_packageMoose::Exporter::_sub_from_package
5911161µs161µsMoose::Exporter::::_get_callerMoose::Exporter::_get_caller
2111150µs310µsMoose::Exporter::::__ANON__[:241]Moose::Exporter::__ANON__[:241]
2111108µs119µsMoose::Exporter::::_curry_wrapperMoose::Exporter::_curry_wrapper
961297µs97µsMoose::Exporter::::_flag_as_reexportMoose::Exporter::_flag_as_reexport (xsub)
51191µs91µsMoose::Exporter::::_make_init_metaMoose::Exporter::_make_init_meta
51171µs129µsMoose::Exporter::::_follow_alsoMoose::Exporter::_follow_also
55570µs3.47msMoose::Exporter::::setup_import_methodsMoose::Exporter::setup_import_methods
161168µs68µsMoose::Exporter::::_make_wrapped_sub_with_metaMoose::Exporter::_make_wrapped_sub_with_meta
581261µs61µsMoose::Exporter::::_export_is_flaggedMoose::Exporter::_export_is_flagged (xsub)
51156µs56µsMoose::Exporter::::_make_import_subMoose::Exporter::_make_import_sub
55543µs102µsMoose::Exporter::::importMoose::Exporter::import
111143µs43µsMoose::Exporter::::_make_wrapped_subMoose::Exporter::_make_wrapped_sub
51135µs35µsMoose::Exporter::::_make_unimport_subMoose::Exporter::_make_unimport_sub
51127µs27µsMoose::Exporter::::_follow_also_realMoose::Exporter::_follow_also_real
11118µs47µsMoose::Exporter::::BEGIN@386Moose::Exporter::BEGIN@386
11115µs197µsMoose::Exporter::::BEGIN@14Moose::Exporter::BEGIN@14
11113µs16µsMoose::Exporter::::BEGIN@3Moose::Exporter::BEGIN@3
11111µs33µsMoose::Exporter::::BEGIN@206Moose::Exporter::BEGIN@206
11111µs27µsMoose::Exporter::::BEGIN@385Moose::Exporter::BEGIN@385
1118µs26µsMoose::Exporter::::BEGIN@488Moose::Exporter::BEGIN@488
1118µs22µsMoose::Exporter::::BEGIN@498Moose::Exporter::BEGIN@498
1117µs32µsMoose::Exporter::::BEGIN@15Moose::Exporter::BEGIN@15
1117µs16µsMoose::Exporter::::BEGIN@4Moose::Exporter::BEGIN@4
1115µs5µsMoose::Exporter::::BEGIN@17Moose::Exporter::BEGIN@17
0000s0sMoose::Exporter::::__ANON__[:272]Moose::Exporter::__ANON__[:272]
0000s0sMoose::Exporter::::__ANON__[:294]Moose::Exporter::__ANON__[:294]
0000s0sMoose::Exporter::::__ANON__[:393]Moose::Exporter::__ANON__[:393]
0000s0sMoose::Exporter::::__ANON__[:407]Moose::Exporter::__ANON__[:407]
0000s0sMoose::Exporter::::__ANON__[:562]Moose::Exporter::__ANON__[:562]
0000s0sMoose::Exporter::::_apply_meta_traitsMoose::Exporter::_apply_meta_traits
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Moose::Exporter;
2
3320µs219µs
# spent 16µs (13+3) within Moose::Exporter::BEGIN@3 which was called # once (13µs+3µs) by Moose::BEGIN@14 at line 3
use strict;
# spent 16µs making 1 call to Moose::Exporter::BEGIN@3 # spent 3µs making 1 call to strict::import
4347µs224µs
# spent 16µs (7+9) within Moose::Exporter::BEGIN@4 which was called # once (7µs+9µs) by Moose::BEGIN@14 at line 4
use warnings;
# spent 16µs making 1 call to Moose::Exporter::BEGIN@4 # spent 9µs making 1 call to warnings::import
5
61700nsour $VERSION = '0.98';
71100nsour $XS_VERSION = $VERSION;
8123µs$VERSION = eval $VERSION;
91800nsour $AUTHORITY = 'cpan:STEVAN';
10
113131µs166.1ms
# spent 66.1ms (4.59+61.5) within Moose::Exporter::BEGIN@11 which was called # once (4.59ms+61.5ms) by Moose::BEGIN@14 at line 11
use Class::MOP;
# spent 66.1ms making 1 call to Moose::Exporter::BEGIN@11
123125µs21.09ms
# spent 1.00ms (414µs+588µs) within Moose::Exporter::BEGIN@12 which was called # once (414µs+588µs) by Moose::BEGIN@14 at line 12
use List::MoreUtils qw( first_index uniq );
# spent 1.00ms making 1 call to Moose::Exporter::BEGIN@12 # spent 92µs making 1 call to Exporter::import
133109µs1835µs
# spent 835µs (685+150) within Moose::Exporter::BEGIN@13 which was called # once (685µs+150µs) by Moose::BEGIN@14 at line 13
use Moose::Util::MetaRole;
# spent 835µs making 1 call to Moose::Exporter::BEGIN@13
14353µs3378µs
# spent 197µs (15+182) within Moose::Exporter::BEGIN@14 which was called # once (15µs+182µs) by Moose::BEGIN@14 at line 14
use Sub::Exporter 0.980;
# spent 197µs making 1 call to Moose::Exporter::BEGIN@14 # spent 167µs making 1 call to Sub::Exporter::__ANON__[Sub/Exporter.pm:756] # spent 15µs making 1 call to UNIVERSAL::VERSION
15321µs256µs
# spent 32µs (7+24) within Moose::Exporter::BEGIN@15 which was called # once (7µs+24µs) by Moose::BEGIN@14 at line 15
use Sub::Name qw(subname);
# spent 32µs making 1 call to Moose::Exporter::BEGIN@15 # spent 24µs making 1 call to Exporter::import
16
173728µs15µs
# spent 5µs within Moose::Exporter::BEGIN@17 which was called # once (5µs+0s) by Moose::BEGIN@14 at line 17
use XSLoader;
# spent 5µs making 1 call to Moose::Exporter::BEGIN@17
18
191111µs1102µsXSLoader::load( 'Moose', $XS_VERSION );
# spent 102µs making 1 call to XSLoader::load
20
211200nsmy %EXPORT_SPEC;
22
23
# spent 3.47ms (70µs+3.40) within Moose::Exporter::setup_import_methods which was called 5 times, avg 694µs/call: # once (14µs+873µs) by Moose::Meta::Attribute::BEGIN@18 at line 41 of Moose/Util/TypeConstraints.pm # once (14µs+728µs) by Foo::BEGIN@3 at line 121 of Moose.pm # once (13µs+727µs) by MooseX::AttributeHelpers::Trait::Bool::BEGIN@2 at line 91 of Moose/Role.pm # once (14µs+695µs) by MooseX::Types::BEGIN@15 at line 67 of MooseX/Types/CheckedUtilExports.pm # once (14µs+381µs) by SimpleDB::Class::BEGIN@138 at line 13 of MooseX/ClassAttribute.pm
sub setup_import_methods {
24515µs my ( $class, %args ) = @_;
25
26512µs my $exporting_package = $args{exporting_package} ||= caller();
27
28538µs53.40ms $class->build_import_methods(
# spent 3.40ms making 5 calls to Moose::Exporter::build_import_methods, avg 680µs/call
29 %args,
30 install => [qw(import unimport init_meta)]
31 );
32}
33
34
# spent 3.40ms (303µs+3.10) within Moose::Exporter::build_import_methods which was called 5 times, avg 680µs/call: # 5 times (303µs+3.10ms) by Moose::Exporter::setup_import_methods at line 28, avg 680µs/call
sub build_import_methods {
35510µs my ( $class, %args ) = @_;
36
3755µs my $exporting_package = $args{exporting_package} ||= caller();
38
3955µs $EXPORT_SPEC{$exporting_package} = \%args;
40
41515µs5129µs my @exports_from = $class->_follow_also($exporting_package);
# spent 129µs making 5 calls to Moose::Exporter::_follow_also, avg 26µs/call
42
4352µs my $export_recorder = {};
4452µs my $is_reexport = {};
45
46521µs5681µs my $exports = $class->_make_sub_exporter_params(
# spent 681µs making 5 calls to Moose::Exporter::_make_sub_exporter_params, avg 136µs/call
47 [ @exports_from, $exporting_package ],
48 $export_recorder,
49 $is_reexport,
50 );
51
52533µs51.64ms my $exporter = Sub::Exporter::build_exporter(
# spent 1.64ms making 5 calls to Sub::Exporter::build_exporter, avg 329µs/call
53 {
54 exports => $exports,
55 groups => { default => [':all'] }
56 }
57 );
58
5951µs my %methods;
60521µs556µs $methods{import} = $class->_make_import_sub(
# spent 56µs making 5 calls to Moose::Exporter::_make_import_sub, avg 11µs/call
61 $exporting_package,
62 $exporter,
63 \@exports_from,
64 $is_reexport
65 );
66
67517µs535µs $methods{unimport} = $class->_make_unimport_sub(
# spent 35µs making 5 calls to Moose::Exporter::_make_unimport_sub, avg 7µs/call
68 $exporting_package,
69 $exports,
70 $export_recorder,
71 $is_reexport
72 );
73
74519µs591µs $methods{init_meta} = $class->_make_init_meta(
# spent 91µs making 5 calls to Moose::Exporter::_make_init_meta, avg 18µs/call
75 $exporting_package,
76 \%args
77 );
78
79519µs5196µs my $package = Class::MOP::Package->initialize($exporting_package);
# spent 196µs making 5 calls to Class::MOP::Package::initialize, avg 39µs/call
80512µs for my $to_install ( @{ $args{install} || [] } ) {
81157µs my $symbol = '&' . $to_install;
82 next
831522µs10174µs unless $methods{$to_install}
# spent 174µs making 10 calls to Class::MOP::Package::has_package_symbol, avg 17µs/call
84 && !$package->has_package_symbol($symbol);
851015µs1094µs $package->add_package_symbol( $symbol, $methods{$to_install} );
# spent 94µs making 10 calls to Class::MOP::Package::add_package_symbol, avg 9µs/call
86 }
87
88521µs return ( $methods{import}, $methods{unimport}, $methods{init_meta} );
89}
90
91{
9221µs my $seen = {};
93
94
# spent 129µs (71+58) within Moose::Exporter::_follow_also which was called 5 times, avg 26µs/call: # 5 times (71µs+58µs) by Moose::Exporter::build_import_methods at line 41, avg 26µs/call
sub _follow_also {
9553µs my $class = shift;
9653µs my $exporting_package = shift;
97
98510µs local %$seen = ( $exporting_package => 1 );
99
100573µs1058µs return uniq( _follow_also_real($exporting_package) );
# spent 32µs making 5 calls to List::MoreUtils::uniq, avg 6µs/call # spent 27µs making 5 calls to Moose::Exporter::_follow_also_real, avg 5µs/call
101 }
102
103
# spent 27µs within Moose::Exporter::_follow_also_real which was called 5 times, avg 5µs/call: # 5 times (27µs+0s) by Moose::Exporter::_follow_also at line 100, avg 5µs/call
sub _follow_also_real {
10453µs my $exporting_package = shift;
105
10654µs if ( !exists $EXPORT_SPEC{$exporting_package} ) {
107 my $loaded = Class::MOP::is_class_loaded($exporting_package);
108
109 die "Package in also ($exporting_package) does not seem to "
110 . "use Moose::Exporter"
111 . ( $loaded ? "" : " (is it loaded?)" );
112 }
113
11457µs my $also = $EXPORT_SPEC{$exporting_package}{also};
115
116528µs return unless defined $also;
117
118 my @also = ref $also ? @{$also} : $also;
119
120 for my $package (@also) {
121 die
122 "Circular reference in 'also' parameter to Moose::Exporter between $exporting_package and $package"
123 if $seen->{$package};
124
125 $seen->{$package} = 1;
126 }
127
128 return @also, map { _follow_also_real($_) } @also;
129 }
130}
131
132
# spent 681µs (403+278) within Moose::Exporter::_make_sub_exporter_params which was called 5 times, avg 136µs/call: # 5 times (403µs+278µs) by Moose::Exporter::build_import_methods at line 46, avg 136µs/call
sub _make_sub_exporter_params {
13353µs my $class = shift;
13453µs my $packages = shift;
13552µs my $export_recorder = shift;
13652µs my $is_reexport = shift;
137
13851µs my %exports;
139
14056µs for my $package ( @{$packages} ) {
14154µs my $args = $EXPORT_SPEC{$package}
142 or die "The $package package does not use Moose::Exporter\n";
143
144510µs for my $name ( @{ $args->{with_meta} } ) {
1451617µs1651µs my $sub = $class->_sub_from_package( $package, $name )
# spent 51µs making 16 calls to Moose::Exporter::_sub_from_package, avg 3µs/call
146 or next;
147
148166µs my $fq_name = $package . '::' . $name;
149
1501630µs1668µs $exports{$name} = $class->_make_wrapped_sub_with_meta(
# spent 68µs making 16 calls to Moose::Exporter::_make_wrapped_sub_with_meta, avg 4µs/call
151 $fq_name,
152 $sub,
153 $export_recorder,
154 );
155 }
156
15759µs for my $name ( @{ $args->{with_caller} } ) {
1581114µs1141µs my $sub = $class->_sub_from_package( $package, $name )
# spent 41µs making 11 calls to Moose::Exporter::_sub_from_package, avg 4µs/call
159 or next;
160
161115µs my $fq_name = $package . '::' . $name;
162
1631121µs1143µs $exports{$name} = $class->_make_wrapped_sub(
# spent 43µs making 11 calls to Moose::Exporter::_make_wrapped_sub, avg 4µs/call
164 $fq_name,
165 $sub,
166 $export_recorder,
167 );
168 }
169
17059µs for my $name ( @{ $args->{as_is} } ) {
171273µs my ( $sub, $coderef_name );
172
173275µs if ( ref $name ) {
1744400ns $sub = $name;
175
1764400ns my $coderef_pkg;
177417µs45µs ( $coderef_pkg, $coderef_name )
# spent 5µs making 4 calls to Class::MOP::get_code_info, avg 1µs/call
178 = Class::MOP::get_code_info($name);
179
18044µs if ( $coderef_pkg ne $package ) {
181 $is_reexport->{$coderef_name} = 1;
182 }
183 }
184 else {
1852325µs2371µs $sub = $class->_sub_from_package( $package, $name )
# spent 71µs making 23 calls to Moose::Exporter::_sub_from_package, avg 3µs/call
186 or next;
187
188234µs $coderef_name = $name;
189 }
190
1912723µs $export_recorder->{$sub} = 1;
192
193399727µs
# spent 485µs within Moose::Exporter::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Moose/Exporter.pm:193] which was called 372 times, avg 1µs/call: # 372 times (485µs+0s) by Sub::Exporter::default_generator at line 856 of Sub/Exporter.pm, avg 1µs/call
$exports{$coderef_name} = sub {$sub};
194 }
195 }
196
197515µs return \%exports;
198}
199
200
# spent 163µs within Moose::Exporter::_sub_from_package which was called 50 times, avg 3µs/call: # 23 times (71µs+0s) by Moose::Exporter::_make_sub_exporter_params at line 185, avg 3µs/call # 16 times (51µs+0s) by Moose::Exporter::_make_sub_exporter_params at line 145, avg 3µs/call # 11 times (41µs+0s) by Moose::Exporter::_make_sub_exporter_params at line 158, avg 4µs/call
sub _sub_from_package {
2015012µs my $sclass = shift;
202508µs my $package = shift;
203507µs my $name = shift;
204
2055010µs my $sub = do {
2063918µs254µs
# spent 33µs (11+21) within Moose::Exporter::BEGIN@206 which was called # once (11µs+21µs) by Moose::BEGIN@14 at line 206
no strict 'refs';
# spent 33µs making 1 call to Moose::Exporter::BEGIN@206 # spent 22µs making 1 call to strict::unimport
2075049µs \&{ $package . '::' . $name };
208 };
209
2105092µs return $sub if defined &$sub;
211
212 Carp::cluck "Trying to export undefined sub ${package}::${name}";
213
214 return;
215}
216
2171200nsour $CALLER;
218
219
# spent 43µs within Moose::Exporter::_make_wrapped_sub which was called 11 times, avg 4µs/call: # 11 times (43µs+0s) by Moose::Exporter::_make_sub_exporter_params at line 163, avg 4µs/call
sub _make_wrapped_sub {
220114µs my $self = shift;
221113µs my $fq_name = shift;
222112µs my $sub = shift;
223112µs my $export_recorder = shift;
224
225 # We need to set the package at import time, so that when
226 # package Foo imports has(), we capture "Foo" as the
227 # package. This lets other packages call Foo::has() and get
228 # the right package. This is done for backwards compatibility
229 # with existing production code, not because this is a good
230 # idea ;)
231
# spent 310µs (150+160) within Moose::Exporter::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Moose/Exporter.pm:241] which was called 21 times, avg 15µs/call: # 21 times (150µs+160µs) by Sub::Exporter::default_generator at line 856 of Sub/Exporter.pm, avg 15µs/call
return sub {
232216µs my $caller = $CALLER;
233
2342124µs21119µs my $wrapper = $self->_curry_wrapper( $sub, $fq_name, $caller );
# spent 119µs making 21 calls to Moose::Exporter::_curry_wrapper, avg 6µs/call
235
2362176µs2141µs my $sub = subname( $fq_name => $wrapper );
# spent 41µs making 21 calls to Sub::Name::subname, avg 2µs/call
237
2382122µs $export_recorder->{$sub} = 1;
239
2402140µs return $sub;
2411138µs };
242}
243
244
# spent 68µs within Moose::Exporter::_make_wrapped_sub_with_meta which was called 16 times, avg 4µs/call: # 16 times (68µs+0s) by Moose::Exporter::_make_sub_exporter_params at line 150, avg 4µs/call
sub _make_wrapped_sub_with_meta {
245165µs my $self = shift;
246164µs my $fq_name = shift;
247162µs my $sub = shift;
248162µs my $export_recorder = shift;
249
250
# spent 7.33ms (4.28+3.06) within Moose::Exporter::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Moose/Exporter.pm:263] which was called 384 times, avg 19µs/call: # 384 times (4.28ms+3.06ms) by Sub::Exporter::default_generator at line 856 of Sub/Exporter.pm, avg 19µs/call
return sub {
251384100µs my $caller = $CALLER;
252
253 my $wrapper = $self->_late_curry_wrapper(
254 $sub, $fq_name,
2554941.53ms4942.95ms
# spent 1.00ms (364µs+637µs) within Moose::Exporter::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Moose/Exporter.pm:255] which was called 110 times, avg 9µs/call: # 110 times (364µs+637µs) by Moose::Role::after or Moose::Role::around or Moose::Role::before or Moose::Role::has or Moose::Role::requires or Moose::Role::with or Moose::extends or Moose::has or Moose::with at line 292, avg 9µs/call
sub { Class::MOP::class_of(shift) } => $caller
# spent 2.31ms making 384 calls to Moose::Exporter::_late_curry_wrapper, avg 6µs/call # spent 637µs making 110 calls to Class::MOP::class_of, avg 6µs/call
256 );
257
2583841.44ms384745µs my $sub = subname( $fq_name => $wrapper );
# spent 745µs making 384 calls to Sub::Name::subname, avg 2µs/call
259
2603841.12ms $export_recorder->{$sub} = 1;
261
262384742µs return $sub;
2631665µs };
264}
265
266
# spent 119µs (108+11) within Moose::Exporter::_curry_wrapper which was called 21 times, avg 6µs/call: # 21 times (108µs+11µs) by Moose::Exporter::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Moose/Exporter.pm:241] at line 234, avg 6µs/call
sub _curry_wrapper {
267215µs my $class = shift;
268214µs my $sub = shift;
269213µs my $fq_name = shift;
2702115µs my @extra = @_;
271
27283247µs6211.8ms my $wrapper = sub { $sub->( @extra, @_ ) };
# spent 11.3ms making 1 call to MooseX::ClassAttribute::class_has # spent 263µs making 60 calls to MooseX::Types::CheckedUtilExports::__ANON__[MooseX/Types/CheckedUtilExports.pm:63], avg 4µs/call # spent 251µs making 1 call to MooseX::Types::CheckedUtilExports::class_type
2732125µs211µs if ( my $proto = prototype $sub ) {
# spent 11µs making 2 calls to Scalar::Util::set_prototype, avg 5µs/call
274
275 # XXX - Perl's prototype sucks. Use & to make set_prototype
276 # ignore the fact that we're passing "private variables"
277 &Scalar::Util::set_prototype( $wrapper, $proto );
278 }
2792146µs return $wrapper;
280}
281
282
# spent 2.31ms within Moose::Exporter::_late_curry_wrapper which was called 384 times, avg 6µs/call: # 384 times (2.31ms+0s) by Moose::Exporter::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Moose/Exporter.pm:263] at line 255, avg 6µs/call
sub _late_curry_wrapper {
28338488µs my $class = shift;
28438459µs my $sub = shift;
28538458µs my $fq_name = shift;
28638440µs my $extra = shift;
287384245µs my @ex_args = @_;
288
289 my $wrapper = sub {
290
291 # resolve curried arguments at runtime via this closure
292110197µs1101.00ms my @curry = ( $extra->(@ex_args) );
# spent 1.00ms making 110 calls to Moose::Exporter::__ANON__[Moose/Exporter.pm:255], avg 9µs/call
293110520µs110827ms return $sub->( @curry, @_ );
# spent 605ms making 17 calls to Moose::extends, avg 35.6ms/call, recursion: max depth 1, time 4.46ms # spent 138ms making 11 calls to Moose::with, avg 12.5ms/call # spent 43.3ms making 34 calls to Moose::has, avg 1.27ms/call # spent 44.9ms making 13 calls to Moose::Role::with, avg 3.46ms/call, recursion: max depth 1, time 2.17ms # spent 1.43ms making 14 calls to Moose::Role::has, avg 102µs/call # spent 213µs making 2 calls to Moose::Role::requires, avg 106µs/call # spent 208µs making 10 calls to Moose::Role::around, avg 21µs/call # spent 144µs making 5 calls to Moose::Role::before, avg 29µs/call # spent 90µs making 4 calls to Moose::Role::after, avg 23µs/call
2943841.01ms };
295
296384101µs if ( my $proto = prototype $sub ) {
297
298 # XXX - Perl's prototype sucks. Use & to make set_prototype
299 # ignore the fact that we're passing "private variables"
300 &Scalar::Util::set_prototype( $wrapper, $proto );
301 }
302384925µs return $wrapper;
303}
304
305
# spent 56µs within Moose::Exporter::_make_import_sub which was called 5 times, avg 11µs/call: # 5 times (56µs+0s) by Moose::Exporter::build_import_methods at line 60, avg 11µs/call
sub _make_import_sub {
30652µs shift;
30753µs my $exporting_package = shift;
30852µs my $exporter = shift;
30951µs my $exports_from = shift;
31052µs my $is_reexport = shift;
311
312
# spent 130ms (2.85+128) within Moose::Exporter::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Moose/Exporter.pm:389] which was called 59 times, avg 2.21ms/call: # 2 times (75µs+2.32ms) by MooseX::Types::import at line 362 of MooseX/Types.pm, avg 1.20ms/call # 2 times (61µs+2.03ms) by MooseX::Types::import at line 365 of MooseX/Types.pm, avg 1.04ms/call # once (50µs+24.6ms) by SimpleDB::Class::BEGIN@138 at line 138 of ../lib/SimpleDB/Class.pm # once (62µs+3.14ms) by MooseX::AttributeHelpers::Collection::ImmutableHash::BEGIN@3 at line 3 of MooseX/AttributeHelpers/Collection/ImmutableHash.pm # once (70µs+2.74ms) by SimpleDB::Client::BEGIN@51 at line 51 of SimpleDB/Client.pm # once (72µs+2.66ms) by Foo::BEGIN@3 at line 3 of lib/Foo.pm # once (65µs+2.51ms) by SimpleDB::Class::Domain::BEGIN@17 at line 17 of ../lib/SimpleDB/Class/Domain.pm # once (66µs+2.49ms) by Foo::Domain::BEGIN@3 at line 3 of lib/Foo/Domain.pm # once (69µs+2.45ms) by MooseX::ClassAttribute::Meta::Method::Accessor::BEGIN@6 at line 6 of MooseX/ClassAttribute/Meta/Method/Accessor.pm # once (66µs+2.44ms) by SimpleDB::Class::ResultSet::BEGIN@21 at line 21 of ../lib/SimpleDB/Class/ResultSet.pm # once (69µs+2.40ms) by Foo::Child::BEGIN@3 at line 3 of lib/Foo/Child.pm # once (65µs+2.39ms) by MooseX::AttributeHelpers::Collection::Array::BEGIN@3 at line 3 of MooseX/AttributeHelpers/Collection/Array.pm # once (63µs+2.35ms) by MooseX::AttributeHelpers::Number::BEGIN@2 at line 2 of MooseX/AttributeHelpers/Number.pm # once (59µs+2.33ms) by MooseX::AttributeHelpers::Collection::Hash::BEGIN@3 at line 3 of MooseX/AttributeHelpers/Collection/Hash.pm # once (47µs+2.31ms) by MooseX::Types::Base::BEGIN@2 at line 2 of MooseX/Types/Base.pm # once (57µs+2.28ms) by MooseX::AttributeHelpers::Collection::List::BEGIN@3 at line 3 of MooseX/AttributeHelpers/Collection/List.pm # once (61µs+2.23ms) by MooseX::AttributeHelpers::Collection::Bag::BEGIN@3 at line 3 of MooseX/AttributeHelpers/Collection/Bag.pm # once (57µs+2.23ms) by Foo::Parent::BEGIN@3 at line 3 of lib/Foo/Parent.pm # once (53µs+2.23ms) by MooseX::AttributeHelpers::Bool::BEGIN@2 at line 2 of MooseX/AttributeHelpers/Bool.pm # once (47µs+2.22ms) by Foo::SubChild::BEGIN@3 at line 3 of lib/Foo/SubChild.pm # once (47µs+2.18ms) by MooseX::AttributeHelpers::Counter::BEGIN@3 at line 3 of MooseX/AttributeHelpers/Counter.pm # once (42µs+2.17ms) by MooseX::Types::BEGIN@2 at line 2 of MooseX/Types.pm # once (64µs+2.12ms) by SimpleDB::Class::Cache::BEGIN@29 at line 29 of ../lib/SimpleDB/Class/Cache.pm # once (55µs+2.09ms) by MooseX::AttributeHelpers::String::BEGIN@3 at line 3 of MooseX/AttributeHelpers/String.pm # once (42µs+2.09ms) by SimpleDB::Class::Item::BEGIN@17 at line 17 of ../lib/SimpleDB/Class/Item.pm # once (44µs+2.06ms) by MooseX::AttributeHelpers::Meta::Method::Provided::BEGIN@3 at line 3 of MooseX/AttributeHelpers/Meta/Method/Provided.pm # once (41µs+1.97ms) by MooseX::AttributeHelpers::Meta::Method::Curried::BEGIN@3 at line 3 of MooseX/AttributeHelpers/Meta/Method/Curried.pm # once (41µs+1.95ms) by SimpleDB::Class::SQL::BEGIN@17 at line 17 of ../lib/SimpleDB/Class/SQL.pm # once (41µs+1.94ms) by SimpleDB::Class::BEGIN@137 at line 137 of ../lib/SimpleDB/Class.pm # once (49µs+1.89ms) by MooseX::AttributeHelpers::Trait::Counter::BEGIN@3 at line 3 of MooseX/AttributeHelpers/Trait/Counter.pm # once (68µs+1.75ms) by SimpleDB::Class::Role::Itemized::BEGIN@3 at line 3 of ../lib/SimpleDB/Class/Role/Itemized.pm # once (63µs+1.75ms) by MooseX::AttributeHelpers::Trait::Number::BEGIN@2 at line 2 of MooseX/AttributeHelpers/Trait/Number.pm # once (45µs+1.61ms) by MooseX::AttributeHelpers::Trait::Bool::BEGIN@2 at line 2 of MooseX/AttributeHelpers/Trait/Bool.pm # once (43µs+1.46ms) by MooseX::AttributeHelpers::MethodProvider::String::BEGIN@3 at line 3 of MooseX/AttributeHelpers/MethodProvider/String.pm # once (46µs+1.45ms) by MooseX::ClassAttribute::Role::Meta::Attribute::BEGIN@8 at line 8 of MooseX/ClassAttribute/Role/Meta/Attribute.pm # once (43µs+1.44ms) by MooseX::AttributeHelpers::Trait::Collection::Array::BEGIN@3 at line 3 of MooseX/AttributeHelpers/Trait/Collection/Array.pm # once (45µs+1.43ms) by MooseX::AttributeHelpers::Trait::Collection::Bag::BEGIN@3 at line 3 of MooseX/AttributeHelpers/Trait/Collection/Bag.pm # once (42µs+1.41ms) by MooseX::AttributeHelpers::MethodProvider::Hash::BEGIN@2 at line 2 of MooseX/AttributeHelpers/MethodProvider/Hash.pm # once (46µs+1.40ms) by MooseX::AttributeHelpers::MethodProvider::Counter::BEGIN@3 at line 3 of MooseX/AttributeHelpers/MethodProvider/Counter.pm # once (41µs+1.38ms) by MooseX::AttributeHelpers::Trait::String::BEGIN@3 at line 3 of MooseX/AttributeHelpers/Trait/String.pm # once (41µs+1.36ms) by MooseX::AttributeHelpers::MethodProvider::Array::BEGIN@2 at line 2 of MooseX/AttributeHelpers/MethodProvider/Array.pm # once (43µs+1.36ms) by MooseX::AttributeHelpers::Trait::Collection::Hash::BEGIN@3 at line 3 of MooseX/AttributeHelpers/Trait/Collection/Hash.pm # once (45µs+1.36ms) by MooseX::AttributeHelpers::Trait::Collection::List::BEGIN@3 at line 3 of MooseX/AttributeHelpers/Trait/Collection/List.pm # once (43µs+1.35ms) by MooseX::AttributeHelpers::Trait::Collection::ImmutableHash::BEGIN@3 at line 3 of MooseX/AttributeHelpers/Trait/Collection/ImmutableHash.pm # once (41µs+1.36ms) by MooseX::AttributeHelpers::MethodProvider::ImmutableHash::BEGIN@2 at line 2 of MooseX/AttributeHelpers/MethodProvider/ImmutableHash.pm # once (42µs+1.35ms) by MooseX::AttributeHelpers::MethodProvider::List::BEGIN@2 at line 2 of MooseX/AttributeHelpers/MethodProvider/List.pm # once (40µs+1.35ms) by MooseX::AttributeHelpers::Trait::Base::BEGIN@3 at line 3 of MooseX/AttributeHelpers/Trait/Base.pm # once (41µs+1.33ms) by MooseX::AttributeHelpers::Trait::Collection::BEGIN@3 at line 3 of MooseX/AttributeHelpers/Trait/Collection.pm # once (41µs+1.32ms) by MooseX::AttributeHelpers::MethodProvider::Bag::BEGIN@2 at line 2 of MooseX/AttributeHelpers/MethodProvider/Bag.pm # once (41µs+1.32ms) by MooseX::AttributeHelpers::MethodProvider::Bool::BEGIN@3 at line 3 of MooseX/AttributeHelpers/MethodProvider/Bool.pm # once (40µs+1.31ms) by MooseX::ClassAttribute::Role::Meta::Class::BEGIN@10 at line 10 of MooseX/ClassAttribute/Role/Meta/Class.pm # once (53µs+1.21ms) by Moose::BEGIN@34 at line 34 of Moose.pm # once (35µs+1.16ms) by MooseX::Types::Base::BEGIN@13 at line 13 of MooseX/Types/Base.pm # once (34µs+1.16ms) by MooseX::Types::BEGIN@10 at line 10 of MooseX/Types.pm # once (32µs+1.15ms) by MooseX::AttributeHelpers::Trait::Collection::Bag::BEGIN@4 at line 4 of MooseX/AttributeHelpers/Trait/Collection/Bag.pm # once (33µs+1.14ms) by Moose::Role::BEGIN@19 at line 19 of Moose/Role.pm # once (29µs+1.13ms) by MooseX::AttributeHelpers::Trait::Base::BEGIN@4 at line 4 of MooseX/AttributeHelpers/Trait/Base.pm
return sub {
313
314 # I think we could use Sub::Exporter's collector feature
315 # to do this, but that would be rather gross, since that
316 # feature isn't really designed to return a value to the
317 # caller of the exporter sub.
318 #
319 # Also, this makes sure we preserve backwards compat for
320 # _get_caller, so it always sees the arguments in the
321 # expected order.
3225913µs my $traits;
32359171µs59782µs ( $traits, @_ ) = _strip_traits(@_);
# spent 782µs making 59 calls to Moose::Exporter::_strip_traits, avg 13µs/call
324
3255912µs my $metaclass;
32659147µs59438µs ( $metaclass, @_ ) = _strip_metaclass(@_);
# spent 438µs making 59 calls to Moose::Exporter::_strip_metaclass, avg 7µs/call
3275917µs $metaclass
328 = Moose::Util::resolve_metaclass_alias( 'Class' => $metaclass )
329 if defined $metaclass && length $metaclass;
330
331 # Normally we could look at $_[0], but in some weird cases
332 # (involving goto &Moose::import), $_[0] ends as something
333 # else (like Squirrel).
3345926µs my $class = $exporting_package;
335
3365994µs59161µs $CALLER = _get_caller(@_);
# spent 161µs making 59 calls to Moose::Exporter::_get_caller, avg 3µs/call
337
338 # this works because both pragmas set $^H (see perldoc
339 # perlvar) which affects the current compilation -
340 # i.e. the file who use'd us - which is why we don't need
341 # to do anything special to make it affect that file
342 # rather than this one (which is already compiled)
343
34459112µs59187µs strict->import;
# spent 187µs making 59 calls to strict::import, avg 3µs/call
34559102µs59640µs warnings->import;
# spent 640µs making 59 calls to warnings::import, avg 11µs/call
346
3475910µs my $did_init_meta;
348118409µs59116µs for my $c ( grep { $_->can('init_meta') } $class, @{$exports_from} ) {
# spent 116µs making 59 calls to UNIVERSAL::can, avg 2µs/call
349
350 # init_meta can apply a role, which when loaded uses
351 # Moose::Exporter, which in turn sets $CALLER, so we need
352 # to protect against that.
3534931µs local $CALLER = $CALLER;
3544973µs4961.7ms $c->init_meta( for_class => $CALLER, metaclass => $metaclass );
# spent 30.6ms making 26 calls to Moose::init_meta, avg 1.18ms/call # spent 24.2ms making 1 call to MooseX::ClassAttribute::init_meta # spent 6.86ms making 22 calls to Moose::Role::init_meta, avg 312µs/call
3554956µs $did_init_meta = 1;
356 }
357
3585939µs if ( $did_init_meta && @{$traits} ) {
359
360 # The traits will use Moose::Role, which in turn uses
361 # Moose::Exporter, which in turn sets $CALLER, so we need
362 # to protect against that.
363 local $CALLER = $CALLER;
364 _apply_meta_traits( $CALLER, $traits );
365 }
366 elsif ( @{$traits} ) {
367 require Moose;
368 Moose->throw_error(
369 "Cannot provide traits when $class does not have an init_meta() method"
370 );
371 }
372
3735935µs my ( undef, @args ) = @_;
3745923µs my $extra = shift @args if ref $args[0] eq 'HASH';
375
3765912µs $extra ||= {};
3775942µs if ( !$extra->{into} ) {
3785534µs $extra->{into_level} ||= 0;
3795514µs $extra->{into_level}++;
380 }
381
38259259µs5963.5ms $class->$exporter( $extra, @args );
# spent 63.5ms making 59 calls to Sub::Exporter::__ANON__[Sub/Exporter.pm:756], avg 1.08ms/call
383
38459356µs for my $name ( keys %{$is_reexport} ) {
385338µs243µs
# spent 27µs (11+16) within Moose::Exporter::BEGIN@385 which was called # once (11µs+16µs) by Moose::BEGIN@14 at line 385
no strict 'refs';
# spent 27µs making 1 call to Moose::Exporter::BEGIN@385 # spent 16µs making 1 call to strict::unimport
3863582µs276µs
# spent 47µs (18+29) within Moose::Exporter::BEGIN@386 which was called # once (18µs+29µs) by Moose::BEGIN@14 at line 386
no warnings 'once';
# spent 47µs making 1 call to Moose::Exporter::BEGIN@386 # spent 28µs making 1 call to warnings::unimport
38796471µs9697µs _flag_as_reexport( \*{ join q{::}, $CALLER, $name } );
# spent 97µs making 96 calls to Moose::Exporter::_flag_as_reexport, avg 1µs/call
388 }
389548µs };
390}
391
392
# spent 782µs (587+194) within Moose::Exporter::_strip_traits which was called 59 times, avg 13µs/call: # 59 times (587µs+194µs) by Moose::Exporter::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Moose/Exporter.pm:389] at line 323, avg 13µs/call
sub _strip_traits {
393122598µs59194µs my $idx = first_index { $_ eq '-traits' } @_;
# spent 194µs making 59 calls to List::MoreUtils::firstidx, avg 3µs/call
394
39559228µs return ( [], @_ ) unless $idx >= 0 && $#_ >= $idx + 1;
396
397 my $traits = $_[ $idx + 1 ];
398
399 splice @_, $idx, 2;
400
401 $traits = [$traits] unless ref $traits;
402
403 return ( $traits, @_ );
404}
405
406
# spent 438µs (365+72) within Moose::Exporter::_strip_metaclass which was called 59 times, avg 7µs/call: # 59 times (365µs+72µs) by Moose::Exporter::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Moose/Exporter.pm:389] at line 326, avg 7µs/call
sub _strip_metaclass {
407122308µs5972µs my $idx = first_index { $_ eq '-metaclass' } @_;
# spent 72µs making 59 calls to List::MoreUtils::firstidx, avg 1µs/call
408
40959160µs return ( undef, @_ ) unless $idx >= 0 && $#_ >= $idx + 1;
410
411 my $metaclass = $_[ $idx + 1 ];
412
413 splice @_, $idx, 2;
414
415 return ( $metaclass, @_ );
416}
417
418sub _apply_meta_traits {
419 my ( $class, $traits ) = @_;
420
421 return unless @{$traits};
422
423 my $meta = Class::MOP::class_of($class);
424
425 my $type = ( split /::/, ref $meta )[-1]
426 or Moose->throw_error(
427 'Cannot determine metaclass type for trait application . Meta isa '
428 . ref $meta );
429
430 my @resolved_traits = map {
431 ref $_
432 ? $_
433 : Moose::Util::resolve_metatrait_alias( $type => $_ )
434 } @$traits;
435
436 return unless @resolved_traits;
437
438 my %args = ( for => $class );
439
440 if ( $meta->isa('Moose::Meta::Role') ) {
441 $args{role_metaroles} = { role => \@resolved_traits };
442 }
443 else {
444 $args{class_metaroles} = { class => \@resolved_traits };
445 }
446
447 Moose::Util::MetaRole::apply_metaroles(%args);
448}
449
450
# spent 161µs within Moose::Exporter::_get_caller which was called 59 times, avg 3µs/call: # 59 times (161µs+0s) by Moose::Exporter::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Moose/Exporter.pm:389] at line 336, avg 3µs/call
sub _get_caller {
451
452 # 1 extra level because it's called by import so there's a layer
453 # of indirection
4545913µs my $offset = 1;
455
456 return
45759201µs ( ref $_[1] && defined $_[1]->{into} ) ? $_[1]->{into}
458 : ( ref $_[1] && defined $_[1]->{into_level} )
459 ? caller( $offset + $_[1]->{into_level} )
460 : caller($offset);
461}
462
463
# spent 35µs within Moose::Exporter::_make_unimport_sub which was called 5 times, avg 7µs/call: # 5 times (35µs+0s) by Moose::Exporter::build_import_methods at line 67, avg 7µs/call
sub _make_unimport_sub {
46452µs shift;
46554µs my $exporting_package = shift;
46652µs my $exports = shift;
46752µs my $export_recorder = shift;
46852µs my $is_reexport = shift;
469
470
# spent 3.24ms (318µs+2.92) within Moose::Exporter::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Moose/Exporter.pm:478] which was called 31 times, avg 104µs/call: # once (17µs+111µs) by SimpleDB::Class::SQL::BEGIN@403 at line 403 of ../lib/SimpleDB/Class/SQL.pm # once (14µs+109µs) by SimpleDB::Class::Cache::BEGIN@448 at line 448 of ../lib/SimpleDB/Class/Cache.pm # once (15µs+105µs) by SimpleDB::Class::BEGIN@450 at line 450 of ../lib/SimpleDB/Class.pm # once (15µs+104µs) by SimpleDB::Client::BEGIN@339 at line 339 of SimpleDB/Client.pm # once (14µs+105µs) by SimpleDB::Class::Domain::BEGIN@458 at line 458 of ../lib/SimpleDB/Class/Domain.pm # once (12µs+106µs) by MooseX::AttributeHelpers::Trait::Counter::BEGIN@48 at line 48 of MooseX/AttributeHelpers/Trait/Counter.pm # once (9µs+109µs) by MooseX::AttributeHelpers::Trait::Collection::Array::BEGIN@22 at line 22 of MooseX/AttributeHelpers/Trait/Collection/Array.pm # once (12µs+104µs) by MooseX::ClassAttribute::Meta::Method::Accessor::BEGIN@120 at line 120 of MooseX/ClassAttribute/Meta/Method/Accessor.pm # once (10µs+103µs) by MooseX::AttributeHelpers::Trait::Bool::BEGIN@35 at line 35 of MooseX/AttributeHelpers/Trait/Bool.pm # once (15µs+96µs) by MooseX::AttributeHelpers::Trait::Number::BEGIN@56 at line 56 of MooseX/AttributeHelpers/Trait/Number.pm # once (7µs+103µs) by MooseX::AttributeHelpers::Trait::Collection::BEGIN@11 at line 11 of MooseX/AttributeHelpers/Trait/Collection.pm # once (8µs+99µs) by MooseX::AttributeHelpers::Trait::Collection::Hash::BEGIN@22 at line 22 of MooseX/AttributeHelpers/Trait/Collection/Hash.pm # once (12µs+94µs) by MooseX::AttributeHelpers::Collection::ImmutableHash::BEGIN@12 at line 12 of MooseX/AttributeHelpers/Collection/ImmutableHash.pm # once (8µs+98µs) by MooseX::AttributeHelpers::Trait::Collection::Bag::BEGIN@36 at line 36 of MooseX/AttributeHelpers/Trait/Collection/Bag.pm # once (8µs+97µs) by MooseX::AttributeHelpers::Trait::Collection::List::BEGIN@22 at line 22 of MooseX/AttributeHelpers/Trait/Collection/List.pm # once (6µs+99µs) by MooseX::AttributeHelpers::Trait::Collection::ImmutableHash::BEGIN@22 at line 22 of MooseX/AttributeHelpers/Trait/Collection/ImmutableHash.pm # once (9µs+95µs) by MooseX::ClassAttribute::Role::Meta::Attribute::BEGIN@138 at line 138 of MooseX/ClassAttribute/Role/Meta/Attribute.pm # once (15µs+89µs) by MooseX::AttributeHelpers::Collection::List::BEGIN@12 at line 12 of MooseX/AttributeHelpers/Collection/List.pm # once (11µs+88µs) by SimpleDB::Class::ResultSet::BEGIN@520 at line 520 of ../lib/SimpleDB/Class/ResultSet.pm # once (9µs+90µs) by MooseX::AttributeHelpers::Collection::Hash::BEGIN@12 at line 12 of MooseX/AttributeHelpers/Collection/Hash.pm # once (7µs+91µs) by MooseX::ClassAttribute::Role::Meta::Class::BEGIN@246 at line 246 of MooseX/ClassAttribute/Role/Meta/Class.pm # once (10µs+85µs) by MooseX::AttributeHelpers::Number::BEGIN@11 at line 11 of MooseX/AttributeHelpers/Number.pm # once (9µs+87µs) by MooseX::AttributeHelpers::Collection::Array::BEGIN@12 at line 12 of MooseX/AttributeHelpers/Collection/Array.pm # once (11µs+84µs) by MooseX::AttributeHelpers::Trait::Collection::Bag::BEGIN@37 at line 37 of MooseX/AttributeHelpers/Trait/Collection/Bag.pm # once (8µs+86µs) by MooseX::AttributeHelpers::Collection::Bag::BEGIN@12 at line 12 of MooseX/AttributeHelpers/Collection/Bag.pm # once (8µs+86µs) by MooseX::AttributeHelpers::Trait::String::BEGIN@48 at line 48 of MooseX/AttributeHelpers/Trait/String.pm # once (7µs+81µs) by MooseX::AttributeHelpers::Trait::Base::BEGIN@219 at line 219 of MooseX/AttributeHelpers/Trait/Base.pm # once (8µs+80µs) by MooseX::AttributeHelpers::Counter::BEGIN@12 at line 12 of MooseX/AttributeHelpers/Counter.pm # once (8µs+80µs) by MooseX::AttributeHelpers::Bool::BEGIN@11 at line 11 of MooseX/AttributeHelpers/Bool.pm # once (8µs+79µs) by MooseX::AttributeHelpers::String::BEGIN@12 at line 12 of MooseX/AttributeHelpers/String.pm # once (9µs+76µs) by MooseX::AttributeHelpers::Trait::Base::BEGIN@220 at line 220 of MooseX/AttributeHelpers/Trait/Base.pm
return sub {
4713130µs my $caller = scalar caller();
472 Moose::Exporter->_remove_keywords(
473 $caller,
47431280µs312.92ms [ keys %{$exports} ],
# spent 2.92ms making 31 calls to Moose::Exporter::_remove_keywords, avg 94µs/call
475 $export_recorder,
476 $is_reexport,
477 );
478525µs };
479}
480
481
# spent 2.92ms (2.86+61µs) within Moose::Exporter::_remove_keywords which was called 31 times, avg 94µs/call: # 31 times (2.86ms+61µs) by Moose::Exporter::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Moose/Exporter.pm:478] at line 474, avg 94µs/call
sub _remove_keywords {
4823112µs shift;
4833116µs my $package = shift;
484319µs my $keywords = shift;
485318µs my $recorded_exports = shift;
486315µs my $is_reexport = shift;
487
488384µs244µs
# spent 26µs (8+18) within Moose::Exporter::BEGIN@488 which was called # once (8µs+18µs) by Moose::BEGIN@14 at line 488
no strict 'refs';
# spent 26µs making 1 call to Moose::Exporter::BEGIN@488 # spent 18µs making 1 call to strict::unimport
489
49031120µs foreach my $name ( @{$keywords} ) {
491408469µs if ( defined &{ $package . '::' . $name } ) {
492408349µs my $sub = \&{ $package . '::' . $name };
493
494 # make sure it is from us
495408212µs next unless $recorded_exports->{$sub};
496
49740868µs if ( $is_reexport->{$name} ) {
4983300µs236µs
# spent 22µs (8+14) within Moose::Exporter::BEGIN@498 which was called # once (8µs+14µs) by Moose::BEGIN@14 at line 498
no strict 'refs';
# spent 22µs making 1 call to Moose::Exporter::BEGIN@498 # spent 14µs making 1 call to strict::unimport
499 next
500 unless _export_is_flagged(
50158294µs5861µs \*{ join q{::} => $package, $name } );
# spent 61µs making 58 calls to Moose::Exporter::_export_is_flagged, avg 1µs/call
502 }
503
504 # and if it is from us, then undef the slot
5054081.09ms delete ${ $package . '::' }{$name};
506 }
507 }
508}
509
510
# spent 91µs within Moose::Exporter::_make_init_meta which was called 5 times, avg 18µs/call: # 5 times (91µs+0s) by Moose::Exporter::build_import_methods at line 74, avg 18µs/call
sub _make_init_meta {
51152µs shift;
51254µs my $class = shift;
51352µs my $args = shift;
514
51552µs my %old_style_roles;
516529µs for my $role (
517 map {"${_}_roles"}
518 qw(
519 metaclass
520 attribute_metaclass
521 method_metaclass
522 wrapped_method_metaclass
523 instance_metaclass
524 constructor_class
525 destructor_class
526 error_class
527 )
528 ) {
5294010µs $old_style_roles{$role} = $args->{$role}
530 if exists $args->{$role};
531 }
532
53352µs my %base_class_roles;
53453µs %base_class_roles = ( roles => $args->{base_class_roles} )
535 if exists $args->{base_class_roles};
536
537 my %new_style_roles = map { $_ => $args->{$_} }
538512µs grep { exists $args->{$_} } qw( class_metaroles role_metaroles );
539
540518µs return unless %new_style_roles || %old_style_roles || %base_class_roles;
541
542 return sub {
543 shift;
544 my %options = @_;
545
546 return unless Class::MOP::class_of( $options{for_class} );
547
548 Moose::Util::MetaRole::apply_metaroles(
549 for => $options{for_class},
550 %new_style_roles,
551 %old_style_roles,
552 );
553
554 Moose::Util::MetaRole::apply_base_class_roles(
555 for_class => $options{for_class},
556 %base_class_roles,
557 )
558 if Class::MOP::class_of( $options{for_class} )
559 ->isa('Moose::Meta::Class');
560
561 return Class::MOP::class_of( $options{for_class} );
562 };
563}
564
565
# spent 102µs (43+59) within Moose::Exporter::import which was called 5 times, avg 20µs/call: # once (9µs+15µs) by Moose::BEGIN@14 at line 14 of Moose.pm # once (9µs+12µs) by MooseX::ClassAttribute::BEGIN@10 at line 10 of MooseX/ClassAttribute.pm # once (9µs+11µs) by MooseX::Types::CheckedUtilExports::BEGIN@13 at line 13 of MooseX/Types/CheckedUtilExports.pm # once (8µs+12µs) by Moose::Role::BEGIN@17 at line 17 of Moose/Role.pm # once (8µs+10µs) by Moose::Util::TypeConstraints::BEGIN@7 at line 7 of Moose/Util/TypeConstraints.pm
sub import {
56657µs510µs strict->import;
# spent 10µs making 5 calls to strict::import, avg 2µs/call
567520µs550µs warnings->import;
# spent 50µs making 5 calls to warnings::import, avg 10µs/call
568}
569
57019µs1;
571
572__END__
573
574=head1 NAME
575
576Moose::Exporter - make an import() and unimport() just like Moose.pm
577
578=head1 SYNOPSIS
579
580 package MyApp::Moose;
581
582 use Moose ();
583 use Moose::Exporter;
584
585 Moose::Exporter->setup_import_methods(
586 with_meta => [ 'has_rw', 'sugar2' ],
587 as_is => [ 'sugar3', \&Some::Random::thing ],
588 also => 'Moose',
589 );
590
591 sub has_rw {
592 my ( $meta, $name, %options ) = @_;
593 $meta->add_attribute(
594 $name,
595 is => 'rw',
596 %options,
597 );
598 }
599
600 # then later ...
601 package MyApp::User;
602
603 use MyApp::Moose;
604
605 has 'name';
606 has_rw 'size';
607 thing;
608
609 no MyApp::Moose;
610
611=head1 DESCRIPTION
612
613This module encapsulates the exporting of sugar functions in a
614C<Moose.pm>-like manner. It does this by building custom C<import>,
615C<unimport>, and C<init_meta> methods for your module, based on a spec you
616provide.
617
618It also lets you "stack" Moose-alike modules so you can export Moose's sugar
619as well as your own, along with sugar from any random C<MooseX> module, as
620long as they all use C<Moose::Exporter>. This feature exists to let you bundle
621a set of MooseX modules into a policy module that developers can use directly
622instead of using Moose itself.
623
624To simplify writing exporter modules, C<Moose::Exporter> also imports
625C<strict> and C<warnings> into your exporter module, as well as into
626modules that use it.
627
628=head1 METHODS
629
630This module provides two public methods:
631
632=over 4
633
634=item B<< Moose::Exporter->setup_import_methods(...) >>
635
636When you call this method, C<Moose::Exporter> builds custom C<import>,
637C<unimport>, and C<init_meta> methods for your module. The C<import> method
638will export the functions you specify, and can also re-export functions
639exported by some other module (like C<Moose.pm>).
640
641The C<unimport> method cleans the caller's namespace of all the exported
642functions. This includes any functions you re-export from other
643packages. However, if the consumer of your package also imports those
644functions from the original package, they will I<not> be cleaned.
645
646If you pass any parameters for L<Moose::Util::MetaRole>, this method will
647generate an C<init_meta> for you as well (see below for details). This
648C<init_meta> will call C<Moose::Util::MetaRole::apply_metaclass_roles> and
649C<Moose::Util::MetaRole::apply_base_class_roles> as needed.
650
651Note that if any of these methods already exist, they will not be
652overridden, you will have to use C<build_import_methods> to get the
653coderef that would be installed.
654
655This method accepts the following parameters:
656
657=over 8
658
659=item * with_meta => [ ... ]
660
661This list of function I<names only> will be wrapped and then exported. The
662wrapper will pass the metaclass object for the caller as its first argument.
663
664Many sugar functions will need to use this metaclass object to do something to
665the calling package.
666
667=item * as_is => [ ... ]
668
669This list of function names or sub references will be exported as-is. You can
670identify a subroutine by reference, which is handy to re-export some other
671module's functions directly by reference (C<\&Some::Package::function>).
672
673If you do export some other package's function, this function will never be
674removed by the C<unimport> method. The reason for this is we cannot know if
675the caller I<also> explicitly imported the sub themselves, and therefore wants
676to keep it.
677
678=item * also => $name or \@names
679
680This is a list of modules which contain functions that the caller
681wants to export. These modules must also use C<Moose::Exporter>. The
682most common use case will be to export the functions from C<Moose.pm>.
683Functions specified by C<with_meta> or C<as_is> take precedence over
684functions exported by modules specified by C<also>, so that a module
685can selectively override functions exported by another module.
686
687C<Moose::Exporter> also makes sure all these functions get removed
688when C<unimport> is called.
689
690=back
691
692You can also provide parameters for C<Moose::Util::MetaRole::apply_metaroles>
693and C<Moose::Util::MetaRole::base_class_roles>. Specifically, valid parameters
694are "class_metaroles", "role_metaroles", and "base_object_roles".
695
696=item B<< Moose::Exporter->build_import_methods(...) >>
697
698Returns two or three code refs, one for C<import>, one for
699C<unimport>, and optionally one for C<init_meta>, if the appropriate
700options are passed in.
701
702Accepts the additional C<install> option, which accepts an arrayref of method
703names to install into your exporting package. The valid options are C<import>,
704C<unimport>, and C<init_meta>. Calling C<setup_import_methods> is equivalent
705to calling C<build_import_methods> with C<< install => [qw(import unimport
706init_meta)] >> except that it doesn't also return the methods.
707
708Used by C<setup_import_methods>.
709
710=back
711
712=head1 IMPORTING AND init_meta
713
714If you want to set an alternative base object class or metaclass class, see
715above for details on how this module can call L<Moose::Util::MetaRole> for
716you.
717
718If you want to do something that is not supported by this module, simply
719define an C<init_meta> method in your class. The C<import> method that
720C<Moose::Exporter> generates for you will call this method (if it exists). It
721will always pass the caller to this method via the C<for_class> parameter.
722
723Most of the time, your C<init_meta> method will probably just call C<<
724Moose->init_meta >> to do the real work:
725
726 sub init_meta {
727 shift; # our class name
728 return Moose->init_meta( @_, metaclass => 'My::Metaclass' );
729 }
730
731Keep in mind that C<build_import_methods> will return an C<init_meta>
732method for you, which you can also call from within your custom
733C<init_meta>:
734
735 my ( $import, $unimport, $init_meta ) =
736 Moose::Exporter->build_import_methods( ... );
737
738 sub import {
739 my $class = shift;
740
741 ...
742
743 $class->$import(...);
744
745 ...
746 }
747
748 sub unimport { goto &$unimport }
749
750 sub init_meta {
751 my $class = shift;
752
753 ...
754
755 $class->$init_meta(...);
756
757 ...
758 }
759
760=head1 METACLASS TRAITS
761
762The C<import> method generated by C<Moose::Exporter> will allow the
763user of your module to specify metaclass traits in a C<-traits>
764parameter passed as part of the import:
765
766 use Moose -traits => 'My::Meta::Trait';
767
768 use Moose -traits => [ 'My::Meta::Trait', 'My::Other::Trait' ];
769
770These traits will be applied to the caller's metaclass
771instance. Providing traits for an exporting class that does not create
772a metaclass for the caller is an error.
773
774=head1 BUGS
775
776See L<Moose/BUGS> for details on reporting bugs.
777
778=head1 AUTHOR
779
780Dave Rolsky E<lt>autarch@urth.orgE<gt>
781
782This is largely a reworking of code in Moose.pm originally written by
783Stevan Little and others.
784
785=head1 COPYRIGHT AND LICENSE
786
787Copyright 2009 by Infinity Interactive, Inc.
788
789L<http://www.iinteractive.com>
790
791This library is free software; you can redistribute it and/or modify
792it under the same terms as Perl itself.
793
794=cut
# spent 61µs within Moose::Exporter::_export_is_flagged which was called 58 times, avg 1µs/call: # 58 times (61µs+0s) by Moose::Exporter::_remove_keywords at line 501 of Moose/Exporter.pm, avg 1µs/call
sub Moose::Exporter::_export_is_flagged; # xsub
# spent 97µs within Moose::Exporter::_flag_as_reexport which was called 96 times, avg 1µs/call: # 96 times (97µs+0s) by Moose::Exporter::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Moose/Exporter.pm:389] at line 387 of Moose/Exporter.pm, avg 1µs/call
sub Moose::Exporter::_flag_as_reexport; # xsub