Filename | /Users/ap13/perl5/lib/perl5/darwin-2level/Class/MOP/Mixin/HasOverloads.pm |
Statements | Executed 28 statements in 1.53ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
1 | 1 | 1 | 1.42ms | 1.68ms | BEGIN@7 | Class::MOP::Mixin::HasOverloads::
1 | 1 | 1 | 726µs | 4.78ms | BEGIN@9 | Class::MOP::Mixin::HasOverloads::
1 | 1 | 1 | 29µs | 56µs | BEGIN@4 | Class::MOP::Mixin::HasOverloads::
4 | 1 | 1 | 29µs | 133µs | is_overloaded | Class::MOP::Mixin::HasOverloads::
1 | 1 | 1 | 18µs | 53µs | BEGIN@10 | Class::MOP::Mixin::HasOverloads::
1 | 1 | 1 | 17µs | 95µs | BEGIN@50 | Class::MOP::Mixin::HasOverloads::
1 | 1 | 1 | 13µs | 51µs | BEGIN@11 | Class::MOP::Mixin::HasOverloads::
1 | 1 | 1 | 13µs | 23µs | BEGIN@5 | Class::MOP::Mixin::HasOverloads::
1 | 1 | 1 | 12µs | 55µs | BEGIN@15 | Class::MOP::Mixin::HasOverloads::
1 | 1 | 1 | 6µs | 6µs | BEGIN@13 | Class::MOP::Mixin::HasOverloads::
0 | 0 | 0 | 0s | 0s | _overload_for | Class::MOP::Mixin::HasOverloads::
0 | 0 | 0 | 0s | 0s | _overload_info | Class::MOP::Mixin::HasOverloads::
0 | 0 | 0 | 0s | 0s | add_overloaded_operator | Class::MOP::Mixin::HasOverloads::
0 | 0 | 0 | 0s | 0s | get_all_overloaded_operators | Class::MOP::Mixin::HasOverloads::
0 | 0 | 0 | 0s | 0s | get_overload_fallback_value | Class::MOP::Mixin::HasOverloads::
0 | 0 | 0 | 0s | 0s | get_overload_list | Class::MOP::Mixin::HasOverloads::
0 | 0 | 0 | 0s | 0s | get_overloaded_operator | Class::MOP::Mixin::HasOverloads::
0 | 0 | 0 | 0s | 0s | has_overloaded_operator | Class::MOP::Mixin::HasOverloads::
0 | 0 | 0 | 0s | 0s | remove_overloaded_operator | Class::MOP::Mixin::HasOverloads::
0 | 0 | 0 | 0s | 0s | set_overload_fallback_value | Class::MOP::Mixin::HasOverloads::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package Class::MOP::Mixin::HasOverloads; | ||||
2 | 1 | 1µs | our $VERSION = '2.1403'; | ||
3 | |||||
4 | 2 | 40µs | 2 | 84µs | # spent 56µs (29+27) within Class::MOP::Mixin::HasOverloads::BEGIN@4 which was called:
# once (29µs+27µs) by Class::MOP::BEGIN@17 at line 4 # spent 56µs making 1 call to Class::MOP::Mixin::HasOverloads::BEGIN@4
# spent 27µs making 1 call to strict::import |
5 | 2 | 36µs | 2 | 33µs | # spent 23µs (13+10) within Class::MOP::Mixin::HasOverloads::BEGIN@5 which was called:
# once (13µs+10µs) by Class::MOP::BEGIN@17 at line 5 # spent 23µs making 1 call to Class::MOP::Mixin::HasOverloads::BEGIN@5
# spent 10µs making 1 call to warnings::import |
6 | |||||
7 | 2 | 220µs | 1 | 1.68ms | # spent 1.68ms (1.42+260µs) within Class::MOP::Mixin::HasOverloads::BEGIN@7 which was called:
# once (1.42ms+260µs) by Class::MOP::BEGIN@17 at line 7 # spent 1.68ms making 1 call to Class::MOP::Mixin::HasOverloads::BEGIN@7 |
8 | |||||
9 | 2 | 206µs | 2 | 4.85ms | # spent 4.78ms (726µs+4.06) within Class::MOP::Mixin::HasOverloads::BEGIN@9 which was called:
# once (726µs+4.06ms) by Class::MOP::BEGIN@17 at line 9 # spent 4.78ms making 1 call to Class::MOP::Mixin::HasOverloads::BEGIN@9
# spent 69µs making 1 call to Exporter::import |
10 | 2 | 46µs | 2 | 88µs | # spent 53µs (18+35) within Class::MOP::Mixin::HasOverloads::BEGIN@10 which was called:
# once (18µs+35µs) by Class::MOP::BEGIN@17 at line 10 # spent 53µs making 1 call to Class::MOP::Mixin::HasOverloads::BEGIN@10
# spent 35µs making 1 call to Exporter::import |
11 | 2 | 38µs | 2 | 88µs | # spent 51µs (13+37) within Class::MOP::Mixin::HasOverloads::BEGIN@11 which was called:
# once (13µs+37µs) by Class::MOP::BEGIN@17 at line 11 # spent 51µs making 1 call to Class::MOP::Mixin::HasOverloads::BEGIN@11
# spent 37µs making 1 call to Exporter::import |
12 | |||||
13 | 2 | 34µs | 1 | 6µs | # spent 6µs within Class::MOP::Mixin::HasOverloads::BEGIN@13 which was called:
# once (6µs+0s) by Class::MOP::BEGIN@17 at line 13 # spent 6µs making 1 call to Class::MOP::Mixin::HasOverloads::BEGIN@13 |
14 | |||||
15 | 2 | 332µs | 2 | 98µs | # spent 55µs (12+43) within Class::MOP::Mixin::HasOverloads::BEGIN@15 which was called:
# once (12µs+43µs) by Class::MOP::BEGIN@17 at line 15 # spent 55µs making 1 call to Class::MOP::Mixin::HasOverloads::BEGIN@15
# spent 43µs making 1 call to parent::import |
16 | |||||
17 | # spent 133µs (29+104) within Class::MOP::Mixin::HasOverloads::is_overloaded which was called 4 times, avg 33µs/call:
# 4 times (29µs+104µs) by Moose::Meta::Role::Application::apply_overloading at line 85 of Moose/Meta/Role/Application.pm, avg 33µs/call | ||||
18 | 4 | 2µs | my $self = shift; | ||
19 | 4 | 40µs | 8 | 104µs | return overload::Overloaded($self->name); # spent 101µs making 4 calls to overload::Overloaded, avg 25µs/call
# spent 2µs making 4 calls to Class::MOP::Package::name, avg 600ns/call |
20 | } | ||||
21 | |||||
22 | sub get_overload_list { | ||||
23 | my $self = shift; | ||||
24 | |||||
25 | my $info = $self->_overload_info; | ||||
26 | return grep { $_ ne 'fallback' } keys %{$info} | ||||
27 | } | ||||
28 | |||||
29 | sub get_all_overloaded_operators { | ||||
30 | my $self = shift; | ||||
31 | return map { $self->_overload_for($_) } $self->get_overload_list; | ||||
32 | } | ||||
33 | |||||
34 | sub has_overloaded_operator { | ||||
35 | my $self = shift; | ||||
36 | my ($op) = @_; | ||||
37 | return defined $self->_overload_info->{$op}; | ||||
38 | } | ||||
39 | |||||
40 | sub _overload_map { | ||||
41 | $_[0]->{_overload_map} ||= {}; | ||||
42 | } | ||||
43 | |||||
44 | sub get_overloaded_operator { | ||||
45 | my $self = shift; | ||||
46 | my ($op) = @_; | ||||
47 | return $self->_overload_map->{$op} ||= $self->_overload_for($op); | ||||
48 | } | ||||
49 | |||||
50 | 2 | 525µs | 2 | 172µs | # spent 95µs (17+78) within Class::MOP::Mixin::HasOverloads::BEGIN@50 which was called:
# once (17µs+78µs) by Class::MOP::BEGIN@17 at line 50 # spent 95µs making 1 call to Class::MOP::Mixin::HasOverloads::BEGIN@50
# spent 78µs making 1 call to constant::import |
51 | |||||
52 | sub add_overloaded_operator { | ||||
53 | my $self = shift; | ||||
54 | my ( $op, $overload ) = @_; | ||||
55 | |||||
56 | my %p = ( associated_metaclass => $self ); | ||||
57 | if ( !ref $overload ) { | ||||
58 | %p = ( | ||||
59 | %p, | ||||
60 | operator => $op, | ||||
61 | method_name => $overload, | ||||
62 | associated_metaclass => $self, | ||||
63 | ); | ||||
64 | $p{method} = $self->get_method($overload) | ||||
65 | if $self->has_method($overload); | ||||
66 | $overload = Class::MOP::Overload->new(%p); | ||||
67 | } | ||||
68 | elsif ( !blessed $overload) { | ||||
69 | $overload = Class::MOP::Overload->new( | ||||
70 | operator => $op, | ||||
71 | coderef => $overload, | ||||
72 | coderef_name => sub_name($overload), | ||||
73 | coderef_package => stash_name($overload), | ||||
74 | %p, | ||||
75 | ); | ||||
76 | } | ||||
77 | |||||
78 | $overload->attach_to_class($self); | ||||
79 | $self->_overload_map->{$op} = $overload; | ||||
80 | |||||
81 | my %overload = ( | ||||
82 | $op => $overload->has_coderef | ||||
83 | ? $overload->coderef | ||||
84 | : $overload->method_name | ||||
85 | ); | ||||
86 | |||||
87 | # Perl 5.10 and earlier appear to have a bug where setting a new | ||||
88 | # overloading operator wipes out the fallback value unless we pass it each | ||||
89 | # time. | ||||
90 | if (_SET_FALLBACK_EACH_TIME) { | ||||
91 | $overload{fallback} = $self->get_overload_fallback_value; | ||||
92 | } | ||||
93 | |||||
94 | $self->name->overload::OVERLOAD(%overload); | ||||
95 | } | ||||
96 | |||||
97 | sub remove_overloaded_operator { | ||||
98 | my $self = shift; | ||||
99 | my ($op) = @_; | ||||
100 | |||||
101 | delete $self->_overload_map->{$op}; | ||||
102 | |||||
103 | # overload.pm provides no api for this - but the problem that makes this | ||||
104 | # necessary has been fixed in 5.18 | ||||
105 | $self->get_or_add_package_symbol('%OVERLOAD')->{dummy}++ | ||||
106 | if $] < 5.017000; | ||||
107 | |||||
108 | $self->remove_package_symbol('&(' . $op); | ||||
109 | } | ||||
110 | |||||
111 | sub get_overload_fallback_value { | ||||
112 | my $self = shift; | ||||
113 | return $self->_overload_info->{fallback}{value}; | ||||
114 | } | ||||
115 | |||||
116 | sub set_overload_fallback_value { | ||||
117 | my $self = shift; | ||||
118 | my $value = shift; | ||||
119 | |||||
120 | $self->name->overload::OVERLOAD( fallback => $value ); | ||||
121 | } | ||||
122 | |||||
123 | # We could cache this but we'd need some logic to clear it at all the right | ||||
124 | # times, which seems more tedious than it's worth. | ||||
125 | sub _overload_info { | ||||
126 | my $self = shift; | ||||
127 | return overload_info( $self->name ) || {}; | ||||
128 | } | ||||
129 | |||||
130 | sub _overload_for { | ||||
131 | my $self = shift; | ||||
132 | my $op = shift; | ||||
133 | |||||
134 | my $map = $self->_overload_map; | ||||
135 | return $map->{$op} if $map->{$op}; | ||||
136 | |||||
137 | my $info = $self->_overload_info->{$op}; | ||||
138 | return unless $info; | ||||
139 | |||||
140 | my %p = ( | ||||
141 | operator => $op, | ||||
142 | associated_metaclass => $self, | ||||
143 | ); | ||||
144 | |||||
145 | if ( $info->{code} && !$info->{method_name} ) { | ||||
146 | $p{coderef} = $info->{code}; | ||||
147 | @p{ 'coderef_package', 'coderef_name' } | ||||
148 | = $info->{code_name} =~ /(.+)::([^:]+)/; | ||||
149 | } | ||||
150 | else { | ||||
151 | $p{method_name} = $info->{method_name}; | ||||
152 | if ( $self->has_method( $p{method_name} ) ) { | ||||
153 | $p{method} = $self->get_method( $p{method_name} ); | ||||
154 | } | ||||
155 | } | ||||
156 | |||||
157 | return $map->{$op} = Class::MOP::Overload->new(%p); | ||||
158 | } | ||||
159 | |||||
160 | 1 | 5µs | 1; | ||
161 | |||||
162 | # ABSTRACT: Methods for metaclasses which have overloads | ||||
163 | |||||
164 | __END__ |