| Filename | /Users/ap13/perl5/lib/perl5/darwin-2level/Class/MOP/Class/Immutable/Trait.pm |
| Statements | Executed 3922 statements in 6.06ms |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 23 | 1 | 1 | 61µs | 61µs | Class::MOP::Class::Immutable::Trait::_get_mutable_metaclass_name |
| 1 | 1 | 1 | 24µs | 48µs | Class::MOP::Class::Immutable::Trait::BEGIN@4 |
| 1 | 1 | 1 | 20µs | 44µs | Class::MOP::Class::Immutable::Trait::BEGIN@8 |
| 1 | 1 | 1 | 13µs | 21µs | Class::MOP::Class::Immutable::Trait::BEGIN@5 |
| 1 | 1 | 1 | 13µs | 27µs | Class::MOP::Class::Immutable::Trait::BEGIN@39 |
| 1 | 1 | 1 | 12µs | 29µs | Class::MOP::Class::Immutable::Trait::BEGIN@29 |
| 1 | 1 | 1 | 9µs | 9µs | Class::MOP::Class::Immutable::Trait::BEGIN@7 |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Class::Immutable::Trait::__ANON__[:35] |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Class::Immutable::Trait::__ANON__[:40] |
| 0 | 0 | 0 | 0s | 0s | Class::MOP::Class::Immutable::Trait::__throw_exception |
| 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 | 1 | 1µs | our $VERSION = '2.1403'; | ||
| 3 | |||||
| 4 | 2 | 42µs | 2 | 72µs | # spent 48µs (24+24) within Class::MOP::Class::Immutable::Trait::BEGIN@4 which was called:
# once (24µs+24µs) by Module::Runtime::require_module at line 4 # spent 48µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@4
# spent 24µs making 1 call to strict::import |
| 5 | 2 | 37µs | 2 | 30µs | # spent 21µs (13+8) within Class::MOP::Class::Immutable::Trait::BEGIN@5 which was called:
# once (13µs+8µs) by Module::Runtime::require_module at line 5 # spent 21µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@5
# spent 8µs making 1 call to warnings::import |
| 6 | |||||
| 7 | 2 | 44µs | 1 | 9µs | # spent 9µs within Class::MOP::Class::Immutable::Trait::BEGIN@7 which was called:
# once (9µs+0s) by Module::Runtime::require_module at line 7 # spent 9µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@7 |
| 8 | 2 | 236µs | 2 | 68µs | # spent 44µs (20+24) within Class::MOP::Class::Immutable::Trait::BEGIN@8 which was called:
# once (20µs+24µs) by Module::Runtime::require_module at line 8 # spent 44µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@8
# spent 24µs making 1 call to Module::Runtime::import |
| 9 | |||||
| 10 | # the original class of the metaclass instance | ||||
| 11 | 23 | 77µs | # spent 61µs within Class::MOP::Class::Immutable::Trait::_get_mutable_metaclass_name which was called 23 times, avg 3µs/call:
# 23 times (61µs+0s) by Class::MOP::Class::_real_ref_name at line 122 of Class/MOP/Class.pm, avg 3µs/call | ||
| 12 | |||||
| 13 | sub is_mutable { 0 } | ||||
| 14 | 23 | 54µs | sub is_immutable { 1 } | ||
| 15 | |||||
| 16 | sub _immutable_metaclass { ref $_[1] } | ||||
| 17 | |||||
| 18 | sub _immutable_read_only { | ||||
| 19 | my $name = shift; | ||||
| 20 | __throw_exception( CallingReadOnlyMethodOnAnImmutableInstance => method_name => $name ); | ||||
| 21 | } | ||||
| 22 | |||||
| 23 | sub _immutable_cannot_call { | ||||
| 24 | my $name = shift; | ||||
| 25 | __throw_exception( CallingMethodOnAnImmutableInstance => method_name => $name ); | ||||
| 26 | } | ||||
| 27 | |||||
| 28 | 1 | 1µs | for my $name (qw/superclasses/) { | ||
| 29 | 2 | 150µs | 2 | 45µs | # spent 29µs (12+17) within Class::MOP::Class::Immutable::Trait::BEGIN@29 which was called:
# once (12µs+17µs) by Module::Runtime::require_module at line 29 # spent 29µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@29
# spent 17µs making 1 call to strict::unimport |
| 30 | *{__PACKAGE__."::$name"} = sub { | ||||
| 31 | my $orig = shift; | ||||
| 32 | my $self = shift; | ||||
| 33 | _immutable_read_only($name) if @_; | ||||
| 34 | $self->$orig; | ||||
| 35 | 1 | 10µs | }; | ||
| 36 | } | ||||
| 37 | |||||
| 38 | 1 | 700ns | for my $name (qw/add_method alias_method remove_method add_attribute remove_attribute remove_package_symbol add_package_symbol/) { | ||
| 39 | 2 | 493µs | 2 | 41µs | # spent 27µs (13+14) within Class::MOP::Class::Immutable::Trait::BEGIN@39 which was called:
# once (13µs+14µs) by Module::Runtime::require_module at line 39 # spent 27µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@39
# spent 14µs making 1 call to strict::unimport |
| 40 | 7 | 34µs | *{__PACKAGE__."::$name"} = sub { _immutable_cannot_call($name) }; | ||
| 41 | } | ||||
| 42 | |||||
| 43 | sub class_precedence_list { | ||||
| 44 | my $orig = shift; | ||||
| 45 | my $self = shift; | ||||
| 46 | @{ $self->{__immutable}{class_precedence_list} | ||||
| 47 | ||= [ $self->$orig ] }; | ||||
| 48 | } | ||||
| 49 | |||||
| 50 | sub linearized_isa { | ||||
| 51 | 246 | 431µs | my $orig = shift; | ||
| 52 | my $self = shift; | ||||
| 53 | 16 | 161µs | @{ $self->{__immutable}{linearized_isa} ||= [ $self->$orig ] }; # spent 161µs making 16 calls to Class::MOP::Class::linearized_isa, avg 10µs/call | ||
| 54 | } | ||||
| 55 | |||||
| 56 | sub get_all_methods { | ||||
| 57 | my $orig = shift; | ||||
| 58 | my $self = shift; | ||||
| 59 | @{ $self->{__immutable}{get_all_methods} ||= [ $self->$orig ] }; | ||||
| 60 | } | ||||
| 61 | |||||
| 62 | sub get_all_method_names { | ||||
| 63 | my $orig = shift; | ||||
| 64 | my $self = shift; | ||||
| 65 | @{ $self->{__immutable}{get_all_method_names} ||= [ $self->$orig ] }; | ||||
| 66 | } | ||||
| 67 | |||||
| 68 | sub get_all_attributes { | ||||
| 69 | 1329 | 1.99ms | my $orig = shift; | ||
| 70 | my $self = shift; | ||||
| 71 | 16 | 1.46ms | @{ $self->{__immutable}{get_all_attributes} ||= [ $self->$orig ] }; # spent 1.46ms making 16 calls to Class::MOP::Class::get_all_attributes, avg 91µs/call | ||
| 72 | } | ||||
| 73 | |||||
| 74 | sub get_meta_instance { | ||||
| 75 | 1539 | 1.57ms | my $orig = shift; | ||
| 76 | my $self = shift; | ||||
| 77 | 22 | 2.31ms | $self->{__immutable}{get_meta_instance} ||= $self->$orig; # spent 2.31ms making 22 calls to Class::MOP::Class::get_meta_instance, avg 105µs/call | ||
| 78 | } | ||||
| 79 | |||||
| 80 | sub _method_map { | ||||
| 81 | 738 | 861µs | my $orig = shift; | ||
| 82 | my $self = shift; | ||||
| 83 | 24 | 99µs | $self->{__immutable}{_method_map} ||= $self->$orig; # spent 96µs making 19 calls to Class::MOP::Mixin::HasMethods::_method_map, avg 5µs/call
# spent 3µs making 5 calls to Class::MOP::Method::body, avg 600ns/call | ||
| 84 | } | ||||
| 85 | |||||
| 86 | # private method, for this file only - | ||||
| 87 | # if we declare a method here, it will behave differently depending on what | ||||
| 88 | # class this trait is applied to, so we won't have a reliable parameter list. | ||||
| 89 | sub __throw_exception { | ||||
| 90 | my ($exception_type, @args_to_exception) = @_; | ||||
| 91 | die use_module( "Moose::Exception::$exception_type" )->new( @args_to_exception ); | ||||
| 92 | } | ||||
| 93 | |||||
| 94 | 1 | 17µs | 1; | ||
| 95 | |||||
| 96 | # ABSTRACT: Implements immutability for metaclass objects | ||||
| 97 | |||||
| 98 | __END__ |