Filename | /Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Role/Tiny.pm |
Statements | Executed 5347 statements in 14.4ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
2 | 1 | 1 | 3.12ms | 4.12ms | _load_module | Role::Tiny::
603 | 1 | 1 | 2.32ms | 2.88ms | does_role | Role::Tiny::
24 | 4 | 2 | 1.18ms | 1.33ms | _all_subs | Role::Tiny::
12 | 1 | 1 | 646µs | 3.09ms | _install_methods | Role::Tiny::
12 | 3 | 3 | 506µs | 14.5ms | apply_roles_to_package | Role::Tiny::
79 | 5 | 5 | 440µs | 1.50ms | DOES | JSON::Schema::Modern::Vocabulary::Core::
79 | 5 | 5 | 326µs | 750µs | DOES | JSON::Schema::Modern::Vocabulary::Validation::
12 | 2 | 2 | 312µs | 564µs | _install_does | Role::Tiny::
148 | 5 | 1 | 309µs | 309µs | _getglob | Role::Tiny::
93 | 8 | 3 | 260µs | 260µs | is_role | Role::Tiny::
79 | 5 | 5 | 255µs | 826µs | DOES | JSON::Schema::Modern::Vocabulary::Applicator::
79 | 5 | 5 | 248µs | 717µs | DOES | JSON::Schema::Modern::Vocabulary::Content::
19 | 2 | 1 | 240µs | 11.0ms | _check_roles | Role::Tiny::
76 | 5 | 5 | 216µs | 615µs | DOES | JSON::Schema::Modern::Vocabulary::Unevaluated::
79 | 5 | 5 | 215µs | 602µs | DOES | JSON::Schema::Modern::Vocabulary::MetaData::
79 | 5 | 5 | 215µs | 631µs | DOES | JSON::Schema::Modern::Vocabulary::FormatAnnotation::
4 | 1 | 1 | 137µs | 378µs | make_role | Role::Tiny::
7 | 1 | 1 | 110µs | 3.26ms | create_class_with_roles | Role::Tiny::
12 | 1 | 1 | 102µs | 572µs | _concrete_methods_of | Role::Tiny::
567 | 3 | 1 | 94µs | 94µs | CORE:match (opcode) | Role::Tiny::
26 | 2 | 1 | 83µs | 83µs | _getstash | Role::Tiny::
12 | 1 | 1 | 73µs | 88µs | _check_requires | Role::Tiny::
4 | 3 | 3 | 71µs | 1.23ms | import | Role::Tiny::
7 | 1 | 1 | 53µs | 3.31ms | apply_roles_to_object | Role::Tiny::
12 | 1 | 1 | 43µs | 43µs | _copy_applied_list | Role::Tiny::
2 | 1 | 1 | 43µs | 89µs | _install_subs | Role::Tiny::
8 | 3 | 2 | 43µs | 43µs | _non_methods | Role::Tiny::
12 | 1 | 1 | 42µs | 384µs | _install_modifiers | Role::Tiny::
7 | 1 | 1 | 34µs | 34µs | _composite_name | Role::Tiny::
12 | 1 | 1 | 33µs | 35µs | _want_backcompat_hack | Role::Tiny::
1 | 1 | 1 | 24µs | 27µs | BEGIN@2 | Role::Tiny::
2 | 1 | 1 | 23µs | 23µs | _gen_subs | Role::Tiny::
5 | 3 | 3 | 21µs | 100µs | DOES | JSON::Schema::Modern::Vocabulary::OpenAPI::
1 | 1 | 1 | 19µs | 752µs | _build_class_with_roles | Role::Tiny::
12 | 2 | 2 | 19µs | 19µs | role_application_steps | Role::Tiny::
2 | 1 | 1 | 17µs | 4.14ms | _require_module | Role::Tiny::
1 | 1 | 1 | 11µs | 36µs | BEGIN@484 | Role::Tiny::
1 | 1 | 1 | 10µs | 10µs | BEGIN@16 | Role::Tiny::
1 | 1 | 1 | 9µs | 13µs | BEGIN@65 | Role::Tiny::
1 | 1 | 1 | 8µs | 26µs | BEGIN@242 | Role::Tiny::
1 | 1 | 1 | 7µs | 14µs | BEGIN@24 | Role::Tiny::
1 | 1 | 1 | 7µs | 24µs | BEGIN@29 | Role::Tiny::
1 | 1 | 1 | 7µs | 30µs | BEGIN@3 | Role::Tiny::
2 | 1 | 1 | 7µs | 7µs | CORE:subst (opcode) | Role::Tiny::
1 | 1 | 1 | 6µs | 9µs | BEGIN@25 | Role::Tiny::
2 | 1 | 1 | 5µs | 5µs | CORE:sort (opcode) | Role::Tiny::
1 | 1 | 1 | 4µs | 8µs | DOES | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | DOES | Method::Generate::Accessor__WITH__MooX::TypeTiny::Role::GenerateAccessor::
0 | 0 | 0 | 0s | 0s | __ANON__[:145] | Role::Tiny::
0 | 0 | 0 | 0s | 0s | __ANON__[:150] | Role::Tiny::
0 | 0 | 0 | 0s | 0s | __ANON__[:154] | Role::Tiny::
0 | 0 | 0 | 0s | 0s | __ANON__[:465] | Role::Tiny::
0 | 0 | 0 | 0s | 0s | __ANON__[:483] | Role::Tiny::
0 | 0 | 0 | 0s | 0s | DESTROY | Role::Tiny::__GUARD__::
0 | 0 | 0 | 0s | 0s | _composite_info_for | Role::Tiny::
0 | 0 | 0 | 0s | 0s | _install_single_modifier | Role::Tiny::
0 | 0 | 0 | 0s | 0s | _mark_new_non_methods | Role::Tiny::
0 | 0 | 0 | 0s | 0s | apply_role_to_package | Role::Tiny::
0 | 0 | 0 | 0s | 0s | apply_single_role_to_package | Role::Tiny::
0 | 0 | 0 | 0s | 0s | croak | Role::Tiny::
0 | 0 | 0 | 0s | 0s | methods_provided_by | Role::Tiny::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package Role::Tiny; | ||||
2 | 2 | 32µs | 2 | 30µs | # spent 27µs (24+3) within Role::Tiny::BEGIN@2 which was called:
# once (24µs+3µs) by Mojo::Base::BEGIN@17 at line 2 # spent 27µs making 1 call to Role::Tiny::BEGIN@2
# spent 3µs making 1 call to strict::import |
3 | 2 | 218µs | 2 | 53µs | # spent 30µs (7+23) within Role::Tiny::BEGIN@3 which was called:
# once (7µs+23µs) by Mojo::Base::BEGIN@17 at line 3 # spent 30µs making 1 call to Role::Tiny::BEGIN@3
# spent 23µs making 1 call to warnings::import |
4 | |||||
5 | 1 | 1µs | our $VERSION = '2.002004'; | ||
6 | 1 | 1µs | $VERSION =~ tr/_//d; | ||
7 | |||||
8 | our %INFO; | ||||
9 | our %APPLIED_TO; | ||||
10 | our %COMPOSED; | ||||
11 | our %COMPOSITE_INFO; | ||||
12 | our @ON_ROLE_CREATE; | ||||
13 | |||||
14 | # Module state workaround totally stolen from Zefram's Module::Runtime. | ||||
15 | |||||
16 | # spent 10µs within Role::Tiny::BEGIN@16 which was called:
# once (10µs+0s) by Mojo::Base::BEGIN@17 at line 22 | ||||
17 | 1 | 4µs | *_WORK_AROUND_BROKEN_MODULE_STATE = "$]" < 5.009 ? sub(){1} : sub(){0}; | ||
18 | *_WORK_AROUND_HINT_LEAKAGE | ||||
19 | = "$]" < 5.011 && !("$]" >= 5.009004 && "$]" < 5.010001) | ||||
20 | 1 | 1µs | ? sub(){1} : sub(){0}; | ||
21 | 1 | 5µs | *_CONSTANTS_DEFLATE = "$]" >= 5.012 && "$]" < 5.020 ? sub(){1} : sub(){0}; | ||
22 | 1 | 27µs | 1 | 10µs | } # spent 10µs making 1 call to Role::Tiny::BEGIN@16 |
23 | |||||
24 | 150 | 434µs | 2 | 21µs | # spent 14µs (7+7) within Role::Tiny::BEGIN@24 which was called:
# once (7µs+7µs) by Mojo::Base::BEGIN@17 at line 24
# spent 309µs within Role::Tiny::_getglob which was called 148 times, avg 2µs/call:
# 123 times (272µs+0s) by Role::Tiny::_install_methods at line 411, avg 2µs/call
# 12 times (13µs+0s) by Role::Tiny::_install_does at line 485, avg 1µs/call
# 10 times (13µs+0s) by Role::Tiny::_install_subs at line 131, avg 1µs/call
# 2 times (3µs+0s) by Role::Tiny::_install_does at line 474, avg 2µs/call
# once (8µs+0s) by Role::Tiny::_build_class_with_roles at line 215 # spent 14µs making 1 call to Role::Tiny::BEGIN@24
# spent 7µs making 1 call to strict::unimport |
25 | 28 | 142µs | 2 | 12µs | # spent 83µs within Role::Tiny::_getstash which was called 26 times, avg 3µs/call:
# 24 times (75µs+0s) by Role::Tiny::_all_subs at line 62, avg 3µs/call
# 2 times (8µs+0s) by Role::Tiny::_load_module at line 47, avg 4µs/call
# spent 9µs (6+3) within Role::Tiny::BEGIN@25 which was called:
# once (6µs+3µs) by Mojo::Base::BEGIN@17 at line 25 # spent 9µs making 1 call to Role::Tiny::BEGIN@25
# spent 3µs making 1 call to strict::unimport |
26 | |||||
27 | sub croak { | ||||
28 | require Carp; | ||||
29 | 2 | 254µs | 2 | 41µs | # spent 24µs (7+17) within Role::Tiny::BEGIN@29 which was called:
# once (7µs+17µs) by Mojo::Base::BEGIN@17 at line 29 # spent 24µs making 1 call to Role::Tiny::BEGIN@29
# spent 17µs making 1 call to warnings::unimport |
30 | *croak = \&Carp::croak; | ||||
31 | goto &Carp::croak; | ||||
32 | } | ||||
33 | |||||
34 | sub Role::Tiny::__GUARD__::DESTROY { | ||||
35 | delete $INC{$_[0]->[0]} if @{$_[0]}; | ||||
36 | } | ||||
37 | |||||
38 | # spent 4.12ms (3.12+998µs) within Role::Tiny::_load_module which was called 2 times, avg 2.06ms/call:
# 2 times (3.12ms+998µs) by Role::Tiny::_require_module at line 57, avg 2.06ms/call | ||||
39 | 2 | 2µs | my ($module) = @_; | ||
40 | 2 | 15µs | 2 | 7µs | (my $file = "$module.pm") =~ s{::}{/}g; # spent 7µs making 2 calls to Role::Tiny::CORE:subst, avg 4µs/call |
41 | return 1 | ||||
42 | 2 | 2µs | if $INC{$file}; | ||
43 | |||||
44 | # can't just ->can('can') because a sub-package Foo::Bar::Baz | ||||
45 | # creates a 'Baz::' key in Foo::Bar's symbol table | ||||
46 | return 1 | ||||
47 | 2 | 3µs | 2 | 8µs | if grep !/::\z/, keys %{_getstash($module)}; # spent 8µs making 2 calls to Role::Tiny::_getstash, avg 4µs/call |
48 | 2 | 1µs | my $guard = _WORK_AROUND_BROKEN_MODULE_STATE | ||
49 | && bless([ $file ], 'Role::Tiny::__GUARD__'); | ||||
50 | local %^H if _WORK_AROUND_HINT_LEAKAGE; | ||||
51 | 2 | 836µs | require $file; | ||
52 | pop @$guard if _WORK_AROUND_BROKEN_MODULE_STATE; | ||||
53 | 2 | 15µs | return 1; | ||
54 | } | ||||
55 | |||||
56 | # spent 4.14ms (17µs+4.12) within Role::Tiny::_require_module which was called 2 times, avg 2.07ms/call:
# 2 times (17µs+4.12ms) by Role::Tiny::_check_roles at line 231, avg 2.07ms/call | ||||
57 | 2 | 11µs | 2 | 4.12ms | _load_module($_[1]); # spent 4.12ms making 2 calls to Role::Tiny::_load_module, avg 2.06ms/call |
58 | } | ||||
59 | |||||
60 | # spent 1.33ms (1.18+147µs) within Role::Tiny::_all_subs which was called 24 times, avg 55µs/call:
# 12 times (749µs+80µs) by Role::Tiny::_install_methods at line 401, avg 69µs/call
# 4 times (275µs+30µs) by Role::Tiny::_concrete_methods_of at line 375, avg 76µs/call
# 4 times (83µs+22µs) by Moo::Role::_non_methods at line 150 of Moo/Role.pm, avg 26µs/call
# 4 times (77µs+15µs) by Role::Tiny::make_role at line 115, avg 23µs/call | ||||
61 | 24 | 10µs | my ($me, $package) = @_; | ||
62 | 24 | 34µs | 24 | 75µs | my $stash = _getstash($package); # spent 75µs making 24 calls to Role::Tiny::_getstash, avg 3µs/call |
63 | return { | ||||
64 | map {; | ||||
65 | 2 | 947µs | 2 | 17µs | # spent 13µs (9+4) within Role::Tiny::BEGIN@65 which was called:
# once (9µs+4µs) by Mojo::Base::BEGIN@17 at line 65 # spent 13µs making 1 call to Role::Tiny::BEGIN@65
# spent 4µs making 1 call to strict::unimport |
66 | # this is an ugly hack to populate the scalar slot of any globs, to | ||||
67 | # prevent perl from converting constants back into scalar refs in the | ||||
68 | # stash when they are used (perl 5.12 - 5.18). scalar slots on their own | ||||
69 | # aren't detectable through pure perl, so this seems like an acceptable | ||||
70 | # compromise. | ||||
71 | ${"${package}::${_}"} = ${"${package}::${_}"} | ||||
72 | if _CONSTANTS_DEFLATE; | ||||
73 | 292 | 187µs | $_ => \&{"${package}::${_}"} | ||
74 | } | ||||
75 | 24 | 1.05ms | 420 | 72µs | grep exists &{"${package}::${_}"}, # spent 72µs making 420 calls to Role::Tiny::CORE:match, avg 171ns/call |
76 | grep !/::\z/, | ||||
77 | keys %$stash | ||||
78 | }; | ||||
79 | } | ||||
80 | |||||
81 | # spent 1.23ms (71µs+1.16) within Role::Tiny::import which was called 4 times, avg 307µs/call:
# 2 times (40µs+901µs) by JSON::Schema::Modern::Vocabulary::BEGIN@10 or MooX::TypeTiny::Role::GenerateAccessor::BEGIN@2 at line 55 of Moo/Role.pm, avg 470µs/call
# once (11µs+155µs) by Data::Perl::Role::Collection::Array::BEGIN@7 at line 7 of Data/Perl/Role/Collection/Array.pm
# once (20µs+100µs) by Data::Perl::Role::Collection::Hash::BEGIN@7 at line 7 of Data/Perl/Role/Collection/Hash.pm | ||||
82 | 4 | 3µs | my $target = caller; | ||
83 | 4 | 0s | my $me = shift; | ||
84 | 4 | 21µs | 4 | 8µs | strict->import; # spent 8µs making 4 calls to strict::import, avg 2µs/call |
85 | 4 | 5µs | 4 | 117µs | warnings->import; # spent 117µs making 4 calls to warnings::import, avg 29µs/call |
86 | 4 | 11µs | 4 | 104µs | my $non_methods = $me->_non_methods($target); # spent 99µs making 2 calls to Moo::Role::_non_methods, avg 50µs/call
# spent 5µs making 2 calls to Role::Tiny::_non_methods, avg 2µs/call |
87 | 4 | 7µs | 4 | 549µs | $me->_install_subs($target, @_); # spent 460µs making 2 calls to Moo::Role::_install_subs, avg 230µs/call
# spent 89µs making 2 calls to Role::Tiny::_install_subs, avg 44µs/call |
88 | 4 | 8µs | 4 | 378µs | $me->make_role($target); # spent 378µs making 4 calls to Role::Tiny::make_role, avg 94µs/call |
89 | 4 | 3µs | $me->_mark_new_non_methods($target, $non_methods) | ||
90 | if $non_methods && %$non_methods; | ||||
91 | 4 | 19µs | return; | ||
92 | } | ||||
93 | |||||
94 | sub _mark_new_non_methods { | ||||
95 | my ($me, $target, $old_non_methods) = @_; | ||||
96 | |||||
97 | my $non_methods = $INFO{$target}{non_methods}; | ||||
98 | |||||
99 | my $subs = $me->_all_subs($target); | ||||
100 | for my $sub (keys %$subs) { | ||||
101 | if ( exists $old_non_methods->{$sub} && $non_methods->{$sub} != $subs->{$sub} ) { | ||||
102 | $non_methods->{$sub} = $subs->{$sub}; | ||||
103 | } | ||||
104 | } | ||||
105 | |||||
106 | return; | ||||
107 | } | ||||
108 | |||||
109 | # spent 378µs (137+241) within Role::Tiny::make_role which was called 4 times, avg 94µs/call:
# 4 times (137µs+241µs) by Role::Tiny::import at line 88, avg 94µs/call | ||||
110 | 4 | 3µs | my ($me, $target) = @_; | ||
111 | |||||
112 | 4 | 5µs | 4 | 139µs | return if $me->is_role($target); # spent 139µs making 2 calls to Moo::Role::is_role, avg 70µs/call
# spent 0s making 2 calls to Role::Tiny::is_role, avg 0s/call |
113 | 4 | 6µs | $INFO{$target}{is_role} = 1; | ||
114 | |||||
115 | 4 | 4µs | 4 | 92µs | my $non_methods = $me->_all_subs($target); # spent 92µs making 4 calls to Role::Tiny::_all_subs, avg 23µs/call |
116 | 4 | 28µs | 24 | 2µs | delete @{$non_methods}{grep /\A\(/, keys %$non_methods}; # spent 2µs making 24 calls to Role::Tiny::CORE:match, avg 83ns/call |
117 | 4 | 3µs | $INFO{$target}{non_methods} = $non_methods; | ||
118 | |||||
119 | # a role does itself | ||||
120 | 4 | 8µs | $APPLIED_TO{$target} = { $target => undef }; | ||
121 | 4 | 42µs | foreach my $hook (@ON_ROLE_CREATE) { | ||
122 | 4 | 9µs | 4 | 8µs | $hook->($target); # spent 8µs making 4 calls to Moo::Role::__ANON__[Moo/Role.pm:123], avg 2µs/call |
123 | } | ||||
124 | } | ||||
125 | |||||
126 | # spent 89µs (43+46) within Role::Tiny::_install_subs which was called 2 times, avg 44µs/call:
# 2 times (43µs+46µs) by Role::Tiny::import at line 87, avg 44µs/call | ||||
127 | 2 | 0s | my ($me, $target) = @_; | ||
128 | 2 | 4µs | 2 | 5µs | return if $me->is_role($target); # spent 5µs making 2 calls to Role::Tiny::is_role, avg 2µs/call |
129 | 2 | 7µs | 2 | 23µs | my %install = $me->_gen_subs($target); # spent 23µs making 2 calls to Role::Tiny::_gen_subs, avg 12µs/call |
130 | *{_getglob("${target}::${_}")} = $install{$_} | ||||
131 | 2 | 23µs | 12 | 18µs | for sort keys %install; # spent 13µs making 10 calls to Role::Tiny::_getglob, avg 1µs/call
# spent 5µs making 2 calls to Role::Tiny::CORE:sort, avg 2µs/call |
132 | 2 | 4µs | return; | ||
133 | } | ||||
134 | |||||
135 | # spent 23µs within Role::Tiny::_gen_subs which was called 2 times, avg 12µs/call:
# 2 times (23µs+0s) by Role::Tiny::_install_subs at line 129, avg 12µs/call | ||||
136 | 2 | 0s | my ($me, $target) = @_; | ||
137 | ( | ||||
138 | (map {; | ||||
139 | 6 | 1µs | my $type = $_; | ||
140 | $type => sub { | ||||
141 | my $code = pop; | ||||
142 | my @names = ref $_[0] eq 'ARRAY' ? @{ $_[0] } : @_; | ||||
143 | push @{$INFO{$target}{modifiers}||=[]}, [ $type, @names, $code ]; | ||||
144 | return; | ||||
145 | 6 | 8µs | }; | ||
146 | } qw(before after around)), | ||||
147 | requires => sub { | ||||
148 | push @{$INFO{$target}{requires}||=[]}, @_; | ||||
149 | return; | ||||
150 | }, | ||||
151 | with => sub { | ||||
152 | $me->apply_roles_to_package($target, @_); | ||||
153 | return; | ||||
154 | }, | ||||
155 | 2 | 15µs | ); | ||
156 | } | ||||
157 | |||||
158 | # spent 19µs within Role::Tiny::role_application_steps which was called 12 times, avg 2µs/call:
# 10 times (16µs+0s) by Moo::Role::role_application_steps at line 294 of Moo/Role.pm, avg 2µs/call
# 2 times (3µs+0s) by Role::Tiny::apply_roles_to_package at line 301, avg 2µs/call | ||||
159 | 12 | 23µs | qw( | ||
160 | _install_methods | ||||
161 | _check_requires | ||||
162 | _install_modifiers | ||||
163 | _copy_applied_list | ||||
164 | ); | ||||
165 | } | ||||
166 | |||||
167 | # spent 43µs within Role::Tiny::_copy_applied_list which was called 12 times, avg 4µs/call:
# 12 times (43µs+0s) by Role::Tiny::apply_roles_to_package at line 312, avg 4µs/call | ||||
168 | 12 | 4µs | my ($me, $to, $role) = @_; | ||
169 | # copy our role list into the target's | ||||
170 | 12 | 51µs | @{$APPLIED_TO{$to}||={}}{keys %{$APPLIED_TO{$role}}} = (); | ||
171 | } | ||||
172 | |||||
173 | # spent 3.31ms (53µs+3.26) within Role::Tiny::apply_roles_to_object which was called 7 times, avg 473µs/call:
# 7 times (53µs+3.26ms) by Moo::Role::apply_roles_to_object at line 376 of Moo/Role.pm, avg 473µs/call | ||||
174 | 7 | 4µs | my ($me, $object, @roles) = @_; | ||
175 | 7 | 4µs | my $class = ref($object); | ||
176 | # on perl < 5.8.9, magic isn't copied to all ref copies. bless the parameter | ||||
177 | # directly, so at least the variable passed to us will get any magic applied | ||||
178 | 7 | 140µs | 7 | 3.26ms | bless($_[1], $me->create_class_with_roles($class, @roles)); # spent 3.26ms making 7 calls to Role::Tiny::create_class_with_roles, avg 465µs/call |
179 | } | ||||
180 | |||||
181 | 1 | 0s | my $role_suffix = 'A000'; | ||
182 | # spent 34µs within Role::Tiny::_composite_name which was called 7 times, avg 5µs/call:
# 7 times (34µs+0s) by Role::Tiny::create_class_with_roles at line 203, avg 5µs/call | ||||
183 | 7 | 5µs | my ($me, $superclass, @roles) = @_; | ||
184 | |||||
185 | 7 | 11µs | my $new_name = $superclass . '__WITH__' . join '__AND__', @roles; | ||
186 | |||||
187 | 7 | 7µs | if (length($new_name) > 252) { | ||
188 | $new_name = $COMPOSED{abbrev}{$new_name} ||= do { | ||||
189 | my $abbrev = substr $new_name, 0, 250 - length $role_suffix; | ||||
190 | $abbrev =~ s/(?<!:):$//; | ||||
191 | $abbrev.'__'.$role_suffix++; | ||||
192 | }; | ||||
193 | } | ||||
194 | 7 | 16µs | return $new_name; | ||
195 | } | ||||
196 | |||||
197 | # spent 3.26ms (110µs+3.15) within Role::Tiny::create_class_with_roles which was called 7 times, avg 465µs/call:
# 7 times (110µs+3.15ms) by Role::Tiny::apply_roles_to_object at line 178, avg 465µs/call | ||||
198 | 7 | 4µs | my ($me, $superclass, @roles) = @_; | ||
199 | |||||
200 | 7 | 16µs | 7 | 173µs | $me->_require_module($superclass); # spent 173µs making 7 calls to Moo::Role::_require_module, avg 25µs/call |
201 | 7 | 15µs | 7 | 2.12ms | $me->_check_roles(@roles); # spent 2.12ms making 7 calls to Role::Tiny::_check_roles, avg 303µs/call |
202 | |||||
203 | 7 | 18µs | 7 | 34µs | my $new_name = $me->_composite_name($superclass, @roles); # spent 34µs making 7 calls to Role::Tiny::_composite_name, avg 5µs/call |
204 | |||||
205 | return $new_name | ||||
206 | 7 | 28µs | if $COMPOSED{class}{$new_name}; | ||
207 | |||||
208 | 1 | 5µs | 1 | 815µs | return $me->_build_class_with_roles($new_name, $superclass, @roles); # spent 815µs making 1 call to Moo::Role::_build_class_with_roles |
209 | } | ||||
210 | |||||
211 | # spent 752µs (19+733) within Role::Tiny::_build_class_with_roles which was called:
# once (19µs+733µs) by Moo::Role::_build_class_with_roles at line 301 of Moo/Role.pm | ||||
212 | 1 | 1µs | my ($me, $new_name, $superclass, @roles) = @_; | ||
213 | |||||
214 | 1 | 1µs | $COMPOSED{base}{$new_name} = $superclass; | ||
215 | 1 | 10µs | 1 | 8µs | @{*{_getglob("${new_name}::ISA")}} = ( $superclass ); # spent 8µs making 1 call to Role::Tiny::_getglob |
216 | 1 | 4µs | 1 | 725µs | $me->apply_roles_to_package($new_name, @roles); # spent 725µs making 1 call to Role::Tiny::apply_roles_to_package |
217 | 1 | 1µs | $COMPOSED{class}{$new_name} = 1; | ||
218 | 1 | 2µs | return $new_name; | ||
219 | } | ||||
220 | |||||
221 | sub _check_roles { | ||||
222 | 19 | 14µs | my ($me, @roles) = @_; | ||
223 | 19 | 1µs | croak "No roles supplied!" unless @roles; | ||
224 | |||||
225 | 19 | 4µs | my %seen; | ||
226 | 19 | 49µs | if (my @dupes = grep 1 == $seen{$_}++, @roles) { | ||
227 | croak "Duplicated roles: ".join(', ', @dupes); | ||||
228 | } | ||||
229 | |||||
230 | 19 | 73µs | foreach my $role (@roles) { | ||
231 | 19 | 26µs | 19 | 10.3ms | $me->_require_module($role); # spent 6.13ms making 17 calls to Moo::Role::_require_module, avg 361µs/call
# spent 4.14ms making 2 calls to Role::Tiny::_require_module, avg 2.07ms/call |
232 | 19 | 51µs | 19 | 478µs | croak "${role} is not a ${me}" unless $me->is_role($role); # spent 468µs making 17 calls to Moo::Role::is_role, avg 28µs/call
# spent 10µs making 2 calls to Role::Tiny::is_role, avg 5µs/call |
233 | } | ||||
234 | } | ||||
235 | |||||
236 | our %BACKCOMPAT_HACK; | ||||
237 | 1 | 1µs | $BACKCOMPAT_HACK{+__PACKAGE__} = 0; | ||
238 | # spent 35µs (33+2) within Role::Tiny::_want_backcompat_hack which was called 12 times, avg 3µs/call:
# 12 times (33µs+2µs) by Role::Tiny::apply_roles_to_package at line 293, avg 3µs/call | ||||
239 | 12 | 4µs | my $me = shift; | ||
240 | return $BACKCOMPAT_HACK{$me} | ||||
241 | 12 | 28µs | if exists $BACKCOMPAT_HACK{$me}; | ||
242 | 2 | 1.63ms | 2 | 44µs | # spent 26µs (8+18) within Role::Tiny::BEGIN@242 which was called:
# once (8µs+18µs) by Mojo::Base::BEGIN@17 at line 242 # spent 26µs making 1 call to Role::Tiny::BEGIN@242
# spent 18µs making 1 call to warnings::unimport |
243 | 1 | 8µs | 1 | 2µs | $BACKCOMPAT_HACK{$me} = # spent 2µs making 1 call to UNIVERSAL::can |
244 | $me->can('apply_single_role_to_package') != \&apply_single_role_to_package | ||||
245 | && $me->can('role_application_steps') == \&role_application_steps | ||||
246 | } | ||||
247 | |||||
248 | our $IN_APPLY_ROLES; | ||||
249 | sub apply_single_role_to_package { | ||||
250 | return | ||||
251 | if $IN_APPLY_ROLES; | ||||
252 | local $IN_APPLY_ROLES = 1; | ||||
253 | |||||
254 | my ($me, $to, $role) = @_; | ||||
255 | $me->apply_roles_to_package($to, $role); | ||||
256 | } | ||||
257 | |||||
258 | sub apply_role_to_package { | ||||
259 | my ($me, $to, $role) = @_; | ||||
260 | $me->apply_roles_to_package($to, $role); | ||||
261 | } | ||||
262 | |||||
263 | # spent 14.5ms (506µs+14.0) within Role::Tiny::apply_roles_to_package which was called 12 times, avg 1.21ms/call:
# 9 times (386µs+8.17ms) by Moo::with at line 104 of Moo.pm, avg 951µs/call
# 2 times (76µs+5.13ms) by Role::Tiny::With::with at line 16 of Role/Tiny/With.pm, avg 2.60ms/call
# once (44µs+681µs) by Role::Tiny::_build_class_with_roles at line 216 | ||||
264 | 12 | 19µs | my ($me, $to, @roles) = @_; | ||
265 | 12 | 9µs | croak "Can't apply roles to object with apply_roles_to_package" | ||
266 | if ref $to; | ||||
267 | |||||
268 | 12 | 24µs | 12 | 8.87ms | $me->_check_roles(@roles); # spent 8.87ms making 12 calls to Role::Tiny::_check_roles, avg 739µs/call |
269 | |||||
270 | 12 | 9µs | my @have_conflicts; | ||
271 | my %role_methods; | ||||
272 | |||||
273 | 12 | 6µs | if (@roles > 1) { | ||
274 | my %conflicts = %{$me->_composite_info_for(@roles)->{conflicts}}; | ||||
275 | @have_conflicts = grep $to->can($_), keys %conflicts; | ||||
276 | delete @conflicts{@have_conflicts}; | ||||
277 | |||||
278 | if (keys %conflicts) { | ||||
279 | my $class = $COMPOSED{base}{$to} || $to; | ||||
280 | my $fail = | ||||
281 | join "\n", | ||||
282 | map { | ||||
283 | "Due to a method name conflict between roles " | ||||
284 | .join(' and ', map "'$_'", sort values %{$conflicts{$_}}) | ||||
285 | .", the method '$_' must be implemented by '$class'" | ||||
286 | } sort keys %conflicts; | ||||
287 | croak $fail; | ||||
288 | } | ||||
289 | |||||
290 | %role_methods = map +($_ => $me->_concrete_methods_of($_)), @roles; | ||||
291 | } | ||||
292 | |||||
293 | 12 | 57µs | 12 | 35µs | if (!$IN_APPLY_ROLES and _want_backcompat_hack($me)) { # spent 35µs making 12 calls to Role::Tiny::_want_backcompat_hack, avg 3µs/call |
294 | local $IN_APPLY_ROLES = 1; | ||||
295 | foreach my $role (@roles) { | ||||
296 | $me->apply_single_role_to_package($to, $role); | ||||
297 | } | ||||
298 | } | ||||
299 | |||||
300 | 12 | 4µs | my $role_methods; | ||
301 | 12 | 29µs | 12 | 53µs | foreach my $step ($me->role_application_steps) { # spent 50µs making 10 calls to Moo::Role::role_application_steps, avg 5µs/call
# spent 3µs making 2 calls to Role::Tiny::role_application_steps, avg 2µs/call |
302 | 78 | 37µs | foreach my $role (@roles) { | ||
303 | # conflicting methods are supposed to be treated as required by the | ||||
304 | # composed role. we don't have an actual composed role, but because | ||||
305 | # we know the target class already provides them, we can instead | ||||
306 | # pretend that the roles don't do for the duration of application. | ||||
307 | $role_methods = $role_methods{$role} and ( | ||||
308 | (local @{$role_methods}{@have_conflicts}), | ||||
309 | 78 | 23µs | (delete @{$role_methods}{@have_conflicts}), | ||
310 | ); | ||||
311 | |||||
312 | 78 | 164µs | 78 | 5.03ms | $me->$step($to, $role); # spent 3.09ms making 12 calls to Role::Tiny::_install_methods, avg 257µs/call
# spent 1.01ms making 10 calls to Moo::Role::_undefer_subs, avg 101µs/call
# spent 396µs making 10 calls to Moo::Role::_maybe_make_accessors, avg 40µs/call
# spent 384µs making 12 calls to Role::Tiny::_install_modifiers, avg 32µs/call
# spent 88µs making 12 calls to Role::Tiny::_check_requires, avg 7µs/call
# spent 43µs making 12 calls to Role::Tiny::_copy_applied_list, avg 4µs/call
# spent 25µs making 10 calls to Moo::Role::_handle_constructor, avg 2µs/call |
313 | } | ||||
314 | } | ||||
315 | 12 | 50µs | $APPLIED_TO{$to}{join('|',@roles)} = 1; | ||
316 | } | ||||
317 | |||||
318 | sub _composite_info_for { | ||||
319 | my ($me, @roles) = @_; | ||||
320 | $COMPOSITE_INFO{join('|', sort @roles)} ||= do { | ||||
321 | my %methods; | ||||
322 | foreach my $role (@roles) { | ||||
323 | my $this_methods = $me->_concrete_methods_of($role); | ||||
324 | $methods{$_}{$this_methods->{$_}} = $role for keys %$this_methods; | ||||
325 | } | ||||
326 | delete $methods{$_} for grep keys(%{$methods{$_}}) == 1, keys %methods; | ||||
327 | +{ conflicts => \%methods } | ||||
328 | }; | ||||
329 | } | ||||
330 | |||||
331 | # spent 88µs (73+15) within Role::Tiny::_check_requires which was called 12 times, avg 7µs/call:
# 12 times (73µs+15µs) by Role::Tiny::apply_roles_to_package at line 312, avg 7µs/call | ||||
332 | 12 | 6µs | my ($me, $to, $name, $requires) = @_; | ||
333 | 12 | 13µs | $requires ||= $INFO{$name}{requires} || []; | ||
334 | 12 | 77µs | 18 | 15µs | if (my @requires_fail = grep !$to->can($_), @$requires) { # spent 15µs making 18 calls to UNIVERSAL::can, avg 833ns/call |
335 | # role -> role, add to requires, role -> class, error out | ||||
336 | if (my $to_info = $INFO{$to}) { | ||||
337 | push @{$to_info->{requires}||=[]}, @requires_fail; | ||||
338 | } else { | ||||
339 | croak "Can't apply ${name} to ${to} - missing ".join(', ', @requires_fail); | ||||
340 | } | ||||
341 | } | ||||
342 | } | ||||
343 | |||||
344 | # spent 43µs within Role::Tiny::_non_methods which was called 8 times, avg 5µs/call:
# 4 times (19µs+0s) by Moo::Role::_non_methods at line 148 of Moo/Role.pm, avg 5µs/call
# 2 times (19µs+0s) by Role::Tiny::_concrete_methods_of at line 373, avg 10µs/call
# 2 times (5µs+0s) by Role::Tiny::import at line 86, avg 2µs/call | ||||
345 | 8 | 3µs | my ($me, $role) = @_; | ||
346 | 8 | 17µs | my $info = $INFO{$role} or return {}; | ||
347 | |||||
348 | 4 | 15µs | my %non_methods = %{ $info->{non_methods} || {} }; | ||
349 | |||||
350 | # this is only for backwards compatibility with older Moo, which | ||||
351 | # reimplements method tracking rather than calling our method | ||||
352 | 4 | 5µs | my %not_methods = reverse %{ $info->{not_methods} || {} }; | ||
353 | 4 | 11µs | return \%non_methods unless keys %not_methods; | ||
354 | |||||
355 | my $subs = $me->_all_subs($role); | ||||
356 | for my $sub (grep !/\A\(/, keys %$subs) { | ||||
357 | my $code = $subs->{$sub}; | ||||
358 | if (exists $not_methods{$code}) { | ||||
359 | $non_methods{$sub} = $code; | ||||
360 | } | ||||
361 | } | ||||
362 | |||||
363 | return \%non_methods; | ||||
364 | } | ||||
365 | |||||
366 | # spent 572µs (102+470) within Role::Tiny::_concrete_methods_of which was called 12 times, avg 48µs/call:
# 12 times (102µs+470µs) by Role::Tiny::_install_methods at line 398, avg 48µs/call | ||||
367 | 12 | 4µs | my ($me, $role) = @_; | ||
368 | 12 | 4µs | my $info = $INFO{$role}; | ||
369 | |||||
370 | return $info->{methods} | ||||
371 | 12 | 22µs | if $info && $info->{methods}; | ||
372 | |||||
373 | 4 | 5µs | 4 | 165µs | my $non_methods = $me->_non_methods($role); # spent 146µs making 2 calls to Moo::Role::_non_methods, avg 73µs/call
# spent 19µs making 2 calls to Role::Tiny::_non_methods, avg 10µs/call |
374 | |||||
375 | 4 | 8µs | 4 | 305µs | my $subs = $me->_all_subs($role); # spent 305µs making 4 calls to Role::Tiny::_all_subs, avg 76µs/call |
376 | 4 | 9µs | for my $sub (keys %$subs) { | ||
377 | 84 | 21µs | if ( exists $non_methods->{$sub} && $non_methods->{$sub} == $subs->{$sub} ) { | ||
378 | delete $subs->{$sub}; | ||||
379 | } | ||||
380 | } | ||||
381 | |||||
382 | 4 | 4µs | if ($info) { | ||
383 | $info->{methods} = $subs; | ||||
384 | } | ||||
385 | 4 | 15µs | return $subs; | ||
386 | } | ||||
387 | |||||
388 | sub methods_provided_by { | ||||
389 | my ($me, $role) = @_; | ||||
390 | $me->_require_module($role); | ||||
391 | croak "${role} is not a ${me}" unless $me->is_role($role); | ||||
392 | sort (keys %{$me->_concrete_methods_of($role)}, @{$INFO{$role}->{requires}||[]}); | ||||
393 | } | ||||
394 | |||||
395 | # spent 3.09ms (646µs+2.44) within Role::Tiny::_install_methods which was called 12 times, avg 257µs/call:
# 12 times (646µs+2.44ms) by Role::Tiny::apply_roles_to_package at line 312, avg 257µs/call | ||||
396 | 12 | 7µs | my ($me, $to, $role) = @_; | ||
397 | |||||
398 | 12 | 28µs | 12 | 572µs | my $methods = $me->_concrete_methods_of($role); # spent 572µs making 12 calls to Role::Tiny::_concrete_methods_of, avg 48µs/call |
399 | |||||
400 | 12 | 4µs | my %existing_methods; | ||
401 | 12 | 73µs | 12 | 829µs | @existing_methods{keys %{ $me->_all_subs($to) }} = (); # spent 829µs making 12 calls to Role::Tiny::_all_subs, avg 69µs/call |
402 | |||||
403 | # _concrete_methods_of caches its result on roles. that cache needs to be | ||||
404 | # invalidated after applying roles | ||||
405 | 12 | 9µs | delete $INFO{$to}{methods} if $INFO{$to}; | ||
406 | |||||
407 | 12 | 80µs | foreach my $i (keys %$methods) { | ||
408 | next | ||||
409 | 131 | 21µs | if exists $existing_methods{$i}; | ||
410 | |||||
411 | 123 | 153µs | 123 | 272µs | my $glob = _getglob "${to}::${i}"; # spent 272µs making 123 calls to Role::Tiny::_getglob, avg 2µs/call |
412 | 123 | 46µs | *$glob = $methods->{$i}; | ||
413 | |||||
414 | # overloads using method names have the method stored in the scalar slot | ||||
415 | # and &overload::nil in the code slot. | ||||
416 | next | ||||
417 | unless $i =~ /^\(/ | ||||
418 | && ((defined &overload::nil && $methods->{$i} == \&overload::nil) | ||||
419 | 123 | 162µs | 123 | 20µs | || (defined &overload::_nil && $methods->{$i} == \&overload::_nil)); # spent 20µs making 123 calls to Role::Tiny::CORE:match, avg 163ns/call |
420 | |||||
421 | my $overload = ${ _getglob "${role}::${i}" }; | ||||
422 | next | ||||
423 | unless defined $overload; | ||||
424 | |||||
425 | *$glob = \$overload; | ||||
426 | } | ||||
427 | |||||
428 | 12 | 72µs | 12 | 747µs | $me->_install_does($to); # spent 631µs making 10 calls to Moo::Role::_install_does, avg 63µs/call
# spent 116µs making 2 calls to Role::Tiny::_install_does, avg 58µs/call |
429 | } | ||||
430 | |||||
431 | # spent 384µs (42+342) within Role::Tiny::_install_modifiers which was called 12 times, avg 32µs/call:
# 12 times (42µs+342µs) by Role::Tiny::apply_roles_to_package at line 312, avg 32µs/call | ||||
432 | 12 | 7µs | my ($me, $to, $name) = @_; | ||
433 | 12 | 29µs | return unless my $modifiers = $INFO{$name}{modifiers}; | ||
434 | 1 | 0s | my $info = $INFO{$to}; | ||
435 | 1 | 6µs | my $existing = ($info ? $info->{modifiers} : $COMPOSED{modifiers}{$to}) ||= []; | ||
436 | my @modifiers = grep { | ||||
437 | 2 | 0s | my $modifier = $_; | ||
438 | 2 | 2µs | !grep $_ == $modifier, @$existing; | ||
439 | 1 | 0s | } @{$modifiers||[]}; | ||
440 | 1 | 0s | push @$existing, @modifiers; | ||
441 | |||||
442 | 1 | 4µs | if (!$info) { | ||
443 | foreach my $modifier (@modifiers) { | ||||
444 | 2 | 4µs | 2 | 342µs | $me->_install_single_modifier($to, @$modifier); # spent 342µs making 2 calls to Moo::Role::_install_single_modifier, avg 171µs/call |
445 | } | ||||
446 | } | ||||
447 | } | ||||
448 | |||||
449 | 1 | 0s | my $vcheck_error; | ||
450 | |||||
451 | sub _install_single_modifier { | ||||
452 | my ($me, @args) = @_; | ||||
453 | defined($vcheck_error) or $vcheck_error = do { | ||||
454 | local $@; | ||||
455 | eval { | ||||
456 | require Class::Method::Modifiers; | ||||
457 | Class::Method::Modifiers->VERSION(1.05); | ||||
458 | 1; | ||||
459 | } ? 0 : $@; | ||||
460 | }; | ||||
461 | $vcheck_error and die $vcheck_error; | ||||
462 | Class::Method::Modifiers::install_modifier(@args); | ||||
463 | } | ||||
464 | |||||
465 | 1 | 3µs | my $FALLBACK = sub { 0 }; | ||
466 | # spent 564µs (312+252) within Role::Tiny::_install_does which was called 12 times, avg 47µs/call:
# 10 times (226µs+222µs) by Moo::Role::_install_does at line 400 of Moo/Role.pm, avg 45µs/call
# 2 times (86µs+30µs) by Role::Tiny::_install_methods at line 428, avg 58µs/call | ||||
467 | 12 | 4µs | my ($me, $to) = @_; | ||
468 | |||||
469 | # only add does() method to classes | ||||
470 | 12 | 16µs | 12 | 132µs | return if $me->is_role($to); # spent 127µs making 10 calls to Moo::Role::is_role, avg 13µs/call
# spent 5µs making 2 calls to Role::Tiny::is_role, avg 2µs/call |
471 | |||||
472 | 12 | 48µs | 12 | 18µs | my $does = $me->can('does_role'); # spent 18µs making 12 calls to UNIVERSAL::can, avg 2µs/call |
473 | # add does() only if they don't have one | ||||
474 | 12 | 123µs | 14 | 46µs | *{_getglob "${to}::does"} = $does unless $to->can('does'); # spent 43µs making 12 calls to UNIVERSAL::can, avg 4µs/call
# spent 3µs making 2 calls to Role::Tiny::_getglob, avg 2µs/call |
475 | |||||
476 | return | ||||
477 | 12 | 93µs | 36 | 37µs | if $to->can('DOES') and $to->can('DOES') != (UNIVERSAL->can('DOES') || 0); # spent 37µs making 36 calls to UNIVERSAL::can, avg 1µs/call |
478 | |||||
479 | 12 | 24µs | 12 | 6µs | my $existing = $to->can('DOES') || $to->can('isa') || $FALLBACK; # spent 6µs making 12 calls to UNIVERSAL::can, avg 500ns/call |
480 | # spent 615µs (216+399) within JSON::Schema::Modern::Vocabulary::Unevaluated::DOES which was called 76 times, avg 8µs/call:
# 36 times (116µs+195µs) by Type::Tiny::__ANON__[(eval 428)[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Sub/Quote.pm:3]:16] at line 16 of (eval 428)[Sub/Quote.pm:3], avg 9µs/call
# 24 times (44µs+90µs) by Type::Tiny::__ANON__[(eval 430)[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Sub/Quote.pm:3]:16] at line 16 of (eval 430)[Sub/Quote.pm:3], avg 6µs/call
# 14 times (48µs+104µs) by JSON::Schema::Modern::Document::_assert__path_to_resource at line 24 of (eval 299)[Sub/Quote.pm:3], avg 11µs/call
# once (4µs+7µs) by JSON::Schema::Modern::_assert__metaschema_vocabulary_classes at line 24 of (eval 360)[Sub/Quote.pm:3]
# once (4µs+3µs) by JSON::Schema::Modern::_assert__vocabulary_classes at line 24 of (eval 355)[Sub/Quote.pm:3]
# spent 750µs (326+424) within JSON::Schema::Modern::Vocabulary::Validation::DOES which was called 79 times, avg 9µs/call:
# 36 times (210µs+216µs) by Type::Tiny::__ANON__[(eval 428)[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Sub/Quote.pm:3]:16] at line 16 of (eval 428)[Sub/Quote.pm:3], avg 12µs/call
# 24 times (48µs+87µs) by Type::Tiny::__ANON__[(eval 430)[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Sub/Quote.pm:3]:16] at line 16 of (eval 430)[Sub/Quote.pm:3], avg 6µs/call
# 14 times (50µs+96µs) by JSON::Schema::Modern::Document::_assert__path_to_resource at line 24 of (eval 299)[Sub/Quote.pm:3], avg 10µs/call
# 3 times (13µs+17µs) by JSON::Schema::Modern::_assert__metaschema_vocabulary_classes at line 24 of (eval 360)[Sub/Quote.pm:3], avg 10µs/call
# 2 times (5µs+8µs) by JSON::Schema::Modern::_assert__vocabulary_classes at line 24 of (eval 355)[Sub/Quote.pm:3], avg 6µs/call
# spent 717µs (248+469) within JSON::Schema::Modern::Vocabulary::Content::DOES which was called 79 times, avg 9µs/call:
# 36 times (121µs+243µs) by Type::Tiny::__ANON__[(eval 428)[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Sub/Quote.pm:3]:16] at line 16 of (eval 428)[Sub/Quote.pm:3], avg 10µs/call
# 24 times (75µs+112µs) by Type::Tiny::__ANON__[(eval 430)[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Sub/Quote.pm:3]:16] at line 16 of (eval 430)[Sub/Quote.pm:3], avg 8µs/call
# 14 times (41µs+92µs) by JSON::Schema::Modern::Document::_assert__path_to_resource at line 24 of (eval 299)[Sub/Quote.pm:3], avg 10µs/call
# 3 times (8µs+16µs) by JSON::Schema::Modern::_assert__metaschema_vocabulary_classes at line 24 of (eval 360)[Sub/Quote.pm:3], avg 8µs/call
# 2 times (3µs+6µs) by JSON::Schema::Modern::_assert__vocabulary_classes at line 24 of (eval 355)[Sub/Quote.pm:3], avg 4µs/call
# spent 826µs (255+571) within JSON::Schema::Modern::Vocabulary::Applicator::DOES which was called 79 times, avg 10µs/call:
# 36 times (124µs+337µs) by Type::Tiny::__ANON__[(eval 428)[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Sub/Quote.pm:3]:16] at line 16 of (eval 428)[Sub/Quote.pm:3], avg 13µs/call
# 24 times (62µs+115µs) by Type::Tiny::__ANON__[(eval 430)[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Sub/Quote.pm:3]:16] at line 16 of (eval 430)[Sub/Quote.pm:3], avg 7µs/call
# 14 times (50µs+71µs) by JSON::Schema::Modern::Document::_assert__path_to_resource at line 24 of (eval 299)[Sub/Quote.pm:3], avg 9µs/call
# 3 times (11µs+36µs) by JSON::Schema::Modern::_assert__metaschema_vocabulary_classes at line 24 of (eval 360)[Sub/Quote.pm:3], avg 16µs/call
# 2 times (8µs+12µs) by JSON::Schema::Modern::_assert__vocabulary_classes at line 24 of (eval 355)[Sub/Quote.pm:3], avg 10µs/call
# spent 8µs (4+4) within JSON::Schema::Modern::Vocabulary::FormatAssertion::DOES which was called:
# once (4µs+4µs) by JSON::Schema::Modern::_assert__vocabulary_classes at line 24 of (eval 355)[Sub/Quote.pm:3]
# spent 1.50ms (440µs+1.06) within JSON::Schema::Modern::Vocabulary::Core::DOES which was called 79 times, avg 19µs/call:
# 36 times (199µs+573µs) by Type::Tiny::__ANON__[(eval 428)[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Sub/Quote.pm:3]:16] at line 16 of (eval 428)[Sub/Quote.pm:3], avg 21µs/call
# 24 times (164µs+228µs) by Type::Tiny::__ANON__[(eval 430)[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Sub/Quote.pm:3]:16] at line 16 of (eval 430)[Sub/Quote.pm:3], avg 16µs/call
# 14 times (60µs+209µs) by JSON::Schema::Modern::Document::_assert__path_to_resource at line 24 of (eval 299)[Sub/Quote.pm:3], avg 19µs/call
# 3 times (13µs+40µs) by JSON::Schema::Modern::_assert__metaschema_vocabulary_classes at line 24 of (eval 360)[Sub/Quote.pm:3], avg 18µs/call
# 2 times (4µs+8µs) by JSON::Schema::Modern::_assert__vocabulary_classes at line 24 of (eval 355)[Sub/Quote.pm:3], avg 6µs/call
# spent 100µs (21+79) within JSON::Schema::Modern::Vocabulary::OpenAPI::DOES which was called 5 times, avg 20µs/call:
# 2 times (9µs+7µs) by Type::Tiny::__ANON__[(eval 428)[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Sub/Quote.pm:3]:16] at line 16 of (eval 428)[Sub/Quote.pm:3], avg 8µs/call
# 2 times (5µs+7µs) by Type::Tiny::__ANON__[(eval 430)[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Sub/Quote.pm:3]:16] at line 16 of (eval 430)[Sub/Quote.pm:3], avg 6µs/call
# once (7µs+65µs) by Type::Tiny::__ANON__[(eval 419)[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Sub/Quote.pm:3]:16] at line 16 of (eval 419)[Sub/Quote.pm:3]
# spent 602µs (215+387) within JSON::Schema::Modern::Vocabulary::MetaData::DOES which was called 79 times, avg 8µs/call:
# 36 times (106µs+185µs) by Type::Tiny::__ANON__[(eval 428)[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Sub/Quote.pm:3]:16] at line 16 of (eval 428)[Sub/Quote.pm:3], avg 8µs/call
# 24 times (45µs+93µs) by Type::Tiny::__ANON__[(eval 430)[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Sub/Quote.pm:3]:16] at line 16 of (eval 430)[Sub/Quote.pm:3], avg 6µs/call
# 14 times (48µs+89µs) by JSON::Schema::Modern::Document::_assert__path_to_resource at line 24 of (eval 299)[Sub/Quote.pm:3], avg 10µs/call
# 3 times (12µs+13µs) by JSON::Schema::Modern::_assert__metaschema_vocabulary_classes at line 24 of (eval 360)[Sub/Quote.pm:3], avg 8µs/call
# 2 times (4µs+7µs) by JSON::Schema::Modern::_assert__vocabulary_classes at line 24 of (eval 355)[Sub/Quote.pm:3], avg 6µs/call
# spent 631µs (215+416) within JSON::Schema::Modern::Vocabulary::FormatAnnotation::DOES which was called 79 times, avg 8µs/call:
# 36 times (106µs+206µs) by Type::Tiny::__ANON__[(eval 428)[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Sub/Quote.pm:3]:16] at line 16 of (eval 428)[Sub/Quote.pm:3], avg 9µs/call
# 24 times (49µs+107µs) by Type::Tiny::__ANON__[(eval 430)[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Sub/Quote.pm:3]:16] at line 16 of (eval 430)[Sub/Quote.pm:3], avg 6µs/call
# 14 times (44µs+78µs) by JSON::Schema::Modern::Document::_assert__path_to_resource at line 24 of (eval 299)[Sub/Quote.pm:3], avg 9µs/call
# 3 times (9µs+19µs) by JSON::Schema::Modern::_assert__metaschema_vocabulary_classes at line 24 of (eval 360)[Sub/Quote.pm:3], avg 9µs/call
# 2 times (7µs+6µs) by JSON::Schema::Modern::_assert__vocabulary_classes at line 24 of (eval 355)[Sub/Quote.pm:3], avg 6µs/call | ||||
481 | 556 | 223µs | my ($proto, $role) = @_; | ||
482 | 556 | 1.47ms | 556 | 3.81ms | $proto->$does($role) or $proto->$existing($role); # spent 3.81ms making 556 calls to Moo::Role::does_role, avg 7µs/call |
483 | 12 | 38µs | }; | ||
484 | 2 | 329µs | 2 | 61µs | # spent 36µs (11+25) within Role::Tiny::BEGIN@484 which was called:
# once (11µs+25µs) by Mojo::Base::BEGIN@17 at line 484 # spent 36µs making 1 call to Role::Tiny::BEGIN@484
# spent 25µs making 1 call to warnings::unimport |
485 | 12 | 52µs | 12 | 13µs | return *{_getglob "${to}::DOES"} = $new_sub; # spent 13µs making 12 calls to Role::Tiny::_getglob, avg 1µs/call |
486 | } | ||||
487 | |||||
488 | # optimize for newer perls | ||||
489 | require mro | ||||
490 | 1 | 2µs | if "$]" >= 5.009_005; | ||
491 | |||||
492 | 1 | 2µs | if (defined &mro::get_linear_isa) { | ||
493 | *_linear_isa = \&mro::get_linear_isa; | ||||
494 | } | ||||
495 | else { | ||||
496 | my $e; | ||||
497 | { | ||||
498 | local $@; | ||||
499 | # this routine is simplified and not fully compatible with mro::get_linear_isa | ||||
500 | # but for our use the order doesn't matter, so we don't need to care | ||||
501 | eval <<'END_CODE' or $e = $@; | ||||
502 | sub _linear_isa($;$) { | ||||
503 | if (defined &mro::get_linear_isa) { | ||||
504 | no warnings 'redefine', 'prototype'; | ||||
505 | *_linear_isa = \&mro::get_linear_isa; | ||||
506 | goto &mro::get_linear_isa; | ||||
507 | } | ||||
508 | |||||
509 | my @check = shift; | ||||
510 | my @lin; | ||||
511 | |||||
512 | my %found; | ||||
513 | while (defined(my $check = shift @check)) { | ||||
514 | push @lin, $check; | ||||
515 | no strict 'refs'; | ||||
516 | unshift @check, grep !$found{$_}++, @{"$check\::ISA"}; | ||||
517 | } | ||||
518 | |||||
519 | return \@lin; | ||||
520 | } | ||||
521 | |||||
522 | 1; | ||||
523 | END_CODE | ||||
524 | } | ||||
525 | die $e if defined $e; | ||||
526 | } | ||||
527 | |||||
528 | # spent 2.88ms (2.32+568µs) within Role::Tiny::does_role which was called 603 times, avg 5µs/call:
# 603 times (2.32ms+568µs) by Moo::Role::does_role at line 406 of Moo/Role.pm, avg 5µs/call | ||||
529 | 603 | 141µs | my ($proto, $role) = @_; | ||
530 | 603 | 1.82ms | 603 | 568µs | foreach my $class (@{_linear_isa(ref($proto)||$proto)}) { # spent 568µs making 603 calls to mro::get_linear_isa, avg 942ns/call |
531 | 610 | 1.46ms | return 1 if exists $APPLIED_TO{$class}{$role}; | ||
532 | } | ||||
533 | 7 | 23µs | return 0; | ||
534 | } | ||||
535 | |||||
536 | # spent 260µs within Role::Tiny::is_role which was called 93 times, avg 3µs/call:
# 34 times (166µs+0s) by Moo::Role::_inhale_if_moose at line 166 of Moo/Role.pm, avg 5µs/call
# 34 times (27µs+0s) by Moo::Role::is_role at line 160 of Moo/Role.pm, avg 794ns/call
# 15 times (42µs+0s) by Moo::import at line 40 of Moo.pm, avg 3µs/call
# 2 times (10µs+0s) by Role::Tiny::_check_roles at line 232, avg 5µs/call
# 2 times (5µs+0s) by Moo::_set_superclasses at line 149 of Moo.pm, avg 2µs/call
# 2 times (5µs+0s) by Role::Tiny::_install_does at line 470, avg 2µs/call
# 2 times (5µs+0s) by Role::Tiny::_install_subs at line 128, avg 2µs/call
# 2 times (0s+0s) by Role::Tiny::make_role at line 112, avg 0s/call | ||||
537 | 93 | 28µs | my ($me, $role) = @_; | ||
538 | return !!($INFO{$role} && ( | ||||
539 | $INFO{$role}{is_role} | ||||
540 | # these are for backward compatibility with older Moo that overrode some | ||||
541 | # methods without calling the originals, thus not getting is_role set | ||||
542 | || $INFO{$role}{requires} | ||||
543 | || $INFO{$role}{not_methods} | ||||
544 | || $INFO{$role}{non_methods} | ||||
545 | 93 | 409µs | )); | ||
546 | } | ||||
547 | |||||
548 | 1 | 9µs | 1; | ||
549 | __END__ | ||||
# spent 94µs within Role::Tiny::CORE:match which was called 567 times, avg 166ns/call:
# 420 times (72µs+0s) by Role::Tiny::_all_subs at line 75, avg 171ns/call
# 123 times (20µs+0s) by Role::Tiny::_install_methods at line 419, avg 163ns/call
# 24 times (2µs+0s) by Role::Tiny::make_role at line 116, avg 83ns/call | |||||
# spent 5µs within Role::Tiny::CORE:sort which was called 2 times, avg 2µs/call:
# 2 times (5µs+0s) by Role::Tiny::_install_subs at line 131, avg 2µs/call | |||||
# spent 7µs within Role::Tiny::CORE:subst which was called 2 times, avg 4µs/call:
# 2 times (7µs+0s) by Role::Tiny::_load_module at line 40, avg 4µs/call |