| Filename | /Users/dde/perl5/perlbrew/perls/5.18.0t/lib/site_perl/5.18.0/darwin-thread-multi-2level/Class/MOP/Class/Immutable/Trait.pm |
| Statements | Executed 2661 statements in 5.38ms |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 58 | 1 | 1 | 73µs | 73µs | Class::MOP::Class::Immutable::Trait::_get_mutable_metaclass_name |
| 1 | 1 | 1 | 8µs | 8µs | Class::MOP::Class::Immutable::Trait::BEGIN@2 |
| 1 | 1 | 1 | 7µs | 54µs | Class::MOP::Class::Immutable::Trait::BEGIN@14 |
| 1 | 1 | 1 | 7µs | 32µs | Class::MOP::Class::Immutable::Trait::BEGIN@15 |
| 1 | 1 | 1 | 7µs | 18µs | Class::MOP::Class::Immutable::Trait::BEGIN@9 |
| 1 | 1 | 1 | 6µs | 10µs | Class::MOP::Class::Immutable::Trait::BEGIN@10 |
| 1 | 1 | 1 | 6µs | 17µs | Class::MOP::Class::Immutable::Trait::BEGIN@36 |
| 1 | 1 | 1 | 6µs | 14µs | Class::MOP::Class::Immutable::Trait::BEGIN@46 |
| 1 | 1 | 1 | 4µs | 4µs | Class::MOP::Class::Immutable::Trait::BEGIN@12 |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Class::Immutable::Trait::__ANON__[:42] |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Class::Immutable::Trait::__ANON__[:47] |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Class::Immutable::Trait::_immutable_cannot_call |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Class::Immutable::Trait::_immutable_metaclass |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Class::Immutable::Trait::_immutable_read_only |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Class::Immutable::Trait::_method_map |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Class::Immutable::Trait::class_precedence_list |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Class::Immutable::Trait::get_all_attributes |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Class::Immutable::Trait::get_all_method_names |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Class::Immutable::Trait::get_all_methods |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Class::Immutable::Trait::get_meta_instance |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Class::Immutable::Trait::is_immutable |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Class::Immutable::Trait::is_mutable |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Class::Immutable::Trait::linearized_isa |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | package Class::MOP::Class::Immutable::Trait; | ||||
| 2 | # spent 8µs within Class::MOP::Class::Immutable::Trait::BEGIN@2 which was called:
# once (8µs+0s) by Module::Runtime::require_module at line 4 | ||||
| 3 | 1 | 5µs | $Class::MOP::Class::Immutable::Trait::AUTHORITY = 'cpan:STEVAN'; | ||
| 4 | 1 | 31µs | 1 | 8µs | } # spent 8µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@2 |
| 5 | { | ||||
| 6 | 2 | 900ns | $Class::MOP::Class::Immutable::Trait::VERSION = '2.1005'; | ||
| 7 | } | ||||
| 8 | |||||
| 9 | 2 | 22µs | 2 | 29µs | # spent 18µs (7+11) within Class::MOP::Class::Immutable::Trait::BEGIN@9 which was called:
# once (7µs+11µs) by Module::Runtime::require_module at line 9 # spent 18µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@9
# spent 11µs making 1 call to strict::import |
| 10 | 2 | 21µs | 2 | 14µs | # spent 10µs (6+4) within Class::MOP::Class::Immutable::Trait::BEGIN@10 which was called:
# once (6µs+4µs) by Module::Runtime::require_module at line 10 # spent 10µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@10
# spent 4µs making 1 call to warnings::import |
| 11 | |||||
| 12 | 2 | 21µs | 1 | 4µs | # spent 4µs within Class::MOP::Class::Immutable::Trait::BEGIN@12 which was called:
# once (4µs+0s) by Module::Runtime::require_module at line 12 # spent 4µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@12 |
| 13 | |||||
| 14 | 2 | 26µs | 2 | 101µs | # spent 54µs (7+47) within Class::MOP::Class::Immutable::Trait::BEGIN@14 which was called:
# once (7µs+47µs) by Module::Runtime::require_module at line 14 # spent 54µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@14
# spent 47µs making 1 call to Exporter::import |
| 15 | 2 | 161µs | 2 | 56µs | # spent 32µs (7+25) within Class::MOP::Class::Immutable::Trait::BEGIN@15 which was called:
# once (7µs+25µs) by Module::Runtime::require_module at line 15 # spent 32µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@15
# spent 25µs making 1 call to Exporter::import |
| 16 | |||||
| 17 | # the original class of the metaclass instance | ||||
| 18 | 58 | 108µs | # spent 73µs within Class::MOP::Class::Immutable::Trait::_get_mutable_metaclass_name which was called 58 times, avg 1µs/call:
# 58 times (73µs+0s) by Class::MOP::Class::_real_ref_name at line 128 of Class/MOP/Class.pm, avg 1µs/call | ||
| 19 | |||||
| 20 | sub is_mutable { 0 } | ||||
| 21 | 58 | 92µs | sub is_immutable { 1 } | ||
| 22 | |||||
| 23 | sub _immutable_metaclass { ref $_[1] } | ||||
| 24 | |||||
| 25 | sub _immutable_read_only { | ||||
| 26 | my $name = shift; | ||||
| 27 | confess "The '$name' method is read-only when called on an immutable instance"; | ||||
| 28 | } | ||||
| 29 | |||||
| 30 | sub _immutable_cannot_call { | ||||
| 31 | my $name = shift; | ||||
| 32 | Carp::confess "The '$name' method cannot be called on an immutable instance"; | ||||
| 33 | } | ||||
| 34 | |||||
| 35 | 1 | 500ns | for my $name (qw/superclasses/) { | ||
| 36 | 2 | 88µs | 2 | 27µs | # spent 17µs (6+10) within Class::MOP::Class::Immutable::Trait::BEGIN@36 which was called:
# once (6µs+10µs) by Module::Runtime::require_module at line 36 # spent 17µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@36
# spent 10µs making 1 call to strict::unimport |
| 37 | *{__PACKAGE__."::$name"} = sub { | ||||
| 38 | 12 | 2µs | my $orig = shift; | ||
| 39 | 12 | 400ns | my $self = shift; | ||
| 40 | 12 | 2µs | _immutable_read_only($name) if @_; | ||
| 41 | 12 | 20µs | 12 | 126µs | $self->$orig; # spent 126µs making 12 calls to Class::MOP::Class::superclasses, avg 11µs/call |
| 42 | 1 | 6µs | }; | ||
| 43 | } | ||||
| 44 | |||||
| 45 | 1 | 300ns | for my $name (qw/add_method alias_method remove_method add_attribute remove_attribute remove_package_symbol add_package_symbol/) { | ||
| 46 | 2 | 277µs | 2 | 22µs | # spent 14µs (6+8) within Class::MOP::Class::Immutable::Trait::BEGIN@46 which was called:
# once (6µs+8µs) by Module::Runtime::require_module at line 46 # spent 14µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@46
# spent 8µs making 1 call to strict::unimport |
| 47 | 7 | 20µs | *{__PACKAGE__."::$name"} = sub { _immutable_cannot_call($name) }; | ||
| 48 | } | ||||
| 49 | |||||
| 50 | sub class_precedence_list { | ||||
| 51 | 30 | 4µs | my $orig = shift; | ||
| 52 | 30 | 1µs | my $self = shift; | ||
| 53 | 30 | 100µs | 12 | 0s | @{ $self->{__immutable}{class_precedence_list} # spent 1.06ms making 12 calls to Class::MOP::Class::class_precedence_list, avg 88µs/call, recursion: max depth 4, sum of overlapping time 1.06ms |
| 54 | ||= [ $self->$orig ] }; | ||||
| 55 | } | ||||
| 56 | |||||
| 57 | sub linearized_isa { | ||||
| 58 | 65 | 7µs | my $orig = shift; | ||
| 59 | 65 | 2µs | my $self = shift; | ||
| 60 | 65 | 159µs | 15 | 79µs | @{ $self->{__immutable}{linearized_isa} ||= [ $self->$orig ] }; # spent 79µs making 15 calls to Class::MOP::Class::linearized_isa, avg 5µs/call |
| 61 | } | ||||
| 62 | |||||
| 63 | sub get_all_methods { | ||||
| 64 | my $orig = shift; | ||||
| 65 | my $self = shift; | ||||
| 66 | @{ $self->{__immutable}{get_all_methods} ||= [ $self->$orig ] }; | ||||
| 67 | } | ||||
| 68 | |||||
| 69 | sub get_all_method_names { | ||||
| 70 | my $orig = shift; | ||||
| 71 | my $self = shift; | ||||
| 72 | @{ $self->{__immutable}{get_all_method_names} ||= [ $self->$orig ] }; | ||||
| 73 | } | ||||
| 74 | |||||
| 75 | sub get_all_attributes { | ||||
| 76 | 100 | 11µs | my $orig = shift; | ||
| 77 | 100 | 1µs | my $self = shift; | ||
| 78 | 100 | 258µs | 15 | 714µs | @{ $self->{__immutable}{get_all_attributes} ||= [ $self->$orig ] }; # spent 714µs making 15 calls to Class::MOP::Class::get_all_attributes, avg 48µs/call |
| 79 | } | ||||
| 80 | |||||
| 81 | sub get_meta_instance { | ||||
| 82 | 337 | 34µs | my $orig = shift; | ||
| 83 | 337 | 2µs | my $self = shift; | ||
| 84 | 337 | 3.21ms | 21 | 1.27ms | $self->{__immutable}{get_meta_instance} ||= $self->$orig; # spent 1.27ms making 21 calls to Class::MOP::Class::get_meta_instance, avg 60µs/call |
| 85 | } | ||||
| 86 | |||||
| 87 | sub _method_map { | ||||
| 88 | 291 | 30µs | my $orig = shift; | ||
| 89 | 291 | 28µs | my $self = shift; | ||
| 90 | 291 | 622µs | 25 | 72µs | $self->{__immutable}{_method_map} ||= $self->$orig; # spent 70µs making 20 calls to Class::MOP::Mixin::HasMethods::_method_map, avg 4µs/call
# spent 2µs making 5 calls to Class::MOP::Method::body, avg 440ns/call |
| 91 | } | ||||
| 92 | |||||
| 93 | 1 | 5µs | 1; | ||
| 94 | |||||
| 95 | # ABSTRACT: Implements immutability for metaclass objects | ||||
| 96 | |||||
| 97 | __END__ |