Filename | /opt/perl-5.18.1/lib/site_perl/5.18.1/darwin-thread-multi-2level/Mouse/Util.pm |
Statements | Executed 72 statements in 3.13ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
1 | 1 | 1 | 805µs | 1.20ms | BEGIN@136 | Mouse::Util::
1 | 1 | 1 | 570µs | 1.83ms | BEGIN@22 | Mouse::Util::
14 | 3 | 1 | 134µs | 134µs | install_subroutines | Mouse::Util::
3 | 1 | 1 | 26µs | 36µs | _try_load_one_class | Mouse::Util::
3 | 3 | 1 | 20µs | 20µs | generate_can_predicate_for (xsub) | Mouse::Util::
1 | 1 | 1 | 19µs | 25µs | BEGIN@2 | Mouse::Util::
3 | 3 | 1 | 17µs | 52µs | load_class | Mouse::Util::
1 | 1 | 1 | 11µs | 11µs | generate_isa_predicate_for (xsub) | Mouse::Util::
1 | 1 | 1 | 10µs | 24µs | BEGIN@15 | Mouse::Util::
1 | 1 | 1 | 10µs | 28µs | BEGIN@14 | Mouse::Util::
1 | 1 | 1 | 9µs | 23µs | BEGIN@96 | Mouse::Util::
3 | 1 | 1 | 8µs | 8µs | is_class_loaded (xsub) | Mouse::Util::
1 | 1 | 1 | 7µs | 25µs | BEGIN@16 | Mouse::Util::
1 | 1 | 1 | 7µs | 7µs | CORE:subst (opcode) | Mouse::Util::
2 | 1 | 1 | 5µs | 5µs | get_code_info (xsub) | Mouse::Util::
1 | 1 | 1 | 5µs | 5µs | BEGIN@135 | Mouse::Util::
1 | 1 | 1 | 3µs | 3µs | END | Mouse::Util::
3 | 2 | 1 | 2µs | 2µs | is_a_type_constraint (xsub) | Mouse::Util::
3 | 1 | 1 | 2µs | 2µs | is_valid_class_name (xsub) | Mouse::Util::
1 | 1 | 1 | 2µs | 2µs | __register_metaclass_storage (xsub) | Mouse::Util::
0 | 0 | 0 | 0s | 0s | __ANON__[:105] | Mouse::Util::
0 | 0 | 0 | 0s | 0s | __ANON__[:129] | Mouse::Util::
0 | 0 | 0 | 0s | 0s | __ANON__[:168] | Mouse::Util::
0 | 0 | 0 | 0s | 0s | __ANON__[:175] | Mouse::Util::
0 | 0 | 0 | 0s | 0s | __ANON__[:79] | Mouse::Util::
0 | 0 | 0 | 0s | 0s | _does_role_impl | Mouse::Util::
0 | 0 | 0 | 0s | 0s | apply_all_roles | Mouse::Util::
0 | 0 | 0 | 0s | 0s | does | Mouse::Util::
0 | 0 | 0 | 0s | 0s | does_role | Mouse::Util::
0 | 0 | 0 | 0s | 0s | dump | Mouse::Util::
0 | 0 | 0 | 0s | 0s | english_list | Mouse::Util::
0 | 0 | 0 | 0s | 0s | find_meta | Mouse::Util::
0 | 0 | 0 | 0s | 0s | load_first_existing_class | Mouse::Util::
0 | 0 | 0 | 0s | 0s | meta | Mouse::Util::
0 | 0 | 0 | 0s | 0s | not_supported | Mouse::Util::
0 | 0 | 0 | 0s | 0s | quoted_english_list | Mouse::Util::
0 | 0 | 0 | 0s | 0s | resolve_metaclass_alias | Mouse::Util::
0 | 0 | 0 | 0s | 0s | throw_error | Mouse::Util::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package Mouse::Util; | ||||
2 | 2 | 92µs | 2 | 32µ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 # 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 | ||||
7 | sub 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 | ||||
11 | 1 | 400ns | my $into = shift; | ||
12 | |||||
13 | 1 | 5µs | while(my($name, $code) = splice @_, 0, 2){ | ||
14 | 2 | 42µs | 2 | 45µ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 # spent 28µs making 1 call to Mouse::Util::BEGIN@14
# spent 18µs making 1 call to strict::unimport |
15 | 2 | 36µs | 2 | 38µ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 # spent 24µs making 1 call to Mouse::Util::BEGIN@15
# spent 14µs making 1 call to warnings::unimport |
16 | 2 | 375µs | 2 | 43µ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 # spent 25µs making 1 call to Mouse::Util::BEGIN@16
# spent 18µs making 1 call to warnings::import |
17 | 4 | 11µs | *{$into . '::' . $name} = \&{$code}; | ||
18 | } | ||||
19 | 1 | 9µ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 | ||||
23 | # This is used in Mouse::PurePerl | ||||
24 | 1 | 11µs | 1 | 175µ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 | |||||
53 | 1 | 500ns | our $VERSION = '2.1.0'; | ||
54 | |||||
55 | 1 | 2µ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. | ||||
59 | 1 | 300ns | if($xs){ | ||
60 | # XXX: XSLoader tries to get the object path from caller's file name | ||||
61 | # $hack_mouse_file fools its mechanism | ||||
62 | 1 | 12µs | 1 | 7µs | (my $hack_mouse_file = __FILE__) =~ s/.Util//; # .../Mouse/Util.pm -> .../Mouse.pm # spent 7µs making 1 call to Mouse::Util::CORE:subst |
63 | 1 | 114µ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; | ||||
72 | 1 | 300ns | warn $@ if $@ && $ENV{MOUSE_XS}; | ||
73 | } | ||||
74 | |||||
75 | 1 | 100ns | if(!$xs){ | ||
76 | require 'Mouse/PurePerl.pm'; # we don't want to create its namespace | ||||
77 | } | ||||
78 | |||||
79 | 1 | 8µs | *MOUSE_XS = sub(){ $xs }; | ||
80 | |||||
81 | # definition of mro::get_linear_isa() | ||||
82 | 1 | 100ns | my $get_linear_isa; | ||
83 | 1 | 1µs | if ($] >= 5.010_000) { | ||
84 | 1 | 108µs | require 'mro.pm'; | ||
85 | 1 | 800ns | $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 | |||||
96 | 2 | 267µs | 2 | 37µ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 # 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 | |||||
132 | 1 | 6µs | *get_linear_isa = $get_linear_isa; | ||
133 | 1 | 68µs | 1 | 1.83ms | } # spent 1.83ms making 1 call to Mouse::Util::BEGIN@22 |
134 | |||||
135 | 2 | 27µs | 1 | 5µs | # spent 5µs within Mouse::Util::BEGIN@135 which was called:
# once (5µs+0s) by Mouse::BEGIN@4 at line 135 # spent 5µs making 1 call to Mouse::Util::BEGIN@135 |
136 | 2 | 1.74ms | 1 | 1.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 # 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 | ||||
140 | 1 | 84µs | require Mouse::Meta::Module; # for the entities of metaclass cache utilities | ||
141 | |||||
142 | # aliases | ||||
143 | { | ||||
144 | 2 | 2µs | *class_of = \&Mouse::Meta::Module::_class_of; | ||
145 | 1 | 400ns | *get_metaclass_by_name = \&Mouse::Meta::Module::_get_metaclass_by_name; | ||
146 | 1 | 400ns | *get_all_metaclass_instances = \&Mouse::Meta::Module::_get_all_metaclass_instances; | ||
147 | 1 | 300ns | *get_all_metaclass_names = \&Mouse::Meta::Module::_get_all_metaclass_names; | ||
148 | |||||
149 | 1 | 400ns | *Mouse::load_class = \&load_class; | ||
150 | 1 | 300ns | *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 | ||||
158 | 1 | 23µs | 1 | 15µ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 |
159 | 1 | 8µs | 1 | 4µs | generate_can_predicate_for(['create_anon_class'] => 'is_a_metaclass'); # spent 4µs making 1 call to Mouse::Util::generate_can_predicate_for |
160 | 1 | 6µs | 1 | 2µ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 | |||||
163 | sub in_global_destruction; | ||||
164 | |||||
165 | 1 | 4µs | if (defined ${^GLOBAL_PHASE}) { | ||
166 | *in_global_destruction = sub { | ||||
167 | return ${^GLOBAL_PHASE} eq 'DESTRUCT'; | ||||
168 | }; | ||||
169 | } | ||||
170 | else { | ||||
171 | my $in_global_destruction = 0; | ||||
172 | 1 | 4µs | # spent 3µs within Mouse::Util::END which was called:
# once (3µs+0s) by main::RUNTIME at line 0 of fastest.pl | ||
173 | *in_global_destruction = sub { | ||||
174 | return $in_global_destruction; | ||||
175 | }; | ||||
176 | } | ||||
177 | |||||
178 | # Moose::Util compatible utilities | ||||
179 | |||||
180 | sub find_meta{ | ||||
181 | return class_of( $_[0] ); | ||||
182 | } | ||||
183 | |||||
184 | sub _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 | |||||
195 | sub 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 | { | ||||
207 | 2 | 500ns | 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 | |||||
234 | sub get_code_info; | ||||
235 | sub get_code_package; | ||||
236 | |||||
237 | sub is_valid_class_name; | ||||
238 | sub is_class_loaded; | ||||
239 | |||||
240 | # taken from Class/MOP.pm | ||||
241 | sub 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 | ||||
269 | 3 | 1µs | my $class = shift; | ||
270 | |||||
271 | 3 | 12µs | 3 | 2µ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 | |||||
276 | 3 | 26µs | 3 | 8µ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 | ||||
290 | 3 | 2µs | my $class = shift; | ||
291 | 3 | 5µs | 3 | 36µ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 |
292 | 3 | 400ns | Carp::confess "Could not load class ($class) because : $e" if $e; | ||
293 | |||||
294 | 3 | 10µs | return $class; | ||
295 | } | ||||
296 | |||||
297 | |||||
298 | sub 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 | ||||
339 | sub 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 | |||||
351 | sub quoted_english_list { | ||||
352 | return english_list(map { qq{'$_'} } @_); | ||||
353 | } | ||||
354 | |||||
355 | # common utilities | ||||
356 | |||||
357 | sub 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 | ||||
367 | sub 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) | ||||
373 | sub 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 | ||||
388 | sub 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 | ||||
401 | sub does :method { | ||||
402 | goto &_does_role_impl; | ||||
403 | } | ||||
404 | |||||
405 | 1 | 12µs | 1; | ||
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 | |||||
# 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::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 | |||||
# 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 | |||||
# 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 | |||||
# 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 | |||||
# 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 |