← Index
NYTProf Performance Profile   « block view • line view • sub view »
For mentat.storage.mongo.pl
  Run on Tue Jun 24 10:04:38 2014
Reported on Tue Jun 24 10:05:14 2014

Filename/usr/local/lib/perl/5.14.2/Moose/Exporter.pm
StatementsExecuted 4442 statements in 8.65ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
1113.48ms68.8msMoose::Exporter::::BEGIN@13Moose::Exporter::BEGIN@13
1112.20ms2.77msMoose::Exporter::::BEGIN@17Moose::Exporter::BEGIN@17
14111.06ms8.50msMoose::Exporter::::__ANON__[:137]Moose::Exporter::__ANON__[:137]
111834µs1.04msMoose::Exporter::::BEGIN@15Moose::Exporter::BEGIN@15
8811594µs1.25msMoose::Exporter::::__ANON__[:379]Moose::Exporter::__ANON__[:379]
141412547µs43.5msMoose::Exporter::::__ANON__[:519]Moose::Exporter::__ANON__[:519]
8811458µs458µsMoose::Exporter::::_late_curry_wrapperMoose::Exporter::_late_curry_wrapper
211259µs401µsMoose::Exporter::::_make_sub_exporter_paramsMoose::Exporter::_make_sub_exporter_params
1411208µs208µsMoose::Exporter::::_collect_metarolesMoose::Exporter::_collect_metaroles
6011176µs461µsMoose::Exporter::::__ANON__[:252]Moose::Exporter::__ANON__[:252]
1411136µs459µsMoose::Exporter::::_apply_metarolesMoose::Exporter::_apply_metaroles
1411127µs187µsMoose::Exporter::::_strip_traitsMoose::Exporter::_strip_traits
2921103µs103µsMoose::Exporter::::_sub_from_packageMoose::Exporter::_sub_from_package
211100µs1.74msMoose::Exporter::::build_import_methodsMoose::Exporter::build_import_methods
1011198µs98µsMoose::Exporter::::__ANON__[:307]Moose::Exporter::__ANON__[:307]
141184µs106µsMoose::Exporter::::_strip_meta_nameMoose::Exporter::_strip_meta_name
282182µs211µsMoose::Exporter::::__ANON__[:42]Moose::Exporter::__ANON__[:42]
141181µs103µsMoose::Exporter::::_strip_metaclassMoose::Exporter::_strip_metaclass
141130µs30µsMoose::Exporter::::_get_callerMoose::Exporter::_get_caller
81129µs29µsMoose::Exporter::::_make_wrapped_sub_with_metaMoose::Exporter::_make_wrapped_sub_with_meta
21128µs28µsMoose::Exporter::::_make_init_metaMoose::Exporter::_make_init_meta
221125µs25µsMoose::Exporter::::_flag_as_reexportMoose::Exporter::_flag_as_reexport (xsub)
21122µs924µsMoose::Exporter::::_make_exporterMoose::Exporter::_make_exporter
22221µs1.76msMoose::Exporter::::setup_import_methodsMoose::Exporter::setup_import_methods
21118µs28µsMoose::Exporter::::_die_if_cycle_found_in_also_list_for_packageMoose::Exporter::_die_if_cycle_found_in_also_list_for_package
21118µs68µsMoose::Exporter::::_follow_alsoMoose::Exporter::_follow_also
21118µs18µsMoose::Exporter::::_make_import_subMoose::Exporter::_make_import_sub
22214µs31µsMoose::Exporter::::importMoose::Exporter::import
11112µs36µsMoose::Exporter::::BEGIN@16Moose::Exporter::BEGIN@16
2119µs12µsMoose::Exporter::::_follow_also_realMoose::Exporter::_follow_also_real
1119µs44µsMoose::Exporter::::BEGIN@716Moose::Exporter::BEGIN@716
1119µs9µsMoose::Exporter::::BEGIN@2Moose::Exporter::BEGIN@2
2118µs8µsMoose::Exporter::::_make_unimport_subMoose::Exporter::_make_unimport_sub
1118µs19µsMoose::Exporter::::BEGIN@132Moose::Exporter::BEGIN@132
4218µs8µsMoose::Exporter::::_also_list_for_packageMoose::Exporter::_also_list_for_package
1118µs42µsMoose::Exporter::::BEGIN@14Moose::Exporter::BEGIN@14
1117µs18µsMoose::Exporter::::BEGIN@321Moose::Exporter::BEGIN@321
2117µs7µsMoose::Exporter::::_parse_trait_aliasesMoose::Exporter::_parse_trait_aliases
1117µs10µsMoose::Exporter::::BEGIN@9Moose::Exporter::BEGIN@9
1117µs32µsMoose::Exporter::::BEGIN@18Moose::Exporter::BEGIN@18
1117µs16µsMoose::Exporter::::BEGIN@726Moose::Exporter::BEGIN@726
1117µs17µsMoose::Exporter::::BEGIN@133Moose::Exporter::BEGIN@133
1117µs12µsMoose::Exporter::::BEGIN@10Moose::Exporter::BEGIN@10
1116µs31µsMoose::Exporter::::BEGIN@12Moose::Exporter::BEGIN@12
2114µs4µsMoose::Exporter::::_die_if_also_list_cycles_back_to_existing_stackMoose::Exporter::_die_if_also_list_cycles_back_to_existing_stack
0000s0sMoose::Exporter::::__ANON__[:228]Moose::Exporter::__ANON__[:228]
0000s0sMoose::Exporter::::__ANON__[:356]Moose::Exporter::__ANON__[:356]
0000s0sMoose::Exporter::::__ANON__[:388]Moose::Exporter::__ANON__[:388]
0000s0sMoose::Exporter::::__ANON__[:410]Moose::Exporter::__ANON__[:410]
0000s0sMoose::Exporter::::__ANON__[:523]Moose::Exporter::__ANON__[:523]
0000s0sMoose::Exporter::::__ANON__[:537]Moose::Exporter::__ANON__[:537]
0000s0sMoose::Exporter::::__ANON__[:549]Moose::Exporter::__ANON__[:549]
0000s0sMoose::Exporter::::__ANON__[:706]Moose::Exporter::__ANON__[:706]
0000s0sMoose::Exporter::::__ANON__[:778]Moose::Exporter::__ANON__[:778]
0000s0sMoose::Exporter::::_apply_meta_traitsMoose::Exporter::_apply_meta_traits
0000s0sMoose::Exporter::::_curry_wrapperMoose::Exporter::_curry_wrapper
0000s0sMoose::Exporter::::_make_wrapped_subMoose::Exporter::_make_wrapped_sub
0000s0sMoose::Exporter::::_remove_keywordsMoose::Exporter::_remove_keywords
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
# spent 9µs within Moose::Exporter::BEGIN@2 which was called: # once (9µs+0s) by Moose::BEGIN@18 at line 4
BEGIN {
314µs $Moose::Exporter::AUTHORITY = 'cpan:STEVAN';
4129µs19µs}
# spent 9µs making 1 call to Moose::Exporter::BEGIN@2
5{
621µs $Moose::Exporter::VERSION = '2.1005';
7}
8
9221µs214µs
# spent 10µs (7+3) within Moose::Exporter::BEGIN@9 which was called: # once (7µs+3µs) by Moose::BEGIN@18 at line 9
use strict;
# spent 10µs making 1 call to Moose::Exporter::BEGIN@9 # spent 3µs making 1 call to strict::import
10222µs217µs
# spent 12µs (7+5) within Moose::Exporter::BEGIN@10 which was called: # once (7µs+5µs) by Moose::BEGIN@18 at line 10
use warnings;
# spent 12µs making 1 call to Moose::Exporter::BEGIN@10 # spent 5µs making 1 call to warnings::import
11
12222µs256µs
# spent 31µs (6+25) within Moose::Exporter::BEGIN@12 which was called: # once (6µs+25µs) by Moose::BEGIN@18 at line 12
use Class::Load qw(is_class_loaded);
# spent 31µs making 1 call to Moose::Exporter::BEGIN@12 # spent 25µs making 1 call to Exporter::import
132114µs168.8ms
# spent 68.8ms (3.48+65.3) within Moose::Exporter::BEGIN@13 which was called: # once (3.48ms+65.3ms) by Moose::BEGIN@18 at line 13
use Class::MOP;
# spent 68.8ms making 1 call to Moose::Exporter::BEGIN@13
14225µs275µs
# spent 42µs (8+33) within Moose::Exporter::BEGIN@14 which was called: # once (8µs+33µs) by Moose::BEGIN@18 at line 14
use List::MoreUtils qw( first_index uniq );
# spent 42µs making 1 call to Moose::Exporter::BEGIN@14 # spent 33µs making 1 call to Exporter::import
152159µs11.04ms
# spent 1.04ms (834µs+207µs) within Moose::Exporter::BEGIN@15 which was called: # once (834µs+207µs) by Moose::BEGIN@18 at line 15
use Moose::Util::MetaRole;
# spent 1.04ms making 1 call to Moose::Exporter::BEGIN@15
16234µs261µs
# spent 36µs (12+25) within Moose::Exporter::BEGIN@16 which was called: # once (12µs+25µs) by Moose::BEGIN@18 at line 16
use Scalar::Util qw(reftype);
# spent 36µs making 1 call to Moose::Exporter::BEGIN@16 # spent 25µs making 1 call to Exporter::import
173115µs32.90ms
# spent 2.77ms (2.20+567µs) within Moose::Exporter::BEGIN@17 which was called: # once (2.20ms+567µs) by Moose::BEGIN@18 at line 17
use Sub::Exporter 0.980;
# spent 2.77ms making 1 call to Moose::Exporter::BEGIN@17 # spent 122µs making 1 call to Sub::Exporter::__ANON__[Sub/Exporter.pm:337] # spent 12µs making 1 call to UNIVERSAL::VERSION
182429µs257µs
# spent 32µs (7+25) within Moose::Exporter::BEGIN@18 which was called: # once (7µs+25µs) by Moose::BEGIN@18 at line 18
use Sub::Name qw(subname);
# spent 32µs making 1 call to Moose::Exporter::BEGIN@18 # spent 25µs making 1 call to Exporter::import
19
201200nsmy %EXPORT_SPEC;
21
22
# spent 1.76ms (21µs+1.74) within Moose::Exporter::setup_import_methods which was called 2 times, avg 879µs/call: # once (10µs+977µs) by Moose::Meta::Attribute::BEGIN@24 at line 44 of Moose/Util/TypeConstraints.pm # once (11µs+761µs) by MongoDB::Connection::BEGIN@24 at line 137 of Moose.pm
sub setup_import_methods {
23620µs my ( $class, %args ) = @_;
24
25 $args{exporting_package} ||= caller();
26
2721.74ms $class->build_import_methods(
# spent 1.74ms making 2 calls to Moose::Exporter::build_import_methods, avg 869µs/call
28 %args,
29 install => [qw(import unimport init_meta)]
30 );
31}
32
33# A reminder to intrepid Moose hackers
34# there may be more than one level of exporter
35# don't make doy cry. -- perigrin
36
37
# spent 1.74ms (100µs+1.64) within Moose::Exporter::build_import_methods which was called 2 times, avg 869µs/call: # 2 times (100µs+1.64ms) by Moose::Exporter::setup_import_methods at line 27, avg 869µs/call
sub build_import_methods {
383259µs my ( $class, %args ) = @_;
39
40 my $exporting_package = $args{exporting_package} ||= caller();
41
422873µs28129µs
# spent 211µs (82+129) within Moose::Exporter::__ANON__[/usr/local/lib/perl/5.14.2/Moose/Exporter.pm:42] which was called 28 times, avg 8µs/call: # 14 times (37µs+73µs) by Moose::Exporter::__ANON__[/usr/local/lib/perl/5.14.2/Moose/Exporter.pm:137] at line 108, avg 8µs/call # 14 times (46µs+56µs) by Moose::Exporter::_apply_metaroles at line 566, avg 7µs/call
my $meta_lookup = $args{meta_lookup} || sub { Class::MOP::class_of(shift) };
# spent 129µs making 28 calls to Class::MOP::class_of, avg 5µs/call
43
44 $EXPORT_SPEC{$exporting_package} = \%args;
45
46268µs my @exports_from = $class->_follow_also($exporting_package);
# spent 68µs making 2 calls to Moose::Exporter::_follow_also, avg 34µs/call
47
48 my $export_recorder = {};
49 my $is_reexport = {};
50
512401µs my $exports = $class->_make_sub_exporter_params(
# spent 401µs making 2 calls to Moose::Exporter::_make_sub_exporter_params, avg 200µs/call
52 [ $exporting_package, @exports_from ],
53 $export_recorder,
54 $is_reexport,
55 $args{meta_lookup}, # so that we don't pass through the default
56 );
57
582924µs my $exporter = $class->_make_exporter(
# spent 924µs making 2 calls to Moose::Exporter::_make_exporter, avg 462µs/call
59 $exports,
60 $is_reexport,
61 $meta_lookup,
62 );
63
64 my %methods;
65218µs $methods{import} = $class->_make_import_sub(
# spent 18µs making 2 calls to Moose::Exporter::_make_import_sub, avg 9µs/call
66 $exporting_package,
67 $exporter,
68 \@exports_from,
69 $is_reexport,
70 $meta_lookup,
71 );
72
7328µs $methods{unimport} = $class->_make_unimport_sub(
# spent 8µs making 2 calls to Moose::Exporter::_make_unimport_sub, avg 4µs/call
74 $exporting_package,
75 $exports,
76 $export_recorder,
77 $is_reexport,
78 $meta_lookup,
79 );
80
81228µs $methods{init_meta} = $class->_make_init_meta(
# spent 28µs making 2 calls to Moose::Exporter::_make_init_meta, avg 14µs/call
82 $exporting_package,
83 \%args,
84 $meta_lookup,
85 );
86
87262µs my $package = Class::MOP::Package->initialize($exporting_package);
# spent 62µs making 2 calls to Class::MOP::Package::initialize, avg 31µs/call
882900ns for my $to_install ( @{ $args{install} || [] } ) {
891621µs my $symbol = '&' . $to_install;
90 next
91473µs unless $methods{$to_install}
# spent 73µs making 4 calls to Class::MOP::Package::has_package_symbol, avg 18µs/call
92 && !$package->has_package_symbol($symbol);
93457µs $package->add_package_symbol( $symbol, $methods{$to_install} );
# spent 57µs making 4 calls to Class::MOP::Package::add_package_symbol, avg 14µs/call
94 }
95
96 return ( $methods{import}, $methods{unimport}, $methods{init_meta} );
97}
98
99
# spent 924µs (22+901) within Moose::Exporter::_make_exporter which was called 2 times, avg 462µs/call: # 2 times (22µs+901µs) by Moose::Exporter::build_import_methods at line 58, avg 462µs/call
sub _make_exporter {
100420µs my ($class, $exports, $is_reexport, $meta_lookup) = @_;
101
102 return Sub::Exporter::build_exporter(
103 {
104 exports => $exports,
105 groups => { default => [':all'] },
106
# spent 8.50ms (1.06+7.44) within Moose::Exporter::__ANON__[/usr/local/lib/perl/5.14.2/Moose/Exporter.pm:137] which was called 14 times, avg 607µs/call: # 14 times (1.06ms+7.44ms) by Sub::Exporter::_do_import at line 380 of Sub/Exporter.pm, avg 607µs/call
installer => sub {
107107232µs my ($arg, $to_export) = @_;
10814110µs my $meta = $meta_lookup->($arg->{into});
# spent 110µs making 14 calls to Moose::Exporter::__ANON__[Moose/Exporter.pm:42], avg 8µs/call
109
1101614µs goto &Sub::Exporter::default_installer unless $meta;
# spent 614µs making 1 call to Sub::Exporter::default_installer
111
112 # don't overwrite existing symbols with our magically flagged
113 # version of it if we would install the same sub that's already
114 # in the importer
115
116 my @filtered_to_export;
117 my %installed;
118863593µs for (my $i = 0; $i < @{ $to_export }; $i += 2) {
11917022µs my ($as, $cv) = @{ $to_export }[$i, $i + 1];
120
1211701.37ms next if !ref($as)
# spent 1.37ms making 170 calls to Class::MOP::Package::has_package_symbol, avg 8µs/call
122 && $meta->has_package_symbol('&' . $as)
123 && $meta->get_package_symbol('&' . $as) == $cv;
124
125 push @filtered_to_export, $as, $cv;
126 $installed{$as} = 1 unless ref $as;
127 }
128
129135.94ms Sub::Exporter::default_installer($arg, \@filtered_to_export);
# spent 5.94ms making 13 calls to Sub::Exporter::default_installer, avg 457µs/call
130
131135µs for my $name ( keys %{$is_reexport} ) {
132225µs230µs
# spent 19µs (8+11) within Moose::Exporter::BEGIN@132 which was called: # once (8µs+11µs) by Moose::BEGIN@18 at line 132
no strict 'refs';
# spent 19µs making 1 call to Moose::Exporter::BEGIN@132 # spent 11µs making 1 call to strict::unimport
1332823µs226µs
# spent 17µs (7+10) within Moose::Exporter::BEGIN@133 which was called: # once (7µs+10µs) by Moose::BEGIN@18 at line 133
no warnings 'once';
# spent 17µs making 1 call to Moose::Exporter::BEGIN@133 # spent 10µs making 1 call to warnings::unimport
1344499µs next unless exists $installed{$name};
1352216µs2225µs _flag_as_reexport( \*{ join q{::}, $arg->{into}, $name } );
# spent 25µs making 22 calls to Moose::Exporter::_flag_as_reexport, avg 1µs/call
136 }
137 },
138 }
1392901µs );
# spent 901µs making 2 calls to Sub::Exporter::build_exporter, avg 451µs/call
140}
141
142
# spent 68µs (18+49) within Moose::Exporter::_follow_also which was called 2 times, avg 34µs/call: # 2 times (18µs+49µs) by Moose::Exporter::build_import_methods at line 46, avg 34µs/call
sub _follow_also {
143826µs my $class = shift;
144 my $exporting_package = shift;
145
146228µs _die_if_cycle_found_in_also_list_for_package($exporting_package);
# spent 28µs making 2 calls to Moose::Exporter::_die_if_cycle_found_in_also_list_for_package, avg 14µs/call
147
148421µs return uniq( _follow_also_real($exporting_package) );
# spent 12µs making 2 calls to Moose::Exporter::_follow_also_real, avg 6µs/call # spent 10µs making 2 calls to List::MoreUtils::uniq, avg 5µs/call
149}
150
151
# spent 12µs (9+3) within Moose::Exporter::_follow_also_real which was called 2 times, avg 6µs/call: # 2 times (9µs+3µs) by Moose::Exporter::_follow_also at line 148, avg 6µs/call
sub _follow_also_real {
15267µs my $exporting_package = shift;
15323µs my @also = _also_list_for_package($exporting_package);
# spent 3µs making 2 calls to Moose::Exporter::_also_list_for_package, avg 1µs/call
154
155 return map { $_, _follow_also_real($_) } @also;
156}
157
158
# spent 8µs within Moose::Exporter::_also_list_for_package which was called 4 times, avg 2µs/call: # 2 times (6µs+0s) by Moose::Exporter::_die_if_cycle_found_in_also_list_for_package at line 180, avg 3µs/call # 2 times (3µs+0s) by Moose::Exporter::_follow_also_real at line 153, avg 1µs/call
sub _also_list_for_package {
1591618µs my $package = shift;
160
161 if ( !exists $EXPORT_SPEC{$package} ) {
162 my $loaded = is_class_loaded($package);
163
164 die "Package in also ($package) does not seem to "
165 . "use Moose::Exporter"
166 . ( $loaded ? "" : " (is it loaded?)" );
167 }
168
169 my $also = $EXPORT_SPEC{$package}{also};
170
171 return unless defined $also;
172
173 return ref $also ? @$also : $also;
174}
175
176# this is no Tarjan algorithm, but for the list sizes expected,
177# brute force will probably be fine (and more maintainable)
178
# spent 28µs (18+10) within Moose::Exporter::_die_if_cycle_found_in_also_list_for_package which was called 2 times, avg 14µs/call: # 2 times (18µs+10µs) by Moose::Exporter::_follow_also at line 146, avg 14µs/call
sub _die_if_cycle_found_in_also_list_for_package {
179410µs my $package = shift;
180410µs _die_if_also_list_cycles_back_to_existing_stack(
# spent 6µs making 2 calls to Moose::Exporter::_also_list_for_package, avg 3µs/call # spent 4µs making 2 calls to Moose::Exporter::_die_if_also_list_cycles_back_to_existing_stack, avg 2µs/call
181 [ _also_list_for_package($package) ],
182 [$package],
183 );
184}
185
186
# spent 4µs within Moose::Exporter::_die_if_also_list_cycles_back_to_existing_stack which was called 2 times, avg 2µs/call: # 2 times (4µs+0s) by Moose::Exporter::_die_if_cycle_found_in_also_list_for_package at line 180, avg 2µs/call
sub _die_if_also_list_cycles_back_to_existing_stack {
18747µs my ( $also_list, $existing_stack ) = @_;
188
189 return unless @$also_list && @$existing_stack;
190
191 for my $also_member (@$also_list) {
192 for my $stack_member (@$existing_stack) {
193 next unless $also_member eq $stack_member;
194
195 die
196 "Circular reference in 'also' parameter to Moose::Exporter between "
197 . join(
198 ', ',
199 @$existing_stack
200 ) . " and $also_member";
201 }
202
203 _die_if_also_list_cycles_back_to_existing_stack(
204 [ _also_list_for_package($also_member) ],
205 [ $also_member, @$existing_stack ],
206 );
207 }
208}
209
210
# spent 7µs within Moose::Exporter::_parse_trait_aliases which was called 2 times, avg 4µs/call: # 2 times (7µs+0s) by Moose::Exporter::_make_sub_exporter_params at line 281, avg 4µs/call
sub _parse_trait_aliases {
2111010µs my $class = shift;
212 my ($package, $aliases) = @_;
213
214 my @ret;
215 for my $alias (@$aliases) {
216 my $name;
217 if (ref($alias)) {
218 reftype($alias) eq 'ARRAY'
219 or Moose->throw_error(reftype($alias) . " references are not "
220 . "valid arguments to the 'trait_aliases' "
221 . "option");
222
223 ($alias, $name) = @$alias;
224 }
225 else {
226 ($name = $alias) =~ s/.*:://;
227 }
228 push @ret, subname "${package}::${name}" => sub () { $alias };
229 }
230
231 return @ret;
232}
233
234
# spent 401µs (259+142) within Moose::Exporter::_make_sub_exporter_params which was called 2 times, avg 200µs/call: # 2 times (259µs+142µs) by Moose::Exporter::build_import_methods at line 51, avg 200µs/call
sub _make_sub_exporter_params {
2351812µs my $class = shift;
236 my $packages = shift;
237 my $export_recorder = shift;
238 my $is_reexport = shift;
239 my $meta_lookup_override = shift;
240
241 my %exports;
242 my $current_meta_lookup;
243
2442900ns for my $package ( @{$packages} ) {
2451621µs my $args = $EXPORT_SPEC{$package}
246 or die "The $package package does not use Moose::Exporter\n";
247
248 $current_meta_lookup = $meta_lookup_override || $args->{meta_lookup};
249 $meta_lookup_override = $current_meta_lookup;
250
251 my $meta_lookup = $current_meta_lookup
25260148µs60285µs
# spent 461µs (176+285) within Moose::Exporter::__ANON__[/usr/local/lib/perl/5.14.2/Moose/Exporter.pm:252] which was called 60 times, avg 8µs/call: # 60 times (176µs+285µs) by Moose::around or Moose::has at line 408, avg 8µs/call
|| sub { Class::MOP::class_of(shift) };
# spent 285µs making 60 calls to Class::MOP::class_of, avg 5µs/call
253
2542900ns for my $name ( @{ $args->{with_meta} } ) {
2552431µs824µs my $sub = $class->_sub_from_package( $package, $name )
# spent 24µs making 8 calls to Moose::Exporter::_sub_from_package, avg 3µs/call
256 or next;
257
258 my $fq_name = $package . '::' . $name;
259
260829µs $exports{$name} = $class->_make_wrapped_sub_with_meta(
# spent 29µs making 8 calls to Moose::Exporter::_make_wrapped_sub_with_meta, avg 4µs/call
261 $fq_name,
262 $sub,
263 $export_recorder,
264 $meta_lookup,
265 ) unless exists $exports{$name};
266 }
267
268210µs for my $name ( @{ $args->{with_caller} } ) {
269 my $sub = $class->_sub_from_package( $package, $name )
270 or next;
271
272 my $fq_name = $package . '::' . $name;
273
274 $exports{$name} = $class->_make_wrapped_sub(
275 $fq_name,
276 $sub,
277 $export_recorder,
278 ) unless exists $exports{$name};
279 }
280
28127µs my @extra_exports = $class->_parse_trait_aliases(
# spent 7µs making 2 calls to Moose::Exporter::_parse_trait_aliases, avg 4µs/call
282 $package, $args->{trait_aliases},
283 );
2842800ns for my $name ( @{ $args->{as_is} }, @extra_exports ) {
28592105µs my ( $sub, $coderef_name );
286
2875044µs if ( ref $name ) {
288 $sub = $name;
289
290 my $coderef_pkg;
29122µs ( $coderef_pkg, $coderef_name )
# spent 2µs making 2 calls to Class::MOP::get_code_info, avg 1µs/call
292 = Class::MOP::get_code_info($name);
293
29421µs if ( $coderef_pkg ne $package ) {
295 $is_reexport->{$coderef_name} = 1;
296 }
297 }
298 else {
2992179µs $sub = $class->_sub_from_package( $package, $name )
# spent 79µs making 21 calls to Moose::Exporter::_sub_from_package, avg 4µs/call
300 or next;
301
302 $coderef_name = $name;
303 }
304
305 $export_recorder->{$sub} = 1;
306
307101162µs
# spent 98µs within Moose::Exporter::__ANON__[/usr/local/lib/perl/5.14.2/Moose/Exporter.pm:307] which was called 101 times, avg 970ns/call: # 101 times (98µs+0s) by Sub::Exporter::default_generator at line 419 of Sub/Exporter.pm, avg 970ns/call
$exports{$coderef_name} = sub { $sub }
308 unless exists $exports{$coderef_name};
309 }
310 }
311
312 return \%exports;
313}
314
315
# spent 103µs within Moose::Exporter::_sub_from_package which was called 29 times, avg 4µs/call: # 21 times (79µs+0s) by Moose::Exporter::_make_sub_exporter_params at line 299, avg 4µs/call # 8 times (24µs+0s) by Moose::Exporter::_make_sub_exporter_params at line 255, avg 3µs/call
sub _sub_from_package {
31614581µs my $sclass = shift;
317 my $package = shift;
318 my $name = shift;
319
3202926µs my $sub = do {
32121.50ms228µs
# spent 18µs (7+11) within Moose::Exporter::BEGIN@321 which was called: # once (7µs+11µs) by Moose::BEGIN@18 at line 321
no strict 'refs';
# spent 18µs making 1 call to Moose::Exporter::BEGIN@321 # spent 10µs making 1 call to strict::unimport
3222923µs \&{ $package . '::' . $name };
323 };
324
325 return $sub if defined &$sub;
326
327 Carp::cluck "Trying to export undefined sub ${package}::${name}";
328
329 return;
330}
331
3321100nsour $CALLER;
333
334sub _make_wrapped_sub {
335 my $self = shift;
336 my $fq_name = shift;
337 my $sub = shift;
338 my $export_recorder = shift;
339
340 # We need to set the package at import time, so that when
341 # package Foo imports has(), we capture "Foo" as the
342 # package. This lets other packages call Foo::has() and get
343 # the right package. This is done for backwards compatibility
344 # with existing production code, not because this is a good
345 # idea ;)
346 return sub {
347 my $caller = $CALLER;
348
349 my $wrapper = $self->_curry_wrapper( $sub, $fq_name, $caller );
350
351 my $sub = subname( $fq_name => $wrapper );
352
353 $export_recorder->{$sub} = 1;
354
355 return $sub;
356 };
357}
358
359
# spent 29µs within Moose::Exporter::_make_wrapped_sub_with_meta which was called 8 times, avg 4µs/call: # 8 times (29µs+0s) by Moose::Exporter::_make_sub_exporter_params at line 260, avg 4µs/call
sub _make_wrapped_sub_with_meta {
3604837µs my $self = shift;
361 my $fq_name = shift;
362 my $sub = shift;
363 my $export_recorder = shift;
364 my $meta_lookup = shift;
365
366
# spent 1.25ms (594µs+656µs) within Moose::Exporter::__ANON__[/usr/local/lib/perl/5.14.2/Moose/Exporter.pm:379] which was called 88 times, avg 14µs/call: # 88 times (594µs+656µs) by Sub::Exporter::default_generator at line 419 of Sub/Exporter.pm, avg 14µs/call
return sub {
367440750µs my $caller = $CALLER;
368
36988458µs my $wrapper = $self->_late_curry_wrapper(
# spent 458µs making 88 calls to Moose::Exporter::_late_curry_wrapper, avg 5µs/call
370 $sub, $fq_name,
371 $meta_lookup => $caller
372 );
373
37488197µs my $sub = subname( $fq_name => $wrapper );
# spent 197µs making 88 calls to Sub::Name::subname, avg 2µs/call
375
376 $export_recorder->{$sub} = 1;
377
378 return $sub;
379 };
380}
381
382sub _curry_wrapper {
383 my $class = shift;
384 my $sub = shift;
385 my $fq_name = shift;
386 my @extra = @_;
387
388 my $wrapper = sub { $sub->( @extra, @_ ) };
389 if ( my $proto = prototype $sub ) {
390
391 # XXX - Perl's prototype sucks. Use & to make set_prototype
392 # ignore the fact that we're passing "private variables"
393 &Scalar::Util::set_prototype( $wrapper, $proto );
394 }
395 return $wrapper;
396}
397
398
# spent 458µs within Moose::Exporter::_late_curry_wrapper which was called 88 times, avg 5µs/call: # 88 times (458µs+0s) by Moose::Exporter::__ANON__[/usr/local/lib/perl/5.14.2/Moose/Exporter.pm:379] at line 369, avg 5µs/call
sub _late_curry_wrapper {
399704563µs my $class = shift;
400 my $sub = shift;
401 my $fq_name = shift;
402 my $extra = shift;
403 my @ex_args = @_;
404
405 my $wrapper = sub {
406
407 # resolve curried arguments at runtime via this closure
408120344µs60461µs my @curry = ( $extra->(@ex_args) );
# spent 461µs making 60 calls to Moose::Exporter::__ANON__[Moose/Exporter.pm:252], avg 8µs/call
40960110ms return $sub->( @curry, @_ );
# spent 109ms making 58 calls to Moose::has, avg 1.88ms/call # spent 538µs making 2 calls to Moose::around, avg 269µs/call
410 };
411
412 if ( my $proto = prototype $sub ) {
413
414 # XXX - Perl's prototype sucks. Use & to make set_prototype
415 # ignore the fact that we're passing "private variables"
416 &Scalar::Util::set_prototype( $wrapper, $proto );
417 }
418 return $wrapper;
419}
420
421
# spent 18µs within Moose::Exporter::_make_import_sub which was called 2 times, avg 9µs/call: # 2 times (18µs+0s) by Moose::Exporter::build_import_methods at line 65, avg 9µs/call
sub _make_import_sub {
4221420µs shift;
423 my $exporting_package = shift;
424 my $exporter = shift;
425 my $exports_from = shift;
426 my $is_reexport = shift;
427 my $meta_lookup = shift;
428
429
# spent 43.5ms (547µs+42.9) within Moose::Exporter::__ANON__[/usr/local/lib/perl/5.14.2/Moose/Exporter.pm:519] which was called 14 times, avg 3.10ms/call: # once (43µs+5.02ms) by MongoDB::Connection::BEGIN@24 at line 24 of MongoDB/Connection.pm # once (48µs+3.88ms) by MongoDB::Timestamp::BEGIN@26 at line 26 of MongoDB/Timestamp.pm # once (46µs+3.46ms) by MongoDB::Database::BEGIN@25 at line 25 of MongoDB/Database.pm # once (35µs+3.46ms) by MongoDB::DBRef::BEGIN@24 at line 24 of MongoDB/DBRef.pm # once (34µs+3.46ms) by MongoDB::Cursor::BEGIN@24 at line 24 of MongoDB/Cursor.pm # once (35µs+3.41ms) by MongoDB::OID::BEGIN@24 at line 24 of MongoDB/OID.pm # once (35µs+3.37ms) by MongoDB::GridFS::File::BEGIN@25 at line 25 of MongoDB/GridFS/File.pm # once (35µs+3.34ms) by MongoDB::BSON::Binary::BEGIN@25 at line 25 of MongoDB/BSON/Binary.pm # once (35µs+3.32ms) by MongoDB::GridFS::BEGIN@25 at line 25 of MongoDB/GridFS.pm # once (37µs+2.98ms) by MongoDB::MongoClient::BEGIN@24 at line 24 of MongoDB/MongoClient.pm # once (48µs+2.81ms) by MongoDB::Collection::BEGIN@27 at line 27 of MongoDB/Collection.pm # once (34µs+1.55ms) by MongoDB::DBRef::BEGIN@25 at line 25 of MongoDB/DBRef.pm # once (33µs+1.51ms) by MongoDB::MongoClient::BEGIN@25 at line 25 of MongoDB/MongoClient.pm # once (49µs+1.35ms) by Moose::BEGIN@43 at line 43 of Moose.pm
return sub {
430
431 # I think we could use Sub::Exporter's collector feature
432 # to do this, but that would be rather gross, since that
433 # feature isn't really designed to return a value to the
434 # caller of the exporter sub.
435 #
436 # Also, this makes sure we preserve backwards compat for
437 # _get_caller, so it always sees the arguments in the
438 # expected order.
439280318µs my $traits;
44014187µs ( $traits, @_ ) = _strip_traits(@_);
# spent 187µs making 14 calls to Moose::Exporter::_strip_traits, avg 13µs/call
441
442 my $metaclass;
44314103µs ( $metaclass, @_ ) = _strip_metaclass(@_);
# spent 103µs making 14 calls to Moose::Exporter::_strip_metaclass, avg 7µs/call
444 $metaclass
445 = Moose::Util::resolve_metaclass_alias( 'Class' => $metaclass )
446 if defined $metaclass && length $metaclass;
447
448 my $meta_name;
44914106µs ( $meta_name, @_ ) = _strip_meta_name(@_);
# spent 106µs making 14 calls to Moose::Exporter::_strip_meta_name, avg 8µs/call
450
451 # Normally we could look at $_[0], but in some weird cases
452 # (involving goto &Moose::import), $_[0] ends as something
453 # else (like Squirrel).
454 my $class = $exporting_package;
455
4561430µs $CALLER = _get_caller(@_);
# spent 30µs making 14 calls to Moose::Exporter::_get_caller, avg 2µs/call
457
458 # this works because both pragmas set $^H (see perldoc
459 # perlvar) which affects the current compilation -
460 # i.e. the file who use'd us - which is why we don't need
461 # to do anything special to make it affect that file
462 # rather than this one (which is already compiled)
463
4641433µs strict->import;
# spent 33µs making 14 calls to strict::import, avg 2µs/call
4651472µs warnings->import;
# spent 72µs making 14 calls to warnings::import, avg 5µs/call
466
467 my $did_init_meta;
4682870µs1426µs for my $c ( grep { $_->can('init_meta') } $class, @{$exports_from} ) {
# spent 26µs making 14 calls to UNIVERSAL::can, avg 2µs/call
469
470 # init_meta can apply a role, which when loaded uses
471 # Moose::Exporter, which in turn sets $CALLER, so we need
472 # to protect against that.
4733333µs local $CALLER = $CALLER;
4741125.2ms $c->init_meta(
# spent 25.2ms making 11 calls to Moose::init_meta, avg 2.29ms/call
475 for_class => $CALLER,
476 metaclass => $metaclass,
477 meta_name => $meta_name,
478 );
479 $did_init_meta = 1;
480 }
481
482 {
483 # The metaroles will use Moose::Role, which in turn uses
484 # Moose::Exporter, which in turn sets $CALLER, so we need
485 # to protect against that.
4862832µs local $CALLER = $CALLER;
48714459µs _apply_metaroles(
# spent 459µs making 14 calls to Moose::Exporter::_apply_metaroles, avg 33µs/call
488 $CALLER,
489 [$class, @$exports_from],
490 $meta_lookup
491 );
492 }
493
494255µs if ( $did_init_meta && @{$traits} ) {
495
496 # The traits will use Moose::Role, which in turn uses
497 # Moose::Exporter, which in turn sets $CALLER, so we need
498 # to protect against that.
499 local $CALLER = $CALLER;
500 _apply_meta_traits( $CALLER, $traits, $meta_lookup );
501 }
502 elsif ( @{$traits} ) {
503 require Moose;
504 Moose->throw_error(
505 "Cannot provide traits when $class does not have an init_meta() method"
506 );
507 }
508
509 my ( undef, @args ) = @_;
510 my $extra = shift @args if ref $args[0] eq 'HASH';
511
512 $extra ||= {};
5132812µs if ( !$extra->{into} ) {
514 $extra->{into_level} ||= 0;
515 $extra->{into_level}++;
516 }
517
5181416.7ms $class->$exporter( $extra, @args );
# spent 16.7ms making 14 calls to Sub::Exporter::__ANON__[Sub/Exporter.pm:337], avg 1.19ms/call
519 };
520}
521
522
# spent 187µs (127+61) within Moose::Exporter::_strip_traits which was called 14 times, avg 13µs/call: # 14 times (127µs+61µs) by Moose::Exporter::__ANON__[/usr/local/lib/perl/5.14.2/Moose/Exporter.pm:519] at line 440, avg 13µs/call
sub _strip_traits {
52342204µs1461µs my $idx = first_index { ( $_ || '' ) eq '-traits' } @_;
# spent 61µs making 14 calls to List::MoreUtils::firstidx, avg 4µs/call
524
525 return ( [], @_ ) unless $idx >= 0 && $#_ >= $idx + 1;
526
527 my $traits = $_[ $idx + 1 ];
528
529 splice @_, $idx, 2;
530
531 $traits = [$traits] unless ref $traits;
532
533 return ( $traits, @_ );
534}
535
536
# spent 103µs (81+22) within Moose::Exporter::_strip_metaclass which was called 14 times, avg 7µs/call: # 14 times (81µs+22µs) by Moose::Exporter::__ANON__[/usr/local/lib/perl/5.14.2/Moose/Exporter.pm:519] at line 443, avg 7µs/call
sub _strip_metaclass {
53742115µs1422µs my $idx = first_index { ( $_ || '' ) eq '-metaclass' } @_;
# spent 22µs making 14 calls to List::MoreUtils::firstidx, avg 2µs/call
538
539 return ( undef, @_ ) unless $idx >= 0 && $#_ >= $idx + 1;
540
541 my $metaclass = $_[ $idx + 1 ];
542
543 splice @_, $idx, 2;
544
545 return ( $metaclass, @_ );
546}
547
548
# spent 106µs (84+21) within Moose::Exporter::_strip_meta_name which was called 14 times, avg 8µs/call: # 14 times (84µs+21µs) by Moose::Exporter::__ANON__[/usr/local/lib/perl/5.14.2/Moose/Exporter.pm:519] at line 449, avg 8µs/call
sub _strip_meta_name {
54942117µs1421µs my $idx = first_index { ( $_ || '' ) eq '-meta_name' } @_;
# spent 21µs making 14 calls to List::MoreUtils::firstidx, avg 2µs/call
550
551 return ( 'meta', @_ ) unless $idx >= 0 && $#_ >= $idx + 1;
552
553 my $meta_name = $_[ $idx + 1 ];
554
555 splice @_, $idx, 2;
556
557 return ( $meta_name, @_ );
558}
559
560
# spent 459µs (136+324) within Moose::Exporter::_apply_metaroles which was called 14 times, avg 33µs/call: # 14 times (136µs+324µs) by Moose::Exporter::__ANON__[/usr/local/lib/perl/5.14.2/Moose/Exporter.pm:519] at line 487, avg 33µs/call
sub _apply_metaroles {
56196140µs my ($class, $exports_from, $meta_lookup) = @_;
562
56314208µs my $metaroles = _collect_metaroles($exports_from);
# spent 208µs making 14 calls to Moose::Exporter::_collect_metaroles, avg 15µs/call
564 my $base_class_roles = delete $metaroles->{base_class_roles};
565
56614101µs my $meta = $meta_lookup->($class);
# spent 101µs making 14 calls to Moose::Exporter::__ANON__[Moose/Exporter.pm:42], avg 7µs/call
567 # for instance, Moose.pm uses Moose::Util::TypeConstraints
568 return unless $meta;
569
570 Moose::Util::MetaRole::apply_metaroles(
571 for => $meta,
572 %$metaroles,
573 ) if keys %$metaroles;
574
5751314µs Moose::Util::MetaRole::apply_base_class_roles(
# spent 14µs making 13 calls to UNIVERSAL::isa, avg 1µs/call
576 for => $meta,
577 roles => $base_class_roles,
578 ) if $meta->isa('Class::MOP::Class')
579 && $base_class_roles && @$base_class_roles;
580}
581
582
# spent 208µs within Moose::Exporter::_collect_metaroles which was called 14 times, avg 15µs/call: # 14 times (208µs+0s) by Moose::Exporter::_apply_metaroles at line 563, avg 15µs/call
sub _collect_metaroles {
583112130µs my ($exports_from) = @_;
584
58511221µs my @old_style_role_types = map { "${_}_roles" } qw(
586 metaclass
587 attribute_metaclass
588 method_metaclass
589 wrapped_method_metaclass
590 instance_metaclass
591 constructor_class
592 destructor_class
593 error_class
594 );
595
596 my %class_metaroles;
597 my %role_metaroles;
598 my @base_class_roles;
599 my %old_style_roles;
600
601 for my $exporter (@$exports_from) {
6027034µs my $data = $EXPORT_SPEC{$exporter};
603
604 if (exists $data->{class_metaroles}) {
605 for my $type (keys %{ $data->{class_metaroles} }) {
606 push @{ $class_metaroles{$type} ||= [] },
607 @{ $data->{class_metaroles}{$type} };
608 }
609 }
610
611 if (exists $data->{role_metaroles}) {
612 for my $type (keys %{ $data->{role_metaroles} }) {
613 push @{ $role_metaroles{$type} ||= [] },
614 @{ $data->{role_metaroles}{$type} };
615 }
616 }
617
618 if (exists $data->{base_class_roles}) {
619 push @base_class_roles, @{ $data->{base_class_roles} };
620 }
621
622 for my $type (@old_style_role_types) {
62311240µs if (exists $data->{$type}) {
624 push @{ $old_style_roles{$type} ||= [] },
625 @{ $data->{$type} };
626 }
627 }
628 }
629
630 return {
631 (keys(%class_metaroles)
632 ? (class_metaroles => \%class_metaroles)
633 : ()),
634 (keys(%role_metaroles)
635 ? (role_metaroles => \%role_metaroles)
636 : ()),
637 (@base_class_roles
638 ? (base_class_roles => \@base_class_roles)
639 : ()),
640 %old_style_roles,
641 };
642}
643
644sub _apply_meta_traits {
645 my ( $class, $traits, $meta_lookup ) = @_;
646
647 return unless @{$traits};
648
649 my $meta = $meta_lookup->($class);
650
651 my $type = $meta->isa('Moose::Meta::Role') ? 'Role'
652 : $meta->isa('Class::MOP::Class') ? 'Class'
653 : Moose->throw_error('Cannot determine metaclass type for '
654 . 'trait application. Meta isa '
655 . ref $meta);
656
657 my @resolved_traits = map {
658 ref $_
659 ? $_
660 : Moose::Util::resolve_metatrait_alias( $type => $_ )
661 } @$traits;
662
663 return unless @resolved_traits;
664
665 my %args = ( for => $class );
666
667 if ( $meta->isa('Moose::Meta::Role') ) {
668 $args{role_metaroles} = { role => \@resolved_traits };
669 }
670 else {
671 $args{class_metaroles} = { class => \@resolved_traits };
672 }
673
674 Moose::Util::MetaRole::apply_metaroles(%args);
675}
676
677
# spent 30µs within Moose::Exporter::_get_caller which was called 14 times, avg 2µs/call: # 14 times (30µs+0s) by Moose::Exporter::__ANON__[/usr/local/lib/perl/5.14.2/Moose/Exporter.pm:519] at line 456, avg 2µs/call
sub _get_caller {
678
679 # 1 extra level because it's called by import so there's a layer
680 # of indirection
6812843µs my $offset = 1;
682
683 return
684 ( ref $_[1] && defined $_[1]->{into} ) ? $_[1]->{into}
685 : ( ref $_[1] && defined $_[1]->{into_level} )
686 ? caller( $offset + $_[1]->{into_level} )
687 : caller($offset);
688}
689
690
# spent 8µs within Moose::Exporter::_make_unimport_sub which was called 2 times, avg 4µs/call: # 2 times (8µs+0s) by Moose::Exporter::build_import_methods at line 73, avg 4µs/call
sub _make_unimport_sub {
6911411µs shift;
692 my $exporting_package = shift;
693 my $exports = shift;
694 my $export_recorder = shift;
695 my $is_reexport = shift;
696 my $meta_lookup = shift;
697
698 return sub {
699 my $caller = scalar caller();
700 Moose::Exporter->_remove_keywords(
701 $caller,
702 [ keys %{$exports} ],
703 $export_recorder,
704 $is_reexport,
705 );
706 };
707}
708
709sub _remove_keywords {
710 shift;
711 my $package = shift;
712 my $keywords = shift;
713 my $recorded_exports = shift;
714 my $is_reexport = shift;
715
716287µs279µs
# spent 44µs (9+35) within Moose::Exporter::BEGIN@716 which was called: # once (9µs+35µs) by Moose::BEGIN@18 at line 716
no strict 'refs';
# spent 44µs making 1 call to Moose::Exporter::BEGIN@716 # spent 35µs making 1 call to strict::unimport
717
718 foreach my $name ( @{$keywords} ) {
719 if ( defined &{ $package . '::' . $name } ) {
720 my $sub = \&{ $package . '::' . $name };
721
722 # make sure it is from us
723 next unless $recorded_exports->{$sub};
724
725 if ( $is_reexport->{$name} ) {
7262248µs226µs
# spent 16µs (7+9) within Moose::Exporter::BEGIN@726 which was called: # once (7µs+9µs) by Moose::BEGIN@18 at line 726
no strict 'refs';
# spent 16µs making 1 call to Moose::Exporter::BEGIN@726 # spent 9µs making 1 call to strict::unimport
727 next
728 unless _export_is_flagged(
729 \*{ join q{::} => $package, $name } );
730 }
731
732 # and if it is from us, then undef the slot
733 delete ${ $package . '::' }{$name};
734 }
735 }
736}
737
738# maintain this for now for backcompat
739# make sure to return a sub to install in the same circumstances as previously
740# but this functionality now happens at the end of ->import
741
# spent 28µs within Moose::Exporter::_make_init_meta which was called 2 times, avg 14µs/call: # 2 times (28µs+0s) by Moose::Exporter::build_import_methods at line 81, avg 14µs/call
sub _make_init_meta {
7422021µs shift;
743 my $class = shift;
744 my $args = shift;
745 my $meta_lookup = shift;
746
747 my %old_style_roles;
748163µs for my $role (
749 map {"${_}_roles"}
750 qw(
751 metaclass
752 attribute_metaclass
753 method_metaclass
754 wrapped_method_metaclass
755 instance_metaclass
756 constructor_class
757 destructor_class
758 error_class
759 )
760 ) {
761166µs $old_style_roles{$role} = $args->{$role}
762 if exists $args->{$role};
763 }
764
765 my %base_class_roles;
766 %base_class_roles = ( roles => $args->{base_class_roles} )
767 if exists $args->{base_class_roles};
768
769 my %new_style_roles = map { $_ => $args->{$_} }
7704700ns grep { exists $args->{$_} } qw( class_metaroles role_metaroles );
771
772 return unless %new_style_roles || %old_style_roles || %base_class_roles;
773
774 return sub {
775 shift;
776 my %opts = @_;
777 $meta_lookup->($opts{for_class});
778 };
779}
780
781
# spent 31µs (14+16) within Moose::Exporter::import which was called 2 times, avg 15µs/call: # once (9µs+10µs) by Moose::BEGIN@18 at line 18 of Moose.pm # once (6µs+6µs) by Moose::Util::TypeConstraints::BEGIN@13 at line 13 of Moose/Util/TypeConstraints.pm
sub import {
782410µs24µs strict->import;
# spent 4µs making 2 calls to strict::import, avg 2µs/call
783212µs warnings->import;
# spent 12µs making 2 calls to warnings::import, avg 6µs/call
784}
785
78613µs1;
787
788# ABSTRACT: make an import() and unimport() just like Moose.pm
789
790__END__
 
# spent 25µs within Moose::Exporter::_flag_as_reexport which was called 22 times, avg 1µs/call: # 22 times (25µs+0s) by Moose::Exporter::__ANON__[/usr/local/lib/perl/5.14.2/Moose/Exporter.pm:137] at line 135, avg 1µs/call
sub Moose::Exporter::_flag_as_reexport; # xsub