← Index
NYTProf Performance Profile   « line view »
For fastest.pl
  Run on Fri Jan 31 20:48:16 2014
Reported on Fri Jan 31 20:49:40 2014

Filename/opt/perl-5.18.1/lib/site_perl/5.18.1/darwin-thread-multi-2level/Mouse/Util.pm
StatementsExecuted 72 statements in 3.13ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
111805µs1.20msMouse::Util::::BEGIN@136Mouse::Util::BEGIN@136
111570µs1.83msMouse::Util::::BEGIN@22Mouse::Util::BEGIN@22
1431134µs134µsMouse::Util::::install_subroutinesMouse::Util::install_subroutines
31126µs36µsMouse::Util::::_try_load_one_classMouse::Util::_try_load_one_class
33120µs20µsMouse::Util::::generate_can_predicate_forMouse::Util::generate_can_predicate_for (xsub)
11119µs25µsMouse::Util::::BEGIN@2Mouse::Util::BEGIN@2
33117µs52µsMouse::Util::::load_classMouse::Util::load_class
11111µs11µsMouse::Util::::generate_isa_predicate_forMouse::Util::generate_isa_predicate_for (xsub)
11110µs24µsMouse::Util::::BEGIN@15Mouse::Util::BEGIN@15
11110µs28µsMouse::Util::::BEGIN@14Mouse::Util::BEGIN@14
1119µs23µsMouse::Util::::BEGIN@96Mouse::Util::BEGIN@96
3118µs8µsMouse::Util::::is_class_loadedMouse::Util::is_class_loaded (xsub)
1117µs25µsMouse::Util::::BEGIN@16Mouse::Util::BEGIN@16
1117µs7µsMouse::Util::::CORE:substMouse::Util::CORE:subst (opcode)
2115µs5µsMouse::Util::::get_code_infoMouse::Util::get_code_info (xsub)
1115µs5µsMouse::Util::::BEGIN@135Mouse::Util::BEGIN@135
1113µs3µsMouse::Util::::ENDMouse::Util::END
3212µs2µsMouse::Util::::is_a_type_constraintMouse::Util::is_a_type_constraint (xsub)
3112µs2µsMouse::Util::::is_valid_class_nameMouse::Util::is_valid_class_name (xsub)
1112µs2µsMouse::Util::::__register_metaclass_storageMouse::Util::__register_metaclass_storage (xsub)
0000s0sMouse::Util::::__ANON__[:105]Mouse::Util::__ANON__[:105]
0000s0sMouse::Util::::__ANON__[:129]Mouse::Util::__ANON__[:129]
0000s0sMouse::Util::::__ANON__[:168]Mouse::Util::__ANON__[:168]
0000s0sMouse::Util::::__ANON__[:175]Mouse::Util::__ANON__[:175]
0000s0sMouse::Util::::__ANON__[:79]Mouse::Util::__ANON__[:79]
0000s0sMouse::Util::::_does_role_implMouse::Util::_does_role_impl
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;
2292µs232µs
# spent 25µs (19+6) within Mouse::Util::BEGIN@2 which was called: # once (19µs+6µs) by Mouse::BEGIN@4 at line 2
use Mouse::Exporter; # enables strict and warnings
# spent 25µs making 1 call to Mouse::Util::BEGIN@2 # spent 6µ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 referred by other modules loaded
7sub get_linear_isa($;$); ## no critic
8
9# must be here because it will called in Mouse::Exporter
10
# spent 134µs within Mouse::Util::install_subroutines which was called 14 times, avg 10µs/call: # 9 times (66µs+0s) by Mouse::Exporter::do_import at line 214 of Mouse/Exporter.pm, avg 7µs/call # 3 times (52µs+0s) by Mouse::Exporter::setup_import_methods at line 50 of Mouse/Exporter.pm, avg 17µs/call # 2 times (16µs+0s) by Mouse::Exporter::do_import at line 217 of Mouse/Exporter.pm, avg 8µs/call
sub install_subroutines {
111400ns my $into = shift;
12
1315µs while(my($name, $code) = splice @_, 0, 2){
14242µs245µs
# spent 28µs (10+18) within Mouse::Util::BEGIN@14 which was called: # once (10µs+18µs) by Mouse::BEGIN@4 at line 14
no strict 'refs';
# spent 28µs making 1 call to Mouse::Util::BEGIN@14 # spent 18µs making 1 call to strict::unimport
15236µs238µs
# spent 24µs (10+14) within Mouse::Util::BEGIN@15 which was called: # once (10µs+14µs) by Mouse::BEGIN@4 at line 15
no warnings 'once', 'redefine';
# spent 24µs making 1 call to Mouse::Util::BEGIN@15 # spent 14µs making 1 call to warnings::unimport
162375µs243µs
# spent 25µs (7+18) within Mouse::Util::BEGIN@16 which was called: # once (7µs+18µs) by Mouse::BEGIN@4 at line 16
use warnings FATAL => 'uninitialized';
# spent 25µs making 1 call to Mouse::Util::BEGIN@16 # spent 18µs making 1 call to warnings::import
17411µs *{$into . '::' . $name} = \&{$code};
18 }
1919µs return;
20}
21
22
# spent 1.83ms (570µs+1.26) within Mouse::Util::BEGIN@22 which was called: # once (570µs+1.26ms) by Mouse::BEGIN@4 at line 133
BEGIN{
23 # This is used in Mouse::PurePerl
24111µs1175µs Mouse::Exporter->setup_import_methods(
# spent 175µ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
531500ns our $VERSION = '2.1.0';
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
62112µs17µs (my $hack_mouse_file = __FILE__) =~ s/.Util//; # .../Mouse/Util.pm -> .../Mouse.pm
# spent 7µs making 1 call to Mouse::Util::CORE:subst
631114µ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;
721300ns warn $@ if $@ && $ENV{MOUSE_XS};
73 }
74
751100ns if(!$xs){
76 require 'Mouse/PurePerl.pm'; # we don't want to create its namespace
77 }
78
7918µs *MOUSE_XS = sub(){ $xs };
80
81 # definition of mro::get_linear_isa()
821100ns my $get_linear_isa;
8311µs if ($] >= 5.010_000) {
841108µs require 'mro.pm';
851800ns $get_linear_isa = \&mro::get_linear_isa;
86 }
87 else {
88 # this code is based on MRO::Compat::__get_linear_isa
89 my $_get_linear_isa_dfs; # this recurses so it isn't pretty
90 $_get_linear_isa_dfs = sub {
91 my($classname) = @_;
92
93 my @lin = ($classname);
94 my %stored;
95
962267µs237µs
# spent 23µs (9+14) within Mouse::Util::BEGIN@96 which was called: # once (9µs+14µs) by Mouse::BEGIN@4 at line 96
no strict 'refs';
# spent 23µs making 1 call to Mouse::Util::BEGIN@96 # spent 14µs making 1 call to strict::unimport
97 foreach my $parent (@{"$classname\::ISA"}) {
98 foreach my $p(@{ $_get_linear_isa_dfs->($parent) }) {
99 next if exists $stored{$p};
100 push(@lin, $p);
101 $stored{$p} = 1;
102 }
103 }
104 return \@lin;
105 };
106
107 {
108 package # hide from PAUSE
109 Class::C3;
110 our %MRO; # avoid 'once' warnings
111 }
112
113 # MRO::Compat::__get_linear_isa has no prototype, so
114 # we define a prototyped version for compatibility with core's
115 # See also MRO::Compat::__get_linear_isa.
116 $get_linear_isa = sub ($;$){
117 my($classname, $type) = @_;
118
119 if(!defined $type){
120 $type = exists $Class::C3::MRO{$classname} ? 'c3' : 'dfs';
121 }
122 if($type eq 'c3'){
123 require Class::C3;
124 return [Class::C3::calculateMRO($classname)];
125 }
126 else{
127 return $_get_linear_isa_dfs->($classname);
128 }
129 };
130 }
131
13216µs *get_linear_isa = $get_linear_isa;
133168µs11.83ms}
# spent 1.83ms making 1 call to Mouse::Util::BEGIN@22
134
135227µs15µs
# spent 5µs within Mouse::Util::BEGIN@135 which was called: # once (5µs+0s) by Mouse::BEGIN@4 at line 135
use Carp ();
# spent 5µs making 1 call to Mouse::Util::BEGIN@135
13621.74ms11.20ms
# spent 1.20ms (805µs+391µs) within Mouse::Util::BEGIN@136 which was called: # once (805µs+391µs) by Mouse::BEGIN@4 at line 136
use Scalar::Util ();
# spent 1.20ms making 1 call to Mouse::Util::BEGIN@136
137
138# aliases as public APIs
139# it must be 'require', not 'use', because Mouse::Meta::Module depends on Mouse::Util
140184µsrequire Mouse::Meta::Module; # for the entities of metaclass cache utilities
141
142# aliases
143{
14422µs *class_of = \&Mouse::Meta::Module::_class_of;
1451400ns *get_metaclass_by_name = \&Mouse::Meta::Module::_get_metaclass_by_name;
1461400ns *get_all_metaclass_instances = \&Mouse::Meta::Module::_get_all_metaclass_instances;
1471300ns *get_all_metaclass_names = \&Mouse::Meta::Module::_get_all_metaclass_names;
148
1491400ns *Mouse::load_class = \&load_class;
1501300ns *Mouse::is_class_loaded = \&is_class_loaded;
151
152 # is-a predicates
153 #generate_isa_predicate_for('Mouse::Meta::TypeConstraint' => 'is_a_type_constraint');
154 #generate_isa_predicate_for('Mouse::Meta::Class' => 'is_a_metaclass');
155 #generate_isa_predicate_for('Mouse::Meta::Role' => 'is_a_metarole');
156
157 # duck type predicates
158123µs115µs generate_can_predicate_for(['_compiled_type_constraint'] => 'is_a_type_constraint');
# spent 15µs making 1 call to Mouse::Util::generate_can_predicate_for
15918µs14µs generate_can_predicate_for(['create_anon_class'] => 'is_a_metaclass');
# spent 4µs making 1 call to Mouse::Util::generate_can_predicate_for
16016µs12µs generate_can_predicate_for(['create_anon_role'] => 'is_a_metarole');
# spent 2µs making 1 call to Mouse::Util::generate_can_predicate_for
161}
162
163sub in_global_destruction;
164
16514µsif (defined ${^GLOBAL_PHASE}) {
166 *in_global_destruction = sub {
167 return ${^GLOBAL_PHASE} eq 'DESTRUCT';
168 };
169}
170else {
171 my $in_global_destruction = 0;
17214µs
# spent 3µs within Mouse::Util::END which was called: # once (3µs+0s) by main::RUNTIME at line 0 of fastest.pl
END { $in_global_destruction = 1 }
173 *in_global_destruction = sub {
174 return $in_global_destruction;
175 };
176}
177
178# Moose::Util compatible utilities
179
180sub find_meta{
181 return class_of( $_[0] );
182}
183
184sub _does_role_impl {
185 my ($class_or_obj, $role_name) = @_;
186
187 my $meta = class_of($class_or_obj);
188
189 (defined $role_name)
190 || ($meta || 'Mouse::Meta::Class')->throw_error("You must supply a role name to does()");
191
192 return defined($meta) && $meta->does_role($role_name);
193}
194
195sub does_role {
196 my($thing, $role_name) = @_;
197
198 if( (Scalar::Util::blessed($thing) || is_class_loaded($thing))
199 && $thing->can('does')) {
200 return $thing->does($role_name);
201 }
202 goto &_does_role_impl;
203}
204
205# taken from Mouse::Util (0.90)
206{
2072500ns my %cache;
208
209 sub resolve_metaclass_alias {
210 my ( $type, $metaclass_name, %options ) = @_;
211
212 my $cache_key = $type . q{ } . ( $options{trait} ? '-Trait' : '' );
213
214 return $cache{$cache_key}{$metaclass_name} ||= do{
215
216 my $possible_full_name = join '::',
217 'Mouse::Meta', $type, 'Custom', ($options{trait} ? 'Trait' : ()), $metaclass_name
218 ;
219
220 my $loaded_class = load_first_existing_class(
221 $possible_full_name,
222 $metaclass_name
223 );
224
225 $loaded_class->can('register_implementation')
226 ? $loaded_class->register_implementation
227 : $loaded_class;
228 };
229 }
230}
231
232# Utilities from Class::MOP
233
234sub get_code_info;
235sub get_code_package;
236
237sub is_valid_class_name;
238sub is_class_loaded;
239
240# taken from Class/MOP.pm
241sub load_first_existing_class {
242 my @classes = @_
243 or return;
244
245 my %exceptions;
246 for my $class (@classes) {
247 my $e = _try_load_one_class($class);
248
249 if ($e) {
250 $exceptions{$class} = $e;
251 }
252 else {
253 return $class;
254 }
255 }
256
257 # not found
258 Carp::confess join(
259 "\n",
260 map {
261 sprintf( "Could not load class (%s) because : %s",
262 $_, $exceptions{$_} )
263 } @classes
264 );
265}
266
267# taken from Class/MOP.pm
268
# spent 36µs (26+10) within Mouse::Util::_try_load_one_class which was called 3 times, avg 12µs/call: # 3 times (26µs+10µs) by Mouse::Util::load_class at line 291, avg 12µs/call
sub _try_load_one_class {
26931µs my $class = shift;
270
271312µs32µs unless ( is_valid_class_name($class) ) {
# spent 2µs making 3 calls to Mouse::Util::is_valid_class_name, avg 733ns/call
272 my $display = defined($class) ? $class : 'undef';
273 Carp::confess "Invalid class name ($display)";
274 }
275
276326µs38µs return '' if is_class_loaded($class);
# spent 8µs making 3 calls to Mouse::Util::is_class_loaded, avg 3µs/call
277
278 $class =~ s{::}{/}g;
279 $class .= '.pm';
280
281 return do {
282 local $@;
283 eval { require $class };
284 $@;
285 };
286}
287
288
289
# spent 52µs (17+36) within Mouse::Util::load_class which was called 3 times, avg 18µs/call: # once (6µs+17µs) by Mouse::Meta::Class::superclasses at line 58 of Mouse/Meta/Class.pm # once (6µs+11µs) by Mouse::Meta::Class::make_immutable at line 292 of Mouse/Meta/Class.pm # once (4µs+8µs) by Mouse::Meta::Class::make_immutable at line 298 of Mouse/Meta/Class.pm
sub load_class {
29032µs my $class = shift;
29135µs336µs my $e = _try_load_one_class($class);
# spent 36µs making 3 calls to Mouse::Util::_try_load_one_class, avg 12µs/call
2923400ns Carp::confess "Could not load class ($class) because : $e" if $e;
293
294310µs return $class;
295}
296
297
298sub apply_all_roles {
299 my $consumer = Scalar::Util::blessed($_[0])
300 ? $_[0] # instance
301 : Mouse::Meta::Class->initialize($_[0]); # class or role name
302
303 my @roles;
304
305 # Basis of Data::OptList
306 my $max = scalar(@_);
307 for (my $i = 1; $i < $max ; $i++) {
308 my $role = $_[$i];
309 my $role_name;
310 if(ref $role) {
311 $role_name = $role->name;
312 }
313 else {
314 $role_name = $role;
315 load_class($role_name);
316 $role = get_metaclass_by_name($role_name);
317 }
318
319 if ($i + 1 < $max && ref($_[$i + 1]) eq 'HASH') {
320 push @roles, [ $role => $_[++$i] ];
321 } else {
322 push @roles, [ $role => undef ];
323 }
324 is_a_metarole($role)
325 || $consumer->meta->throw_error("You can only consume roles, $role_name is not a Mouse role");
326 }
327
328 if ( scalar @roles == 1 ) {
329 my ( $role, $params ) = @{ $roles[0] };
330 $role->apply( $consumer, defined $params ? $params : () );
331 }
332 else {
333 Mouse::Meta::Role->combine(@roles)->apply($consumer);
334 }
335 return;
336}
337
338# taken from Moose::Util 0.90
339sub english_list {
340 return $_[0] if @_ == 1;
341
342 my @items = sort @_;
343
344 return "$items[0] and $items[1]" if @items == 2;
345
346 my $tail = pop @items;
347
348 return join q{, }, @items, "and $tail";
349}
350
351sub quoted_english_list {
352 return english_list(map { qq{'$_'} } @_);
353}
354
355# common utilities
356
357sub not_supported{
358 my($feature) = @_;
359
360 $feature ||= ( caller(1) )[3] . '()'; # subroutine name
361
362 local $Carp::CarpLevel = $Carp::CarpLevel + 1;
363 Carp::confess("Mouse does not currently support $feature");
364}
365
366# general meta() method
367sub meta :method{
368 return Mouse::Meta::Class->initialize(ref($_[0]) || $_[0]);
369}
370
371# general throw_error() method
372# $o->throw_error($msg, depth => $leve, longmess => $croak_or_confess)
373sub throw_error :method {
374 my($self, $message, %args) = @_;
375
376 local $Carp::CarpLevel = $Carp::CarpLevel + 1 + ($args{depth} || 0);
377 local $Carp::MaxArgNums = 20; # default is 8, usually we use named args which gets messier though
378
379 if(exists $args{longmess} && !$args{longmess}) {
380 Carp::croak($message);
381 }
382 else{
383 Carp::confess($message);
384 }
385}
386
387# general dump() method
388sub dump :method {
389 my($self, $maxdepth) = @_;
390
391 require 'Data/Dumper.pm'; # we don't want to create its namespace
392 my $dd = Data::Dumper->new([$self]);
393 $dd->Maxdepth(defined($maxdepth) ? $maxdepth : 3);
394 $dd->Indent(1);
395 $dd->Sortkeys(1);
396 $dd->Quotekeys(0);
397 return $dd->Dump();
398}
399
400# general does() method
401sub does :method {
402 goto &_does_role_impl;
403}
404
405112µs1;
406__END__
 
# spent 7µs within Mouse::Util::CORE:subst which was called: # once (7µs+0s) by Mouse::Util::BEGIN@22 at line 62
sub Mouse::Util::CORE:subst; # opcode
# spent 2µs within Mouse::Util::__register_metaclass_storage which was called: # once (2µs+0s) by Mouse::BEGIN@4 at line 11 of Mouse/Meta/Module.pm
sub Mouse::Util::__register_metaclass_storage; # xsub
# spent 20µs within Mouse::Util::generate_can_predicate_for which was called 3 times, avg 7µs/call: # once (15µs+0s) by Mouse::BEGIN@4 at line 158 # once (4µs+0s) by Mouse::BEGIN@4 at line 159 # once (2µs+0s) by Mouse::BEGIN@4 at line 160
sub Mouse::Util::generate_can_predicate_for; # xsub
# spent 11µs within Mouse::Util::generate_isa_predicate_for which was called: # once (11µs+0s) by Mouse::Util::TypeConstraints::class_type at line 200 of Mouse/Util/TypeConstraints.pm
sub Mouse::Util::generate_isa_predicate_for; # xsub
# spent 5µs within Mouse::Util::get_code_info which was called 2 times, avg 3µs/call: # 2 times (5µs+0s) by Mouse::Exporter::build_import_methods at line 93 of Mouse/Exporter.pm, avg 3µs/call
sub Mouse::Util::get_code_info; # xsub
# spent 2µs within Mouse::Util::is_a_type_constraint which was called 3 times, avg 800ns/call: # 2 times (2µs+0s) by Mouse::Util::TypeConstraints::find_or_parse_type_constraint at line 397 of Mouse/Util/TypeConstraints.pm, avg 800ns/call # once (800ns+0s) by Mouse::Util::TypeConstraints::find_type_constraint at line 382 of Mouse/Util/TypeConstraints.pm
sub Mouse::Util::is_a_type_constraint; # xsub
# spent 8µs within Mouse::Util::is_class_loaded which was called 3 times, avg 3µs/call: # 3 times (8µs+0s) by Mouse::Util::_try_load_one_class at line 276, avg 3µs/call
sub Mouse::Util::is_class_loaded; # xsub
# spent 2µs within Mouse::Util::is_valid_class_name which was called 3 times, avg 733ns/call: # 3 times (2µs+0s) by Mouse::Util::_try_load_one_class at line 271, avg 733ns/call
sub Mouse::Util::is_valid_class_name; # xsub