| 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 | Class::MOP::Mixin::HasOverloads::BEGIN@7 |
| 1 | 1 | 1 | 726µs | 4.78ms | Class::MOP::Mixin::HasOverloads::BEGIN@9 |
| 1 | 1 | 1 | 29µs | 56µs | Class::MOP::Mixin::HasOverloads::BEGIN@4 |
| 4 | 1 | 1 | 29µs | 133µs | Class::MOP::Mixin::HasOverloads::is_overloaded |
| 1 | 1 | 1 | 18µs | 53µs | Class::MOP::Mixin::HasOverloads::BEGIN@10 |
| 1 | 1 | 1 | 17µs | 95µs | Class::MOP::Mixin::HasOverloads::BEGIN@50 |
| 1 | 1 | 1 | 13µs | 51µs | Class::MOP::Mixin::HasOverloads::BEGIN@11 |
| 1 | 1 | 1 | 13µs | 23µs | Class::MOP::Mixin::HasOverloads::BEGIN@5 |
| 1 | 1 | 1 | 12µs | 55µs | Class::MOP::Mixin::HasOverloads::BEGIN@15 |
| 1 | 1 | 1 | 6µs | 6µs | Class::MOP::Mixin::HasOverloads::BEGIN@13 |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Mixin::HasOverloads::_overload_for |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Mixin::HasOverloads::_overload_info |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Mixin::HasOverloads::add_overloaded_operator |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Mixin::HasOverloads::get_all_overloaded_operators |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Mixin::HasOverloads::get_overload_fallback_value |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Mixin::HasOverloads::get_overload_list |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Mixin::HasOverloads::get_overloaded_operator |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Mixin::HasOverloads::has_overloaded_operator |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Mixin::HasOverloads::remove_overloaded_operator |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Mixin::HasOverloads::set_overload_fallback_value |
| 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 | 8 | 42µs | my $self = shift; | ||
| 19 | 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__ |