← Index
NYTProf Performance Profile   « block view • line view • sub view »
For mongo_pain.pl
  Run on Fri Mar 25 17:00:29 2011
Reported on Fri Mar 25 17:07:09 2011

Filename/usr/local/lib/perl/5.10.1/Mouse/Util.pm
StatementsExecuted 183 statements in 3.39ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
17112.89ms4.20msMouse::Util::::_try_load_one_classMouse::Util::_try_load_one_class (recurses: max depth 1, inclusive time 32µs)
1111.01ms2.42msMouse::Util::::BEGIN@135Mouse::Util::BEGIN@135
111531µs1.71msMouse::Util::::BEGIN@22Mouse::Util::BEGIN@22
2231326µs326µsMouse::Util::::install_subroutinesMouse::Util::install_subroutines
174285µs4.27msMouse::Util::::load_classMouse::Util::load_class (recurses: max depth 1, inclusive time 48µs)
592162µs62µsMouse::Util::::is_a_type_constraintMouse::Util::is_a_type_constraint (xsub)
171149µs49µsMouse::Util::::is_class_loadedMouse::Util::is_class_loaded (xsub)
81144µs44µsMouse::Util::::generate_isa_predicate_forMouse::Util::generate_isa_predicate_for (xsub)
33124µs24µsMouse::Util::::generate_can_predicate_forMouse::Util::generate_can_predicate_for (xsub)
171119µs19µsMouse::Util::::is_valid_class_nameMouse::Util::is_valid_class_name (xsub)
11119µs26µsMouse::Util::::BEGIN@2Mouse::Util::BEGIN@2
11114µs29µsMouse::Util::::BEGIN@15Mouse::Util::BEGIN@15
1119µs20µsMouse::Util::::BEGIN@16Mouse::Util::BEGIN@16
1119µs22µsMouse::Util::::BEGIN@95Mouse::Util::BEGIN@95
1119µs22µsMouse::Util::::BEGIN@14Mouse::Util::BEGIN@14
2218µs8µsMouse::Util::::CORE:substMouse::Util::CORE:subst (opcode)
1116µs6µsMouse::Util::::BEGIN@134Mouse::Util::BEGIN@134
1116µs6µsMouse::Util::::ENDMouse::Util::END
2114µs4µsMouse::Util::::get_code_infoMouse::Util::get_code_info (xsub)
1113µs3µsMouse::Util::::__register_metaclass_storageMouse::Util::__register_metaclass_storage (xsub)
0000s0sMouse::Util::::__ANON__[:104]Mouse::Util::__ANON__[:104]
0000s0sMouse::Util::::__ANON__[:128]Mouse::Util::__ANON__[:128]
0000s0sMouse::Util::::__ANON__[:79]Mouse::Util::__ANON__[:79]
0000s0sMouse::Util::::apply_all_rolesMouse::Util::apply_all_roles
0000s0sMouse::Util::::doesMouse::Util::does
0000s0sMouse::Util::::does_roleMouse::Util::does_role
0000s0sMouse::Util::::dumpMouse::Util::dump
0000s0sMouse::Util::::english_listMouse::Util::english_list
0000s0sMouse::Util::::find_metaMouse::Util::find_meta
0000s0sMouse::Util::::load_first_existing_classMouse::Util::load_first_existing_class
0000s0sMouse::Util::::metaMouse::Util::meta
0000s0sMouse::Util::::not_supportedMouse::Util::not_supported
0000s0sMouse::Util::::quoted_english_listMouse::Util::quoted_english_list
0000s0sMouse::Util::::resolve_metaclass_aliasMouse::Util::resolve_metaclass_alias
0000s0sMouse::Util::::throw_errorMouse::Util::throw_error
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Mouse::Util;
2381µs234µs
# spent 26µs (19+8) within Mouse::Util::BEGIN@2 which was called: # once (19µs+8µs) by Mouse::BEGIN@4 at line 2
use Mouse::Exporter; # enables strict and warnings
# spent 26µs making 1 call to Mouse::Util::BEGIN@2 # spent 8µs making 1 call to Mouse::Exporter::import
3
4# Note that those which don't exist here are defined in XS or Mouse::PurePerl
5
6# must be here because it will be refered by other modules loaded
7sub get_linear_isa($;$); ## no critic
8
9# must be here because it will called in Mouse::Exporter
10
# spent 326µs within Mouse::Util::install_subroutines which was called 22 times, avg 15µs/call: # 10 times (172µs+0s) by Mouse::Exporter::do_import at line 215 of Mouse/Exporter.pm, avg 17µs/call # 9 times (87µs+0s) by Mouse::Exporter::do_import at line 212 of Mouse/Exporter.pm, avg 10µs/call # 3 times (67µs+0s) by Mouse::Exporter::setup_import_methods at line 48 of Mouse/Exporter.pm, avg 22µs/call
sub install_subroutines {
1111µs my $into = shift;
12
1319µs while(my($name, $code) = splice @_, 0, 2){
14338µs234µs
# spent 22µs (9+13) within Mouse::Util::BEGIN@14 which was called: # once (9µs+13µs) by Mouse::BEGIN@4 at line 14
no strict 'refs';
# spent 22µs making 1 call to Mouse::Util::BEGIN@14 # spent 13µs making 1 call to strict::unimport
15335µs244µs
# spent 29µs (14+15) within Mouse::Util::BEGIN@15 which was called: # once (14µs+15µs) by Mouse::BEGIN@4 at line 15
no warnings 'once', 'redefine';
# spent 29µs making 1 call to Mouse::Util::BEGIN@15 # spent 15µs making 1 call to warnings::unimport
163380µs231µs
# spent 20µs (9+11) within Mouse::Util::BEGIN@16 which was called: # once (9µs+11µs) by Mouse::BEGIN@4 at line 16
use warnings FATAL => 'uninitialized';
# spent 20µs making 1 call to Mouse::Util::BEGIN@16 # spent 11µs making 1 call to warnings::import
17414µs *{$into . '::' . $name} = \&{$code};
18 }
1915µs return;
20}
21
22
# spent 1.71ms (531µs+1.18) within Mouse::Util::BEGIN@22 which was called: # once (531µs+1.18ms) by Mouse::BEGIN@4 at line 132
BEGIN{
23 # This is used in Mouse::PurePerl
2419µs1263µs Mouse::Exporter->setup_import_methods(
# spent 263µs making 1 call to Mouse::Exporter::setup_import_methods
25 as_is => [qw(
26 find_meta
27 does_role
28 resolve_metaclass_alias
29 apply_all_roles
30 english_list
31
32 load_class
33 is_class_loaded
34
35 get_linear_isa
36 get_code_info
37
38 get_code_package
39 get_code_ref
40
41 not_supported
42
43 does meta throw_error dump
44 )],
45 groups => {
46 default => [], # export no functions by default
47
48 # The ':meta' group is 'use metaclass' for Mouse
49 meta => [qw(does meta dump throw_error)],
50 },
51 );
52
531600ns our $VERSION = '0.91';
54
5512µs my $xs = !(defined(&is_valid_class_name) || $ENV{MOUSE_PUREPERL} || $ENV{PERL_ONLY});
56
57 # Because Mouse::Util is loaded first in all the Mouse sub-modules,
58 # XSLoader must be placed here, not in Mouse.pm.
591300ns if($xs){
60 # XXX: XSLoader tries to get the object path from caller's file name
61 # $hack_mouse_file fools its mechanism
6219µs13µs (my $hack_mouse_file = __FILE__) =~ s/.Util//; # .../Mouse/Util.pm -> .../Mouse.pm
# spent 3µs making 1 call to Mouse::Util::CORE:subst
63197µs $xs = eval sprintf("#line %d %s\n", __LINE__, $hack_mouse_file) . q{
64 local $^W = 0; # workaround 'redefine' warning to &install_subroutines
65 require XSLoader;
66 XSLoader::load('Mouse', $VERSION);
67 Mouse::Util->import({ into => 'Mouse::Meta::Method::Constructor::XS' }, ':meta');
68 Mouse::Util->import({ into => 'Mouse::Meta::Method::Destructor::XS' }, ':meta');
69 Mouse::Util->import({ into => 'Mouse::Meta::Method::Accessor::XS' }, ':meta');
70 return 1;
71 } || 0;
721500ns warn $@ if $@ && $ENV{MOUSE_XS};
73 }
74
751200ns if(!$xs){
76 require 'Mouse/PurePerl.pm'; # we don't want to create its namespace
77 }
78
79110µs *MOUSE_XS = sub(){ $xs };
80
81 # definition of mro::get_linear_isa()
821200ns my $get_linear_isa;
832109µs if (eval { require mro }) {
84 $get_linear_isa = \&mro::get_linear_isa;
85 }
86 else {
87 # this code is based on MRO::Compat::__get_linear_isa
88 my $_get_linear_isa_dfs; # this recurses so it isn't pretty
89 $_get_linear_isa_dfs = sub {
90 my($classname) = @_;
91
92 my @lin = ($classname);
93 my %stored;
94
953287µs235µs
# spent 22µs (9+13) within Mouse::Util::BEGIN@95 which was called: # once (9µs+13µs) by Mouse::BEGIN@4 at line 95
no strict 'refs';
# spent 22µs making 1 call to Mouse::Util::BEGIN@95 # spent 13µs making 1 call to strict::unimport
96 foreach my $parent (@{"$classname\::ISA"}) {
97 foreach my $p(@{ $_get_linear_isa_dfs->($parent) }) {
98 next if exists $stored{$p};
99 push(@lin, $p);
100 $stored{$p} = 1;
101 }
102 }
103 return \@lin;
104 };
105
106 {
107 package # hide from PAUSE
108 Class::C3;
109 our %MRO; # avoid 'once' warnings
110 }
111
112 # MRO::Compat::__get_linear_isa has no prototype, so
113 # we define a prototyped version for compatibility with core's
114 # See also MRO::Compat::__get_linear_isa.
115 $get_linear_isa = sub ($;$){
116 my($classname, $type) = @_;
117
118 if(!defined $type){
119 $type = exists $Class::C3::MRO{$classname} ? 'c3' : 'dfs';
120 }
121 if($type eq 'c3'){
122 require Class::C3;
123 return [Class::C3::calculateMRO($classname)];
124 }
125 else{
126 return $_get_linear_isa_dfs->($classname);
127 }
128 };
129 }
130
131111µs *get_linear_isa = $get_linear_isa;
132136µs11.71ms}
# spent 1.71ms making 1 call to Mouse::Util::BEGIN@22
133
134331µs16µs
# spent 6µs within Mouse::Util::BEGIN@134 which was called: # once (6µs+0s) by Mouse::BEGIN@4 at line 134
use Carp ();
# spent 6µs making 1 call to Mouse::Util::BEGIN@134
13531.65ms12.42ms
# spent 2.42ms (1.01+1.41) within Mouse::Util::BEGIN@135 which was called: # once (1.01ms+1.41ms) by Mouse::BEGIN@4 at line 135
use Scalar::Util ();
# spent 2.42ms making 1 call to Mouse::Util::BEGIN@135
136
137# aliases as public APIs
138# it must be 'require', not 'use', because Mouse::Meta::Module depends on Mouse::Util
139182µsrequire Mouse::Meta::Module; # for the entities of metaclass cache utilities
140
141# aliases
142{
14322µs *class_of = \&Mouse::Meta::Module::_class_of;
1441500ns *get_metaclass_by_name = \&Mouse::Meta::Module::_get_metaclass_by_name;
1451500ns *get_all_metaclass_instances = \&Mouse::Meta::Module::_get_all_metaclass_instances;
1461500ns *get_all_metaclass_names = \&Mouse::Meta::Module::_get_all_metaclass_names;
147
1481500ns *Mouse::load_class = \&load_class;
1491400ns *Mouse::is_class_loaded = \&is_class_loaded;
150
151 # is-a predicates
152 #generate_isa_predicate_for('Mouse::Meta::TypeConstraint' => 'is_a_type_constraint');
153 #generate_isa_predicate_for('Mouse::Meta::Class' => 'is_a_metaclass');
154 #generate_isa_predicate_for('Mouse::Meta::Role' => 'is_a_metarole');
155
156 # duck type predicates
157119µs112µs generate_can_predicate_for(['_compiled_type_constraint'] => 'is_a_type_constraint');
# spent 12µs making 1 call to Mouse::Util::generate_can_predicate_for
158113µs18µs generate_can_predicate_for(['create_anon_class'] => 'is_a_metaclass');
# spent 8µs making 1 call to Mouse::Util::generate_can_predicate_for
15918µs14µs generate_can_predicate_for(['create_anon_role'] => 'is_a_metarole');
# spent 4µs making 1 call to Mouse::Util::generate_can_predicate_for
160}
161
1621300nsour $in_global_destruction = 0;
16318µs
# spent 6µs within Mouse::Util::END which was called: # once (6µs+0s) by main::RUNTIME at line 0 of mongo_pain.pl
END{ $in_global_destruction = 1 }
164
165# Moose::Util compatible utilities
166
167sub find_meta{
168 return class_of( $_[0] );
169}
170
171sub does_role{
172 my ($class_or_obj, $role_name) = @_;
173
174 my $meta = class_of($class_or_obj);
175
176 (defined $role_name)
177 || ($meta || 'Mouse::Meta::Class')->throw_error("You must supply a role name to does()");
178
179 return defined($meta) && $meta->does_role($role_name);
180}
181
182# taken from Mouse::Util (0.90)
183{
1842800ns my %cache;
185
186 sub resolve_metaclass_alias {
187 my ( $type, $metaclass_name, %options ) = @_;
188
189 my $cache_key = $type . q{ } . ( $options{trait} ? '-Trait' : '' );
190
191 return $cache{$cache_key}{$metaclass_name} ||= do{
192
193 my $possible_full_name = join '::',
194 'Mouse::Meta', $type, 'Custom', ($options{trait} ? 'Trait' : ()), $metaclass_name
195 ;
196
197 my $loaded_class = load_first_existing_class(
198 $possible_full_name,
199 $metaclass_name
200 );
201
202 $loaded_class->can('register_implementation')
203 ? $loaded_class->register_implementation
204 : $loaded_class;
205 };
206 }
207}
208
209# Utilities from Class::MOP
210
211sub get_code_info;
212sub get_code_package;
213
214sub is_valid_class_name;
215sub is_class_loaded;
216
217# taken from Class/MOP.pm
218sub load_first_existing_class {
219 my @classes = @_
220 or return;
221
222 my %exceptions;
223 for my $class (@classes) {
224 my $e = _try_load_one_class($class);
225
226 if ($e) {
227 $exceptions{$class} = $e;
228 }
229 else {
230 return $class;
231 }
232 }
233
234 # not found
235 Carp::confess join(
236 "\n",
237 map {
238 sprintf( "Could not load class (%s) because : %s",
239 $_, $exceptions{$_} )
240 } @classes
241 );
242}
243
244# taken from Class/MOP.pm
245
# spent 4.20ms (2.89+1.31) within Mouse::Util::_try_load_one_class which was called 17 times, avg 247µs/call: # 17 times (2.89ms+1.31ms) by Mouse::Util::load_class at line 268, avg 247µs/call
sub _try_load_one_class {
246175µs my $class = shift;
247
2481763µs1719µs unless ( is_valid_class_name($class) ) {
# spent 19µs making 17 calls to Mouse::Util::is_valid_class_name, avg 1µs/call
249 my $display = defined($class) ? $class : 'undef';
250 Carp::confess "Invalid class name ($display)";
251 }
252
25317131µs1749µs return '' if is_class_loaded($class);
# spent 49µs making 17 calls to Mouse::Util::is_class_loaded, avg 3µs/call
254
25519µs15µs $class =~ s{::}{/}g;
# spent 5µs making 1 call to Mouse::Util::CORE:subst
25611µs $class .= '.pm';
257
25813µs return do {
2591500ns local $@;
2602130µs eval { require $class };
2611800ns $@;
262 };
263}
264
265
266
# spent 4.27ms (85µs+4.19) within Mouse::Util::load_class which was called 17 times, avg 251µs/call: # 8 times (38µs+71µs) by Mouse::Meta::Class::superclasses at line 58 of Mouse/Meta/Class.pm, avg 14µs/call # 5 times (28µs+44µs) by Mouse::Meta::Class::make_immutable at line 292 of Mouse/Meta/Class.pm, avg 14µs/call # 3 times (14µs+15µs) by Mouse::Meta::Class::make_immutable at line 298 of Mouse/Meta/Class.pm, avg 10µs/call # once (5µs+4.06ms) by MongoDB::Database::BUILD at line 76 of MongoDB/Database.pm
sub load_class {
267179µs my $class = shift;
2681731µs174.20ms my $e = _try_load_one_class($class);
# spent 4.23ms making 17 calls to Mouse::Util::_try_load_one_class, avg 249µs/call, recursion: max depth 1, sum of overlapping time 32µs
269173µs Carp::confess "Could not load class ($class) because : $e" if $e;
270
2711746µs return $class;
272}
273
274
275sub apply_all_roles {
276 my $consumer = Scalar::Util::blessed($_[0])
277 ? $_[0] # instance
278 : Mouse::Meta::Class->initialize($_[0]); # class or role name
279
280 my @roles;
281
282 # Basis of Data::OptList
283 my $max = scalar(@_);
284 for (my $i = 1; $i < $max ; $i++) {
285 my $role = $_[$i];
286 my $role_name;
287 if(ref $role) {
288 $role_name = $role->name;
289 }
290 else {
291 $role_name = $role;
292 load_class($role_name);
293 $role = get_metaclass_by_name($role_name);
294 }
295
296 if ($i + 1 < $max && ref($_[$i + 1]) eq 'HASH') {
297 push @roles, [ $role => $_[++$i] ];
298 } else {
299 push @roles, [ $role => undef ];
300 }
301 is_a_metarole($role)
302 || $consumer->meta->throw_error("You can only consume roles, $role_name is not a Mouse role");
303 }
304
305 if ( scalar @roles == 1 ) {
306 my ( $role, $params ) = @{ $roles[0] };
307 $role->apply( $consumer, defined $params ? $params : () );
308 }
309 else {
310 Mouse::Meta::Role->combine(@roles)->apply($consumer);
311 }
312 return;
313}
314
315# taken from Moose::Util 0.90
316sub english_list {
317 return $_[0] if @_ == 1;
318
319 my @items = sort @_;
320
321 return "$items[0] and $items[1]" if @items == 2;
322
323 my $tail = pop @items;
324
325 return join q{, }, @items, "and $tail";
326}
327
328sub quoted_english_list {
329 return english_list(map { qq{'$_'} } @_);
330}
331
332# common utilities
333
334sub not_supported{
335 my($feature) = @_;
336
337 $feature ||= ( caller(1) )[3] . '()'; # subroutine name
338
339 local $Carp::CarpLevel = $Carp::CarpLevel + 1;
340 Carp::confess("Mouse does not currently support $feature");
341}
342
343# general meta() method
344sub meta :method{
345 return Mouse::Meta::Class->initialize(ref($_[0]) || $_[0]);
346}
347
348# general throw_error() method
349# $o->throw_error($msg, depth => $leve, longmess => $croak_or_confess)
350sub throw_error :method {
351 my($self, $message, %args) = @_;
352
353 local $Carp::CarpLevel = $Carp::CarpLevel + 1 + ($args{depth} || 0);
354 local $Carp::MaxArgNums = 20; # default is 8, usually we use named args which gets messier though
355
356 if(exists $args{longmess} && !$args{longmess}) {
357 Carp::croak($message);
358 }
359 else{
360 Carp::confess($message);
361 }
362}
363
364# general dump() method
365sub dump :method {
366 my($self, $maxdepth) = @_;
367
368 require 'Data/Dumper.pm'; # we don't want to create its namespace
369 my $dd = Data::Dumper->new([$self]);
370 $dd->Maxdepth(defined($maxdepth) ? $maxdepth : 3);
371 $dd->Indent(1);
372 $dd->Sortkeys(1);
373 $dd->Quotekeys(0);
374 return $dd->Dump();
375}
376
377# general does() method
378sub does :method {
379 goto &does_role;
380}
381
382113µs1;
383__END__
 
# spent 8µs within Mouse::Util::CORE:subst which was called 2 times, avg 4µs/call: # once (5µs+0s) by Mouse::Util::_try_load_one_class at line 255 # once (3µs+0s) by Mouse::Util::BEGIN@22 at line 62
sub Mouse::Util::CORE:subst; # opcode
# spent 3µs within Mouse::Util::__register_metaclass_storage which was called: # once (3µs+0s) by Mouse::BEGIN@4 at line 11 of Mouse/Meta/Module.pm
sub Mouse::Util::__register_metaclass_storage; # xsub
# spent 24µs within Mouse::Util::generate_can_predicate_for which was called 3 times, avg 8µs/call: # once (12µs+0s) by Mouse::BEGIN@4 at line 157 # once (8µs+0s) by Mouse::BEGIN@4 at line 158 # once (4µs+0s) by Mouse::BEGIN@4 at line 159
sub Mouse::Util::generate_can_predicate_for; # xsub
# spent 44µs within Mouse::Util::generate_isa_predicate_for which was called 8 times, avg 6µs/call: # 8 times (44µs+0s) by Mouse::Util::TypeConstraints::class_type at line 200 of Mouse/Util/TypeConstraints.pm, avg 6µs/call
sub Mouse::Util::generate_isa_predicate_for; # xsub
# spent 4µs within Mouse::Util::get_code_info which was called 2 times, avg 2µs/call: # 2 times (4µs+0s) by Mouse::Exporter::build_import_methods at line 91 of Mouse/Exporter.pm, avg 2µs/call
sub Mouse::Util::get_code_info; # xsub
# spent 62µs within Mouse::Util::is_a_type_constraint which was called 59 times, avg 1µs/call: # 51 times (53µs+0s) by Mouse::Util::TypeConstraints::find_or_parse_type_constraint at line 392 of Mouse/Util/TypeConstraints.pm, avg 1µs/call # 8 times (9µs+0s) by Mouse::Util::TypeConstraints::find_type_constraint at line 377 of Mouse/Util/TypeConstraints.pm, avg 1µs/call
sub Mouse::Util::is_a_type_constraint; # xsub
# spent 49µs within Mouse::Util::is_class_loaded which was called 17 times, avg 3µs/call: # 17 times (49µs+0s) by Mouse::Util::_try_load_one_class at line 253, avg 3µs/call
sub Mouse::Util::is_class_loaded; # xsub
# spent 19µs within Mouse::Util::is_valid_class_name which was called 17 times, avg 1µs/call: # 17 times (19µs+0s) by Mouse::Util::_try_load_one_class at line 248, avg 1µs/call
sub Mouse::Util::is_valid_class_name; # xsub