File | /usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Class/MOP/Class/Immutable/Trait.pm |
Statements Executed | 313 |
Statement Execution Time | 934µs |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
1 | 1 | 1 | 15µs | 19µs | BEGIN@3 | Class::MOP::Class::Immutable::Trait::
1 | 1 | 1 | 8µs | 26µs | BEGIN@36 | Class::MOP::Class::Immutable::Trait::
1 | 1 | 1 | 8µs | 20µs | BEGIN@4 | Class::MOP::Class::Immutable::Trait::
1 | 1 | 1 | 6µs | 37µs | BEGIN@8 | Class::MOP::Class::Immutable::Trait::
1 | 1 | 1 | 6µs | 33µs | BEGIN@9 | Class::MOP::Class::Immutable::Trait::
1 | 1 | 1 | 4µs | 4µs | BEGIN@6 | Class::MOP::Class::Immutable::Trait::
1 | 1 | 1 | 4µs | 4µs | _get_mutable_metaclass_name | Class::MOP::Class::Immutable::Trait::
0 | 0 | 0 | 0s | 0s | __ANON__[:37] | Class::MOP::Class::Immutable::Trait::
0 | 0 | 0 | 0s | 0s | _get_method_map | Class::MOP::Class::Immutable::Trait::
0 | 0 | 0 | 0s | 0s | _immutable_cannot_call | Class::MOP::Class::Immutable::Trait::
0 | 0 | 0 | 0s | 0s | _immutable_metaclass | Class::MOP::Class::Immutable::Trait::
0 | 0 | 0 | 0s | 0s | add_package_symbol | Class::MOP::Class::Immutable::Trait::
0 | 0 | 0 | 0s | 0s | class_precedence_list | Class::MOP::Class::Immutable::Trait::
0 | 0 | 0 | 0s | 0s | get_all_attributes | Class::MOP::Class::Immutable::Trait::
0 | 0 | 0 | 0s | 0s | get_all_method_names | Class::MOP::Class::Immutable::Trait::
0 | 0 | 0 | 0s | 0s | get_all_methods | Class::MOP::Class::Immutable::Trait::
0 | 0 | 0 | 0s | 0s | get_meta_instance | Class::MOP::Class::Immutable::Trait::
0 | 0 | 0 | 0s | 0s | is_immutable | Class::MOP::Class::Immutable::Trait::
0 | 0 | 0 | 0s | 0s | is_mutable | Class::MOP::Class::Immutable::Trait::
0 | 0 | 0 | 0s | 0s | linearized_isa | Class::MOP::Class::Immutable::Trait::
0 | 0 | 0 | 0s | 0s | superclasses | Class::MOP::Class::Immutable::Trait::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package Class::MOP::Class::Immutable::Trait; | ||||
2 | |||||
3 | 3 | 22µs | 2 | 22µs | # spent 19µs (15+3) within Class::MOP::Class::Immutable::Trait::BEGIN@3 which was called
# once (15µs+3µs) by Class::MOP::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Class/MOP.pm:103] at line 3 # spent 19µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@3
# spent 3µs making 1 call to strict::import |
4 | 3 | 19µs | 2 | 32µs | # spent 20µs (8+12) within Class::MOP::Class::Immutable::Trait::BEGIN@4 which was called
# once (8µs+12µs) by Class::MOP::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Class/MOP.pm:103] at line 4 # spent 20µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@4
# spent 12µs making 1 call to warnings::import |
5 | |||||
6 | 3 | 21µs | 1 | 4µs | # spent 4µs within Class::MOP::Class::Immutable::Trait::BEGIN@6 which was called
# once (4µs+0s) by Class::MOP::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Class/MOP.pm:103] at line 6 # spent 4µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@6 |
7 | |||||
8 | 3 | 30µs | 2 | 68µs | # spent 37µs (6+31) within Class::MOP::Class::Immutable::Trait::BEGIN@8 which was called
# once (6µs+31µs) by Class::MOP::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Class/MOP.pm:103] at line 8 # spent 37µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@8
# spent 31µs making 1 call to Exporter::import |
9 | 3 | 156µs | 2 | 59µs | # spent 33µs (6+27) within Class::MOP::Class::Immutable::Trait::BEGIN@9 which was called
# once (6µs+27µs) by Class::MOP::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Class/MOP.pm:103] at line 9 # spent 33µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@9
# spent 26µs making 1 call to Exporter::import |
10 | |||||
11 | 1 | 700ns | our $VERSION = '0.98'; | ||
12 | 1 | 13µs | $VERSION = eval $VERSION; | ||
13 | 1 | 300ns | our $AUTHORITY = 'cpan:STEVAN'; | ||
14 | |||||
15 | # the original class of the metaclass instance | ||||
16 | 1 | 5µs | # spent 4µs within Class::MOP::Class::Immutable::Trait::_get_mutable_metaclass_name which was called
# once (4µs+0s) by Class::MOP::Class::_immutable_metaclass at line 956 of Class/MOP/Class.pm | ||
17 | |||||
18 | sub is_mutable { 0 } | ||||
19 | 1 | 2µs | sub is_immutable { 1 } | ||
20 | |||||
21 | sub _immutable_metaclass { ref $_[1] } | ||||
22 | |||||
23 | sub superclasses { | ||||
24 | my $orig = shift; | ||||
25 | my $self = shift; | ||||
26 | confess "This method is read-only" if @_; | ||||
27 | $self->$orig; | ||||
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 | 900ns | for my $name (qw/add_method alias_method remove_method add_attribute remove_attribute remove_package_symbol/) { | ||
36 | 3 | 277µs | 2 | 43µs | # spent 26µs (8+18) within Class::MOP::Class::Immutable::Trait::BEGIN@36 which was called
# once (8µs+18µs) by Class::MOP::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Class/MOP.pm:103] at line 36 # spent 26µs making 1 call to Class::MOP::Class::Immutable::Trait::BEGIN@36
# spent 18µs making 1 call to strict::unimport |
37 | 6 | 21µs | *{__PACKAGE__."::$name"} = sub { _immutable_cannot_call($name) }; | ||
38 | } | ||||
39 | |||||
40 | sub class_precedence_list { | ||||
41 | my $orig = shift; | ||||
42 | my $self = shift; | ||||
43 | @{ $self->{__immutable}{class_precedence_list} | ||||
44 | ||= [ $self->$orig ] }; | ||||
45 | } | ||||
46 | |||||
47 | sub linearized_isa { | ||||
48 | 50 | 11µs | my $orig = shift; | ||
49 | 50 | 7µs | my $self = shift; | ||
50 | 50 | 160µs | 4 | 41µs | @{ $self->{__immutable}{linearized_isa} ||= [ $self->$orig ] }; # spent 41µs making 4 calls to Class::MOP::Class::linearized_isa, avg 10µs/call |
51 | } | ||||
52 | |||||
53 | sub get_all_methods { | ||||
54 | my $orig = shift; | ||||
55 | my $self = shift; | ||||
56 | @{ $self->{__immutable}{get_all_methods} ||= [ $self->$orig ] }; | ||||
57 | } | ||||
58 | |||||
59 | sub get_all_method_names { | ||||
60 | my $orig = shift; | ||||
61 | my $self = shift; | ||||
62 | @{ $self->{__immutable}{get_all_method_names} ||= [ $self->$orig ] }; | ||||
63 | } | ||||
64 | |||||
65 | sub get_all_attributes { | ||||
66 | 11 | 3µs | my $orig = shift; | ||
67 | 11 | 2µs | my $self = shift; | ||
68 | 11 | 41µs | 3 | 357µs | @{ $self->{__immutable}{get_all_attributes} ||= [ $self->$orig ] }; # spent 357µs making 3 calls to Class::MOP::Class::get_all_attributes, avg 119µs/call |
69 | } | ||||
70 | |||||
71 | sub get_meta_instance { | ||||
72 | 17 | 4µs | my $orig = shift; | ||
73 | 17 | 3µs | my $self = shift; | ||
74 | 17 | 39µs | 3 | 4µs | $self->{__immutable}{get_meta_instance} ||= $self->$orig; # spent 4µs making 3 calls to Class::MOP::Class::get_meta_instance, avg 1µs/call |
75 | } | ||||
76 | |||||
77 | sub _get_method_map { | ||||
78 | my $orig = shift; | ||||
79 | my $self = shift; | ||||
80 | $self->{__immutable}{_get_method_map} ||= $self->$orig; | ||||
81 | } | ||||
82 | |||||
83 | sub add_package_symbol { | ||||
84 | 12 | 3µs | my $orig = shift; | ||
85 | 12 | 2µs | my $self = shift; | ||
86 | 12 | 47µs | confess "Cannot add package symbols to an immutable metaclass" | ||
87 | unless ( caller(3) )[3] eq 'Class::MOP::Package::get_package_symbol'; | ||||
88 | |||||
89 | 12 | 33µs | 12 | 55µs | $self->$orig(@_); # spent 55µs making 12 calls to Class::MOP::Package::add_package_symbol, avg 5µs/call |
90 | } | ||||
91 | |||||
92 | 1 | 12µs | 1; | ||
93 | |||||
94 | __END__ | ||||
95 | |||||
96 | =pod | ||||
97 | |||||
98 | =head1 NAME | ||||
99 | |||||
100 | Class::MOP::Class::Immutable::Trait - Implements immutability for metaclass objects | ||||
101 | |||||
102 | =head1 DESCRIPTION | ||||
103 | |||||
104 | This class provides a pseudo-trait that is applied to immutable metaclass | ||||
105 | objects. In reality, it is simply a parent class. | ||||
106 | |||||
107 | It implements caching and read-only-ness for various metaclass methods. | ||||
108 | |||||
109 | =head1 AUTHOR | ||||
110 | |||||
111 | Yuval Kogman E<lt>nothingmuch@cpan.orgE<gt> | ||||
112 | |||||
113 | =head1 COPYRIGHT AND LICENSE | ||||
114 | |||||
115 | Copyright 2009 by Infinity Interactive, Inc. | ||||
116 | |||||
117 | L<http://www.iinteractive.com> | ||||
118 | |||||
119 | This library is free software; you can redistribute it and/or modify | ||||
120 | it under the same terms as Perl itself. | ||||
121 | |||||
122 | =cut | ||||
123 |