| Filename | /Users/ap13/perl5/lib/perl5/darwin-2level/Class/MOP/Overload.pm |
| Statements | Executed 30 statements in 1.30ms |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 19µs | 58µs | Class::MOP::Overload::BEGIN@11 |
| 1 | 1 | 1 | 17µs | 37µs | Class::MOP::Overload::BEGIN@4 |
| 1 | 1 | 1 | 16µs | 22µs | Class::MOP::Overload::BEGIN@5 |
| 1 | 1 | 1 | 14µs | 77µs | Class::MOP::Overload::BEGIN@9 |
| 1 | 1 | 1 | 12µs | 61µs | Class::MOP::Overload::BEGIN@8 |
| 1 | 1 | 1 | 5µs | 5µs | Class::MOP::Overload::BEGIN@7 |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Overload::__ANON__[:48] |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Overload::__ANON__[:54] |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Overload::_is_equal_to |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Overload::_set_original_overload |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Overload::attach_to_class |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Overload::clone |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Overload::is_anonymous |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Overload::new |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Overload::original_overload |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | package Class::MOP::Overload; | ||||
| 2 | 1 | 2µs | our $VERSION = '2.1403'; | ||
| 3 | |||||
| 4 | 2 | 44µs | 2 | 57µs | # spent 37µs (17+20) within Class::MOP::Overload::BEGIN@4 which was called:
# once (17µs+20µs) by Class::MOP::Mixin::HasOverloads::BEGIN@7 at line 4 # spent 37µs making 1 call to Class::MOP::Overload::BEGIN@4
# spent 20µs making 1 call to strict::import |
| 5 | 2 | 35µs | 2 | 27µs | # spent 22µs (16+6) within Class::MOP::Overload::BEGIN@5 which was called:
# once (16µs+6µs) by Class::MOP::Mixin::HasOverloads::BEGIN@7 at line 5 # spent 22µs making 1 call to Class::MOP::Overload::BEGIN@5
# spent 6µs making 1 call to warnings::import |
| 6 | |||||
| 7 | 2 | 35µs | 1 | 5µs | # spent 5µs within Class::MOP::Overload::BEGIN@7 which was called:
# once (5µs+0s) by Class::MOP::Mixin::HasOverloads::BEGIN@7 at line 7 # spent 5µs making 1 call to Class::MOP::Overload::BEGIN@7 |
| 8 | 2 | 36µs | 2 | 109µs | # spent 61µs (12+49) within Class::MOP::Overload::BEGIN@8 which was called:
# once (12µs+49µs) by Class::MOP::Mixin::HasOverloads::BEGIN@7 at line 8 # spent 61µs making 1 call to Class::MOP::Overload::BEGIN@8
# spent 49µs making 1 call to Exporter::import |
| 9 | 2 | 48µs | 2 | 140µs | # spent 77µs (14+63) within Class::MOP::Overload::BEGIN@9 which was called:
# once (14µs+63µs) by Class::MOP::Mixin::HasOverloads::BEGIN@7 at line 9 # spent 77µs making 1 call to Class::MOP::Overload::BEGIN@9
# spent 63µs making 1 call to Exporter::import |
| 10 | |||||
| 11 | 2 | 943µs | 2 | 97µs | # spent 58µs (19+39) within Class::MOP::Overload::BEGIN@11 which was called:
# once (19µs+39µs) by Class::MOP::Mixin::HasOverloads::BEGIN@7 at line 11 # spent 58µs making 1 call to Class::MOP::Overload::BEGIN@11
# spent 39µs making 1 call to parent::import |
| 12 | |||||
| 13 | my %Operators = ( | ||||
| 14 | map { $_ => 1 } | ||||
| 15 | 15 | 24µs | grep { $_ ne 'fallback' } | ||
| 16 | 1 | 117µs | map { split /\s+/ } values %overload::ops | ||
| 17 | ); | ||||
| 18 | |||||
| 19 | sub new { | ||||
| 20 | my ( $class, %params ) = @_; | ||||
| 21 | |||||
| 22 | unless ( defined $params{operator} ) { | ||||
| 23 | $class->_throw_exception('OverloadRequiresAnOperator'); | ||||
| 24 | } | ||||
| 25 | unless ( $Operators{ $params{operator} } ) { | ||||
| 26 | $class->_throw_exception( | ||||
| 27 | 'InvalidOverloadOperator', | ||||
| 28 | operator => $params{operator}, | ||||
| 29 | ); | ||||
| 30 | } | ||||
| 31 | |||||
| 32 | unless ( defined $params{method_name} || $params{coderef} ) { | ||||
| 33 | $class->_throw_exception( | ||||
| 34 | 'OverloadRequiresAMethodNameOrCoderef', | ||||
| 35 | operator => $params{operator}, | ||||
| 36 | ); | ||||
| 37 | } | ||||
| 38 | |||||
| 39 | if ( $params{coderef} ) { | ||||
| 40 | unless ( defined $params{coderef_package} | ||||
| 41 | && defined $params{coderef_name} ) { | ||||
| 42 | |||||
| 43 | $class->_throw_exception('OverloadRequiresNamesForCoderef'); | ||||
| 44 | } | ||||
| 45 | } | ||||
| 46 | |||||
| 47 | if ( $params{method} | ||||
| 48 | && !try { $params{method}->isa('Class::MOP::Method') } ) { | ||||
| 49 | |||||
| 50 | $class->_throw_exception('OverloadRequiresAMetaMethod'); | ||||
| 51 | } | ||||
| 52 | |||||
| 53 | if ( $params{associated_metaclass} | ||||
| 54 | && !try { $params{associated_metaclass}->isa('Class::MOP::Module') } ) | ||||
| 55 | { | ||||
| 56 | |||||
| 57 | $class->_throw_exception('OverloadRequiresAMetaClass'); | ||||
| 58 | } | ||||
| 59 | |||||
| 60 | my @optional_attrs | ||||
| 61 | = qw( method_name coderef coderef_package coderef_name method associated_metaclass ); | ||||
| 62 | |||||
| 63 | return bless { | ||||
| 64 | operator => $params{operator}, | ||||
| 65 | map { defined $params{$_} ? ( $_ => $params{$_} ) : () } | ||||
| 66 | @optional_attrs | ||||
| 67 | }, | ||||
| 68 | $class; | ||||
| 69 | } | ||||
| 70 | |||||
| 71 | sub operator { $_[0]->{operator} } | ||||
| 72 | |||||
| 73 | sub method_name { $_[0]->{method_name} } | ||||
| 74 | sub has_method_name { exists $_[0]->{method_name} } | ||||
| 75 | |||||
| 76 | sub method { $_[0]->{method} } | ||||
| 77 | sub has_method { exists $_[0]->{method} } | ||||
| 78 | |||||
| 79 | sub coderef { $_[0]->{coderef} } | ||||
| 80 | sub has_coderef { exists $_[0]->{coderef} } | ||||
| 81 | |||||
| 82 | sub coderef_package { $_[0]->{coderef_package} } | ||||
| 83 | sub has_coderef_package { exists $_[0]->{coderef_package} } | ||||
| 84 | |||||
| 85 | sub coderef_name { $_[0]->{coderef_name} } | ||||
| 86 | sub has_coderef_name { exists $_[0]->{coderef_name} } | ||||
| 87 | |||||
| 88 | sub associated_metaclass { $_[0]->{associated_metaclass} } | ||||
| 89 | |||||
| 90 | sub is_anonymous { | ||||
| 91 | my $self = shift; | ||||
| 92 | return $self->has_coderef && $self->coderef_name eq '__ANON__'; | ||||
| 93 | } | ||||
| 94 | |||||
| 95 | sub attach_to_class { | ||||
| 96 | my ( $self, $class ) = @_; | ||||
| 97 | $self->{associated_metaclass} = $class; | ||||
| 98 | weaken $self->{associated_metaclass}; | ||||
| 99 | } | ||||
| 100 | |||||
| 101 | sub clone { | ||||
| 102 | my $self = shift; | ||||
| 103 | |||||
| 104 | my $clone = bless { %{$self}, @_ }, blessed($self); | ||||
| 105 | weaken $clone->{associated_metaclass} if $clone->{associated_metaclass}; | ||||
| 106 | |||||
| 107 | $clone->_set_original_overload($self); | ||||
| 108 | |||||
| 109 | return $clone; | ||||
| 110 | } | ||||
| 111 | |||||
| 112 | sub original_overload { $_[0]->{original_overload} } | ||||
| 113 | sub _set_original_overload { $_[0]->{original_overload} = $_[1] } | ||||
| 114 | |||||
| 115 | sub _is_equal_to { | ||||
| 116 | my $self = shift; | ||||
| 117 | my $other = shift; | ||||
| 118 | |||||
| 119 | if ( $self->has_coderef ) { | ||||
| 120 | return unless $other->has_coderef; | ||||
| 121 | return $self->coderef == $other->coderef; | ||||
| 122 | } | ||||
| 123 | else { | ||||
| 124 | return $self->method_name eq $other->method_name; | ||||
| 125 | } | ||||
| 126 | } | ||||
| 127 | |||||
| 128 | 1 | 17µs | 1; | ||
| 129 | |||||
| 130 | # ABSTRACT: Overload Meta Object | ||||
| 131 | |||||
| 132 | __END__ |