| Filename | /home/doy/perl5/perlbrew/perls/perl-5.10.1/lib/site_perl/5.10.1/x86_64-linux/Moose/Meta/Class.pm |
| Statements | Executed 4239 statements in 87.6ms |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 196 | 7 | 3 | 14.2ms | 241ms | Moose::Meta::Class::superclasses (recurses: max depth 1, inclusive time 18.0ms) |
| 123 | 2 | 2 | 12.6ms | 4.18s | Moose::Meta::Class::add_attribute (recurses: max depth 1, inclusive time 31.4ms) |
| 73 | 2 | 1 | 10.7ms | 16.0ms | Moose::Meta::Class::_base_metaclasses |
| 1 | 1 | 1 | 8.81ms | 12.6ms | Moose::Meta::Class::BEGIN@26 |
| 1 | 1 | 1 | 6.20ms | 7.21ms | Moose::Meta::Class::BEGIN@23 |
| 114 | 1 | 1 | 6.12ms | 2.85s | Moose::Meta::Class::_process_new_attribute |
| 116 | 1 | 1 | 5.84ms | 2.88s | Moose::Meta::Class::_process_attribute |
| 21 | 1 | 1 | 4.98ms | 32.1ms | Moose::Meta::Class::excludes_role |
| 438 | 1 | 1 | 4.00ms | 4.00ms | Moose::Meta::Class::CORE:subst (opcode) |
| 1 | 1 | 1 | 2.66ms | 3.61ms | Moose::Meta::Class::BEGIN@24 |
| 6 | 2 | 2 | 2.63ms | 31.8ms | Moose::Meta::Class::new_object |
| 34 | 3 | 3 | 1.90ms | 146ms | Moose::Meta::Class::initialize |
| 1 | 1 | 1 | 1.60ms | 15.6ms | Moose::Meta::Class::BEGIN@21 |
| 1 | 1 | 1 | 1.59ms | 2.67ms | Moose::Meta::Class::BEGIN@22 |
| 1 | 1 | 1 | 1.41ms | 1.93ms | Moose::Meta::Class::BEGIN@20 |
| 1 | 1 | 1 | 1.34ms | 16.2ms | Moose::Meta::Class::BEGIN@19 |
| 21 | 1 | 1 | 1.23ms | 1.83ms | Moose::Meta::Class::add_role |
| 15 | 2 | 2 | 1.22ms | 448ms | Moose::Meta::Class::create_anon_class |
| 1 | 1 | 1 | 1.20ms | 1.86ms | Moose::Meta::Class::BEGIN@25 |
| 24 | 1 | 1 | 1.02ms | 4.34ms | Moose::Meta::Class::_immutable_options |
| 21 | 1 | 1 | 974µs | 1.48ms | Moose::Meta::Class::add_role_application |
| 17 | 1 | 1 | 944µs | 27.4ms | Moose::Meta::Class::add_override_method_modifier |
| 116 | 1 | 1 | 677µs | 677µs | Moose::Meta::Class::CORE:match (opcode) |
| 8 | 1 | 1 | 654µs | 446ms | Moose::Meta::Class::create |
| 15 | 1 | 1 | 405µs | 465µs | Moose::Meta::Class::_anon_cache_key |
| 34 | 1 | 1 | 385µs | 385µs | Moose::Meta::Class::__ANON__[:40] |
| 34 | 1 | 1 | 377µs | 377µs | Moose::Meta::Class::__ANON__[:35] |
| 34 | 1 | 1 | 364µs | 364µs | Moose::Meta::Class::_meta_method_class |
| 2 | 1 | 1 | 184µs | 19.4ms | Moose::Meta::Class::_process_inherited_attribute |
| 2 | 1 | 1 | 169µs | 584µs | Moose::Meta::Class::calculate_all_roles |
| 1 | 1 | 1 | 67µs | 85µs | Moose::Meta::Class::BEGIN@4 |
| 15 | 1 | 1 | 59µs | 59µs | Moose::Meta::Class::CORE:sort (opcode) |
| 1 | 1 | 1 | 52µs | 180µs | Moose::Meta::Class::BEGIN@11 |
| 1 | 1 | 1 | 39µs | 108µs | Moose::Meta::Class::BEGIN@5 |
| 1 | 1 | 1 | 38µs | 60µs | Moose::Meta::Class::BEGIN@10 |
| 1 | 1 | 1 | 37µs | 301µs | Moose::Meta::Class::BEGIN@29 |
| 1 | 1 | 1 | 36µs | 190µs | Moose::Meta::Class::BEGIN@13 |
| 1 | 1 | 1 | 35µs | 241µs | Moose::Meta::Class::BEGIN@12 |
| 1 | 1 | 1 | 35µs | 198µs | Moose::Meta::Class::BEGIN@9 |
| 1 | 1 | 1 | 29µs | 29µs | Moose::Meta::Class::BEGIN@27 |
| 1 | 1 | 1 | 25µs | 25µs | Moose::Meta::Class::BEGIN@7 |
| 0 | 0 | 0 | 0s | 0s | Moose::Meta::Class::_find_next_method_by_name_which_is_not_overridden |
| 0 | 0 | 0 | 0s | 0s | Moose::Meta::Class::_fix_class_metaclass_incompatibility |
| 0 | 0 | 0 | 0s | 0s | Moose::Meta::Class::_fix_single_metaclass_incompatibility |
| 0 | 0 | 0 | 0s | 0s | Moose::Meta::Class::_replace_self |
| 0 | 0 | 0 | 0s | 0s | Moose::Meta::Class::add_augment_method_modifier |
| 0 | 0 | 0 | 0s | 0s | Moose::Meta::Class::calculate_all_roles_with_inheritance |
| 0 | 0 | 0 | 0s | 0s | Moose::Meta::Class::create_error |
| 0 | 0 | 0 | 0s | 0s | Moose::Meta::Class::does_role |
| 0 | 0 | 0 | 0s | 0s | Moose::Meta::Class::raise_error |
| 0 | 0 | 0 | 0s | 0s | Moose::Meta::Class::reinitialize |
| 0 | 0 | 0 | 0s | 0s | Moose::Meta::Class::role_applications |
| 0 | 0 | 0 | 0s | 0s | Moose::Meta::Class::throw_error |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | |||||
| 2 | package Moose::Meta::Class; | ||||
| 3 | |||||
| 4 | 3 | 96µs | 2 | 103µs | # spent 85µs (67+18) within Moose::Meta::Class::BEGIN@4 which was called:
# once (67µs+18µs) by Moose::BEGIN@19 at line 4 # spent 85µs making 1 call to Moose::Meta::Class::BEGIN@4
# spent 18µs making 1 call to strict::import |
| 5 | 3 | 291µs | 2 | 177µs | # spent 108µs (39+69) within Moose::Meta::Class::BEGIN@5 which was called:
# once (39µs+69µs) by Moose::BEGIN@19 at line 5 # spent 108µs making 1 call to Moose::Meta::Class::BEGIN@5
# spent 69µs making 1 call to warnings::import |
| 6 | |||||
| 7 | 3 | 98µs | 1 | 25µs | # spent 25µs within Moose::Meta::Class::BEGIN@7 which was called:
# once (25µs+0s) by Moose::BEGIN@19 at line 7 # spent 25µs making 1 call to Moose::Meta::Class::BEGIN@7 |
| 8 | |||||
| 9 | 3 | 96µs | 2 | 361µs | # spent 198µs (35+163) within Moose::Meta::Class::BEGIN@9 which was called:
# once (35µs+163µs) by Moose::BEGIN@19 at line 9 # spent 198µs making 1 call to Moose::Meta::Class::BEGIN@9
# spent 163µs making 1 call to Exporter::import |
| 10 | 3 | 96µs | 2 | 82µs | # spent 60µs (38+22) within Moose::Meta::Class::BEGIN@10 which was called:
# once (38µs+22µs) by Moose::BEGIN@19 at line 10 # spent 60µs making 1 call to Moose::Meta::Class::BEGIN@10
# spent 22µs making 1 call to Sub::Install::__ANON__[Sub/Install.pm:284] |
| 11 | 3 | 105µs | 2 | 308µs | # spent 180µs (52+128) within Moose::Meta::Class::BEGIN@11 which was called:
# once (52µs+128µs) by Moose::BEGIN@19 at line 11 # spent 180µs making 1 call to Moose::Meta::Class::BEGIN@11
# spent 128µs making 1 call to Exporter::import |
| 12 | 3 | 105µs | 2 | 446µs | # spent 241µs (35+206) within Moose::Meta::Class::BEGIN@12 which was called:
# once (35µs+206µs) by Moose::BEGIN@19 at line 12 # spent 241µs making 1 call to Moose::Meta::Class::BEGIN@12
# spent 206µs making 1 call to Exporter::import |
| 13 | 3 | 210µs | 2 | 344µs | # spent 190µs (36+154) within Moose::Meta::Class::BEGIN@13 which was called:
# once (36µs+154µs) by Moose::BEGIN@19 at line 13 # spent 190µs making 1 call to Moose::Meta::Class::BEGIN@13
# spent 154µs making 1 call to Exporter::import |
| 14 | |||||
| 15 | 1 | 4µs | our $VERSION = '1.19'; | ||
| 16 | 1 | 80µs | $VERSION = eval $VERSION; # spent 12µs executing statements in string eval | ||
| 17 | 1 | 4µs | our $AUTHORITY = 'cpan:STEVAN'; | ||
| 18 | |||||
| 19 | 3 | 483µs | 1 | 16.2ms | # spent 16.2ms (1.34+14.9) within Moose::Meta::Class::BEGIN@19 which was called:
# once (1.34ms+14.9ms) by Moose::BEGIN@19 at line 19 # spent 16.2ms making 1 call to Moose::Meta::Class::BEGIN@19 |
| 20 | 3 | 456µs | 1 | 1.93ms | # spent 1.93ms (1.41+525µs) within Moose::Meta::Class::BEGIN@20 which was called:
# once (1.41ms+525µs) by Moose::BEGIN@19 at line 20 # spent 1.93ms making 1 call to Moose::Meta::Class::BEGIN@20 |
| 21 | 3 | 450µs | 1 | 15.6ms | # spent 15.6ms (1.60+14.0) within Moose::Meta::Class::BEGIN@21 which was called:
# once (1.60ms+14.0ms) by Moose::BEGIN@19 at line 21 # spent 15.6ms making 1 call to Moose::Meta::Class::BEGIN@21 |
| 22 | 3 | 482µs | 1 | 2.67ms | # spent 2.67ms (1.59+1.07) within Moose::Meta::Class::BEGIN@22 which was called:
# once (1.59ms+1.07ms) by Moose::BEGIN@19 at line 22 # spent 2.67ms making 1 call to Moose::Meta::Class::BEGIN@22 |
| 23 | 3 | 577µs | 1 | 7.21ms | # spent 7.21ms (6.20+1.01) within Moose::Meta::Class::BEGIN@23 which was called:
# once (6.20ms+1.01ms) by Moose::BEGIN@19 at line 23 # spent 7.21ms making 1 call to Moose::Meta::Class::BEGIN@23 |
| 24 | 3 | 491µs | 1 | 3.61ms | # spent 3.61ms (2.66+946µs) within Moose::Meta::Class::BEGIN@24 which was called:
# once (2.66ms+946µs) by Moose::BEGIN@19 at line 24 # spent 3.61ms making 1 call to Moose::Meta::Class::BEGIN@24 |
| 25 | 3 | 454µs | 1 | 1.86ms | # spent 1.86ms (1.20+652µs) within Moose::Meta::Class::BEGIN@25 which was called:
# once (1.20ms+652µs) by Moose::BEGIN@19 at line 25 # spent 1.86ms making 1 call to Moose::Meta::Class::BEGIN@25 |
| 26 | 3 | 451µs | 2 | 13.2ms | # spent 12.6ms (8.81+3.81) within Moose::Meta::Class::BEGIN@26 which was called:
# once (8.81ms+3.81ms) by Moose::BEGIN@19 at line 26 # spent 12.6ms making 1 call to Moose::Meta::Class::BEGIN@26
# spent 627µs making 1 call to Sub::Exporter::__ANON__[Sub/Exporter.pm:756] |
| 27 | 3 | 103µs | 1 | 29µs | # spent 29µs within Moose::Meta::Class::BEGIN@27 which was called:
# once (29µs+0s) by Moose::BEGIN@19 at line 27 # spent 29µs making 1 call to Moose::Meta::Class::BEGIN@27 |
| 28 | |||||
| 29 | 3 | 7.89ms | 2 | 565µs | # spent 301µs (37+264) within Moose::Meta::Class::BEGIN@29 which was called:
# once (37µs+264µs) by Moose::BEGIN@19 at line 29 # spent 301µs making 1 call to Moose::Meta::Class::BEGIN@29
# spent 264µs making 1 call to base::import |
| 30 | |||||
| 31 | 1 | 15µs | 1 | 12.1ms | Class::MOP::MiniTrait::apply(__PACKAGE__, 'Moose::Meta::Object::Trait'); # spent 12.1ms making 1 call to Class::MOP::MiniTrait::apply |
| 32 | |||||
| 33 | __PACKAGE__->meta->add_attribute('roles' => ( | ||||
| 34 | reader => 'roles', | ||||
| 35 | 34 | 469µs | # spent 377µs within Moose::Meta::Class::__ANON__[/home/doy/perl5/perlbrew/perls/perl-5.10.1/lib/site_perl/5.10.1/x86_64-linux/Moose/Meta/Class.pm:35] which was called 34 times, avg 11µs/call:
# 34 times (377µs+0s) by Class::MOP::Mixin::AttributeCore::default at line 53 of Class/MOP/Mixin/AttributeCore.pm, avg 11µs/call | ||
| 36 | 1 | 69µs | 2 | 2.88ms | )); # spent 2.80ms making 1 call to Class::MOP::Mixin::HasAttributes::add_attribute
# spent 80µs making 1 call to Class::MOP::Object::meta |
| 37 | |||||
| 38 | __PACKAGE__->meta->add_attribute('role_applications' => ( | ||||
| 39 | reader => '_get_role_applications', | ||||
| 40 | 34 | 529µs | # spent 385µs within Moose::Meta::Class::__ANON__[/home/doy/perl5/perlbrew/perls/perl-5.10.1/lib/site_perl/5.10.1/x86_64-linux/Moose/Meta/Class.pm:40] which was called 34 times, avg 11µs/call:
# 34 times (385µs+0s) by Class::MOP::Mixin::AttributeCore::default at line 53 of Class/MOP/Mixin/AttributeCore.pm, avg 11µs/call | ||
| 41 | 1 | 33µs | 2 | 2.30ms | )); # spent 2.22ms making 1 call to Class::MOP::Mixin::HasAttributes::add_attribute
# spent 86µs making 1 call to Class::MOP::Object::meta |
| 42 | |||||
| 43 | 1 | 41µs | 3 | 2.11ms | __PACKAGE__->meta->add_attribute( # spent 1.90ms making 1 call to Class::MOP::Mixin::HasAttributes::add_attribute
# spent 122µs making 1 call to Class::MOP::Attribute::new
# spent 85µs making 1 call to Class::MOP::Object::meta |
| 44 | Class::MOP::Attribute->new('immutable_trait' => ( | ||||
| 45 | accessor => "immutable_trait", | ||||
| 46 | default => 'Moose::Meta::Class::Immutable::Trait', | ||||
| 47 | )) | ||||
| 48 | ); | ||||
| 49 | |||||
| 50 | 1 | 26µs | 2 | 2.10ms | __PACKAGE__->meta->add_attribute('constructor_class' => ( # spent 2.01ms making 1 call to Class::MOP::Mixin::HasAttributes::add_attribute
# spent 84µs making 1 call to Class::MOP::Object::meta |
| 51 | accessor => 'constructor_class', | ||||
| 52 | default => 'Moose::Meta::Method::Constructor', | ||||
| 53 | )); | ||||
| 54 | |||||
| 55 | 1 | 25µs | 2 | 2.14ms | __PACKAGE__->meta->add_attribute('destructor_class' => ( # spent 2.06ms making 1 call to Class::MOP::Mixin::HasAttributes::add_attribute
# spent 85µs making 1 call to Class::MOP::Object::meta |
| 56 | accessor => 'destructor_class', | ||||
| 57 | default => 'Moose::Meta::Method::Destructor', | ||||
| 58 | )); | ||||
| 59 | |||||
| 60 | 1 | 24µs | 2 | 2.15ms | __PACKAGE__->meta->add_attribute('error_class' => ( # spent 2.07ms making 1 call to Class::MOP::Mixin::HasAttributes::add_attribute
# spent 85µs making 1 call to Class::MOP::Object::meta |
| 61 | accessor => 'error_class', | ||||
| 62 | default => 'Moose::Error::Default', | ||||
| 63 | )); | ||||
| 64 | |||||
| 65 | # spent 146ms (1.90+144) within Moose::Meta::Class::initialize which was called 34 times, avg 4.29ms/call:
# 25 times (1.37ms+104ms) by Moose::init_meta at line 199 of Moose.pm, avg 4.20ms/call
# 8 times (422µs+33.8ms) by Class::MOP::Class::create at line 525 of Class/MOP/Class.pm, avg 4.28ms/call
# once (107µs+6.58ms) by metaclass::import at line 45 of metaclass.pm | ||||
| 66 | 102 | 1.87ms | my $class = shift; | ||
| 67 | my $pkg = shift; | ||||
| 68 | 68 | 144ms | return Class::MOP::get_metaclass_by_name($pkg) # spent 144ms making 34 calls to Class::MOP::Class::initialize, avg 4.23ms/call
# spent 294µs making 34 calls to Class::MOP::get_metaclass_by_name, avg 9µs/call | ||
| 69 | || $class->SUPER::initialize($pkg, | ||||
| 70 | 'attribute_metaclass' => 'Moose::Meta::Attribute', | ||||
| 71 | 'method_metaclass' => 'Moose::Meta::Method', | ||||
| 72 | 'instance_metaclass' => 'Moose::Meta::Instance', | ||||
| 73 | @_ | ||||
| 74 | ); | ||||
| 75 | } | ||||
| 76 | |||||
| 77 | # spent 446ms (654µs+446) within Moose::Meta::Class::create which was called 8 times, avg 55.8ms/call:
# 8 times (654µs+446ms) by Class::MOP::Class::create_anon_class at line 453 of Class/MOP/Class.pm, avg 55.8ms/call | ||||
| 78 | 48 | 642µs | my ($class, $package_name, %options) = @_; | ||
| 79 | |||||
| 80 | (ref $options{roles} eq 'ARRAY') | ||||
| 81 | || $class->throw_error("You must pass an ARRAY ref of roles", data => $options{roles}) | ||||
| 82 | if exists $options{roles}; | ||||
| 83 | my $roles = delete $options{roles}; | ||||
| 84 | |||||
| 85 | 8 | 123ms | my $new_meta = $class->SUPER::create($package_name, %options); # spent 123ms making 8 calls to Class::MOP::Class::create, avg 15.4ms/call | ||
| 86 | |||||
| 87 | 8 | 322ms | if ($roles) { # spent 322ms making 8 calls to Moose::Util::apply_all_roles, avg 40.3ms/call | ||
| 88 | Moose::Util::apply_all_roles( $new_meta, @$roles ); | ||||
| 89 | } | ||||
| 90 | |||||
| 91 | return $new_meta; | ||||
| 92 | } | ||||
| 93 | |||||
| 94 | 1 | 2µs | my %ANON_CLASSES; | ||
| 95 | |||||
| 96 | # spent 448ms (1.22+447) within Moose::Meta::Class::create_anon_class which was called 15 times, avg 29.9ms/call:
# 10 times (755µs+319ms) by Moose::Meta::Attribute::Native::Trait::_native_accessor_class_for at line 172 of Moose/Meta/Attribute/Native/Trait.pm, avg 32.0ms/call
# 5 times (467µs+128ms) by Moose::Meta::Attribute::interpolate_class at line 124 of Moose/Meta/Attribute.pm, avg 25.8ms/call | ||||
| 97 | 108 | 1.29ms | my ($self, %options) = @_; | ||
| 98 | |||||
| 99 | my $cache_ok = delete $options{cache}; | ||||
| 100 | |||||
| 101 | 15 | 465µs | my $cache_key # spent 465µs making 15 calls to Moose::Meta::Class::_anon_cache_key, avg 31µs/call | ||
| 102 | = _anon_cache_key( $options{superclasses}, $options{roles} ); | ||||
| 103 | |||||
| 104 | if ($cache_ok && defined $ANON_CLASSES{$cache_key}) { | ||||
| 105 | return $ANON_CLASSES{$cache_key}; | ||||
| 106 | } | ||||
| 107 | |||||
| 108 | $options{weaken} = !$cache_ok | ||||
| 109 | unless exists $options{weaken}; | ||||
| 110 | |||||
| 111 | 8 | 447ms | my $new_class = $self->SUPER::create_anon_class(%options); # spent 447ms making 8 calls to Class::MOP::Class::create_anon_class, avg 55.8ms/call | ||
| 112 | |||||
| 113 | if ($cache_ok) { | ||||
| 114 | $ANON_CLASSES{$cache_key} = $new_class; | ||||
| 115 | 8 | 48µs | weaken($ANON_CLASSES{$cache_key}); # spent 48µs making 8 calls to Scalar::Util::weaken, avg 6µs/call | ||
| 116 | } | ||||
| 117 | |||||
| 118 | return $new_class; | ||||
| 119 | } | ||||
| 120 | |||||
| 121 | 34 | 477µs | # spent 364µs within Moose::Meta::Class::_meta_method_class which was called 34 times, avg 11µs/call:
# 34 times (364µs+0s) by Class::MOP::Mixin::HasMethods::_add_meta_method at line 30 of Class/MOP/Mixin/HasMethods.pm, avg 11µs/call | ||
| 122 | |||||
| 123 | # spent 465µs (405+59) within Moose::Meta::Class::_anon_cache_key which was called 15 times, avg 31µs/call:
# 15 times (405µs+59µs) by Moose::Meta::Class::create_anon_class at line 101, avg 31µs/call | ||||
| 124 | # Makes something like Super::Class|Super::Class::2=Role|Role::1 | ||||
| 125 | return join '=' => ( | ||||
| 126 | join( '|', @{ $_[0] || [] } ), | ||||
| 127 | 15 | 500µs | 15 | 59µs | join( '|', sort @{ $_[1] || [] } ), # spent 59µs making 15 calls to Moose::Meta::Class::CORE:sort, avg 4µs/call |
| 128 | ); | ||||
| 129 | } | ||||
| 130 | |||||
| 131 | sub reinitialize { | ||||
| 132 | my $self = shift; | ||||
| 133 | my $pkg = shift; | ||||
| 134 | |||||
| 135 | my $meta = blessed $pkg ? $pkg : Class::MOP::class_of($pkg); | ||||
| 136 | |||||
| 137 | my $cache_key; | ||||
| 138 | |||||
| 139 | my %existing_classes; | ||||
| 140 | if ($meta) { | ||||
| 141 | %existing_classes = map { $_ => $meta->$_() } qw( | ||||
| 142 | attribute_metaclass | ||||
| 143 | method_metaclass | ||||
| 144 | wrapped_method_metaclass | ||||
| 145 | instance_metaclass | ||||
| 146 | constructor_class | ||||
| 147 | destructor_class | ||||
| 148 | error_class | ||||
| 149 | ); | ||||
| 150 | |||||
| 151 | $cache_key = _anon_cache_key( | ||||
| 152 | [ $meta->superclasses ], | ||||
| 153 | [ map { $_->name } @{ $meta->roles } ], | ||||
| 154 | ) if $meta->is_anon_class; | ||||
| 155 | } | ||||
| 156 | |||||
| 157 | my $new_meta = $self->SUPER::reinitialize( | ||||
| 158 | $pkg, | ||||
| 159 | %existing_classes, | ||||
| 160 | @_, | ||||
| 161 | ); | ||||
| 162 | |||||
| 163 | return $new_meta unless defined $cache_key; | ||||
| 164 | |||||
| 165 | my $new_cache_key = _anon_cache_key( | ||||
| 166 | [ $meta->superclasses ], | ||||
| 167 | [ map { $_->name } @{ $meta->roles } ], | ||||
| 168 | ); | ||||
| 169 | |||||
| 170 | delete $ANON_CLASSES{$cache_key}; | ||||
| 171 | $ANON_CLASSES{$new_cache_key} = $new_meta; | ||||
| 172 | weaken($ANON_CLASSES{$new_cache_key}); | ||||
| 173 | |||||
| 174 | return $new_meta; | ||||
| 175 | } | ||||
| 176 | |||||
| 177 | # spent 1.83ms (1.23+603µs) within Moose::Meta::Class::add_role which was called 21 times, avg 87µs/call:
# 21 times (1.23ms+603µs) by Moose::Meta::Role::Application::ToClass::apply at line 33 of Moose/Meta/Role/Application/ToClass.pm, avg 87µs/call | ||||
| 178 | 63 | 1.54ms | my ($self, $role) = @_; | ||
| 179 | 42 | 332µs | (blessed($role) && $role->isa('Moose::Meta::Role')) # spent 192µs making 21 calls to Scalar::Util::blessed, avg 9µs/call
# spent 140µs making 21 calls to UNIVERSAL::isa, avg 7µs/call | ||
| 180 | || $self->throw_error("Roles must be instances of Moose::Meta::Role", data => $role); | ||||
| 181 | 21 | 271µs | push @{$self->roles} => $role; # spent 271µs making 21 calls to Moose::Meta::Class::roles, avg 13µs/call | ||
| 182 | } | ||||
| 183 | |||||
| 184 | sub role_applications { | ||||
| 185 | my ($self) = @_; | ||||
| 186 | |||||
| 187 | return @{$self->_get_role_applications}; | ||||
| 188 | } | ||||
| 189 | |||||
| 190 | # spent 1.48ms (974µs+502µs) within Moose::Meta::Class::add_role_application which was called 21 times, avg 70µs/call:
# 21 times (974µs+502µs) by Moose::Meta::Role::Application::ToClass::apply at line 34 of Moose/Meta/Role/Application/ToClass.pm, avg 70µs/call | ||||
| 191 | 63 | 1.18ms | my ($self, $application) = @_; | ||
| 192 | 42 | 219µs | (blessed($application) && $application->isa('Moose::Meta::Role::Application::ToClass')) # spent 113µs making 21 calls to UNIVERSAL::isa, avg 5µs/call
# spent 106µs making 21 calls to Scalar::Util::blessed, avg 5µs/call | ||
| 193 | || $self->throw_error("Role applications must be instances of Moose::Meta::Role::Application::ToClass", data => $application); | ||||
| 194 | 21 | 283µs | push @{$self->_get_role_applications} => $application; # spent 283µs making 21 calls to Moose::Meta::Class::_get_role_applications, avg 13µs/call | ||
| 195 | } | ||||
| 196 | |||||
| 197 | # spent 584µs (169+415) within Moose::Meta::Class::calculate_all_roles which was called 2 times, avg 292µs/call:
# 2 times (169µs+415µs) by Moose::Meta::Attribute::Native::Trait::_build_native_type at line 183 of Moose/Meta/Attribute/Native/Trait.pm, avg 292µs/call | ||||
| 198 | 12 | 180µs | my $self = shift; | ||
| 199 | my %seen; | ||||
| 200 | 8 | 415µs | grep { !$seen{$_->name}++ } map { $_->calculate_all_roles } @{ $self->roles }; # spent 371µs making 2 calls to Moose::Meta::Role::calculate_all_roles, avg 185µs/call
# spent 25µs making 2 calls to Moose::Meta::Class::roles, avg 13µs/call
# spent 19µs making 4 calls to Class::MOP::Package::name, avg 5µs/call | ||
| 201 | } | ||||
| 202 | |||||
| 203 | sub calculate_all_roles_with_inheritance { | ||||
| 204 | my $self = shift; | ||||
| 205 | my %seen; | ||||
| 206 | grep { !$seen{$_->name}++ } | ||||
| 207 | map { Class::MOP::class_of($_)->can('calculate_all_roles') | ||||
| 208 | ? Class::MOP::class_of($_)->calculate_all_roles | ||||
| 209 | : () } | ||||
| 210 | $self->linearized_isa; | ||||
| 211 | } | ||||
| 212 | |||||
| 213 | sub does_role { | ||||
| 214 | my ($self, $role_name) = @_; | ||||
| 215 | |||||
| 216 | (defined $role_name) | ||||
| 217 | || $self->throw_error("You must supply a role name to look for"); | ||||
| 218 | |||||
| 219 | foreach my $class ($self->class_precedence_list) { | ||||
| 220 | my $meta = Class::MOP::class_of($class); | ||||
| 221 | # when a Moose metaclass is itself extended with a role, | ||||
| 222 | # this check needs to be done since some items in the | ||||
| 223 | # class_precedence_list might in fact be Class::MOP | ||||
| 224 | # based still. | ||||
| 225 | next unless $meta && $meta->can('roles'); | ||||
| 226 | foreach my $role (@{$meta->roles}) { | ||||
| 227 | return 1 if $role->does_role($role_name); | ||||
| 228 | } | ||||
| 229 | } | ||||
| 230 | return 0; | ||||
| 231 | } | ||||
| 232 | |||||
| 233 | # spent 32.1ms (4.98+27.1) within Moose::Meta::Class::excludes_role which was called 21 times, avg 1.53ms/call:
# 21 times (4.98ms+27.1ms) by Moose::Meta::Role::Application::ToClass::check_role_exclusions at line 39 of Moose/Meta/Role/Application/ToClass.pm, avg 1.53ms/call | ||||
| 234 | 387 | 5.54ms | my ($self, $role_name) = @_; | ||
| 235 | |||||
| 236 | (defined $role_name) | ||||
| 237 | || $self->throw_error("You must supply a role name to look for"); | ||||
| 238 | |||||
| 239 | 21 | 22.2ms | foreach my $class ($self->class_precedence_list) { # spent 22.2ms making 21 calls to Class::MOP::Class::class_precedence_list, avg 1.06ms/call | ||
| 240 | 134 | 3.57ms | my $meta = Class::MOP::class_of($class); # spent 3.57ms making 134 calls to Class::MOP::class_of, avg 27µs/call | ||
| 241 | # when a Moose metaclass is itself extended with a role, | ||||
| 242 | # this check needs to be done since some items in the | ||||
| 243 | # class_precedence_list might in fact be Class::MOP | ||||
| 244 | # based still. | ||||
| 245 | 134 | 892µs | next unless $meta && $meta->can('roles'); # spent 892µs making 134 calls to UNIVERSAL::can, avg 7µs/call | ||
| 246 | 35 | 455µs | foreach my $role (@{$meta->roles}) { # spent 455µs making 35 calls to Moose::Meta::Class::roles, avg 13µs/call | ||
| 247 | return 1 if $role->excludes_role($role_name); | ||||
| 248 | } | ||||
| 249 | } | ||||
| 250 | return 0; | ||||
| 251 | } | ||||
| 252 | |||||
| 253 | # spent 31.8ms (2.63+29.2) within Moose::Meta::Class::new_object which was called 6 times, avg 5.31ms/call:
# 5 times (2.30ms+23.3ms) by Moose::Meta::Attribute::_new at line 4 of (eval 74)[Class/MOP/Method/Generated.pm:53], avg 5.12ms/call
# once (326µs+5.91ms) by Moose::Object::new at line 26 of Moose/Object.pm | ||||
| 254 | 188 | 3.45ms | my $self = shift; | ||
| 255 | my $params = @_ == 1 ? $_[0] : {@_}; | ||||
| 256 | 6 | 24.3ms | my $object = $self->SUPER::new_object($params); # spent 24.3ms making 6 calls to Class::MOP::Class::new_object, avg 4.05ms/call | ||
| 257 | |||||
| 258 | 6 | 3.86ms | foreach my $attr ( $self->get_all_attributes() ) { # spent 3.86ms making 6 calls to Class::MOP::Class::get_all_attributes, avg 643µs/call | ||
| 259 | |||||
| 260 | 164 | 894µs | next unless $attr->can('has_trigger') && $attr->has_trigger; # spent 785µs making 152 calls to UNIVERSAL::can, avg 5µs/call
# spent 109µs making 12 calls to Moose::Meta::Mixin::AttributeCore::has_trigger, avg 9µs/call | ||
| 261 | |||||
| 262 | my $init_arg = $attr->init_arg; | ||||
| 263 | |||||
| 264 | next unless defined $init_arg; | ||||
| 265 | |||||
| 266 | next unless exists $params->{$init_arg}; | ||||
| 267 | |||||
| 268 | $attr->trigger->( | ||||
| 269 | $object, | ||||
| 270 | ( | ||||
| 271 | $attr->should_coerce | ||||
| 272 | ? $attr->get_read_method_ref->($object) | ||||
| 273 | : $params->{$init_arg} | ||||
| 274 | ), | ||||
| 275 | ); | ||||
| 276 | } | ||||
| 277 | |||||
| 278 | 7 | 155µs | $object->BUILDALL($params) if $object->can('BUILDALL'); # spent 115µs making 6 calls to UNIVERSAL::can, avg 19µs/call
# spent 40µs making 1 call to Moose::Object::BUILDALL | ||
| 279 | |||||
| 280 | return $object; | ||||
| 281 | } | ||||
| 282 | |||||
| 283 | # spent 241ms (14.2+227) within Moose::Meta::Class::superclasses which was called 196 times, avg 1.23ms/call:
# 68 times (4.18ms+11.0ms) by Class::MOP::Class::_check_metaclass_compatibility at line 213 of Class/MOP/Class.pm, avg 223µs/call
# 50 times (4.49ms+142ms) by Moose::init_meta at line 218 of Moose.pm, avg 2.93ms/call
# 34 times (2.03ms+6.82ms) by Class::MOP::Class::class_precedence_list at line 929 of Class/MOP/Class.pm, avg 260µs/call
# 34 times (2.16ms+-2.16ms) by Class::MOP::Class::_superclasses_updated at line 870 of Class/MOP/Class.pm, avg 0s/call
# 8 times (1.17ms+63.2ms) by Class::MOP::Class::create at line 532 of Class/MOP/Class.pm, avg 8.04ms/call
# once (118µs+5.74ms) by Moose::extends at line 54 of Moose.pm
# once (52µs+262µs) by Class::MOP::Class:::around at line 27 of Class/MOP/Class/Immutable/Trait.pm | ||||
| 284 | 940 | 13.9ms | my $self = shift; | ||
| 285 | 196 | 7.52ms | my $supers = Data::OptList::mkopt(\@_); # spent 7.52ms making 196 calls to Data::OptList::mkopt, avg 38µs/call | ||
| 286 | foreach my $super (@{ $supers }) { | ||||
| 287 | my ($name, $opts) = @{ $super }; | ||||
| 288 | 39 | 7.66ms | Class::MOP::load_class($name, $opts); # spent 8.53ms making 39 calls to Class::MOP::load_class, avg 219µs/call, recursion: max depth 1, sum of overlapping time 868µs | ||
| 289 | 39 | 1.27ms | my $meta = Class::MOP::class_of($name); # spent 1.27ms making 39 calls to Class::MOP::class_of, avg 33µs/call | ||
| 290 | 38 | 466µs | $self->throw_error("You cannot inherit from a Moose Role ($name)") # spent 466µs making 38 calls to UNIVERSAL::isa, avg 12µs/call | ||
| 291 | if $meta && $meta->isa('Moose::Meta::Role') | ||||
| 292 | } | ||||
| 293 | 196 | 216ms | return $self->SUPER::superclasses(map { $_->[0] } @{ $supers }); # spent 227ms making 196 calls to Class::MOP::Class::superclasses, avg 1.16ms/call, recursion: max depth 1, sum of overlapping time 11.6ms | ||
| 294 | } | ||||
| 295 | |||||
| 296 | ### --------------------------------------------- | ||||
| 297 | |||||
| 298 | # spent 4.18s (12.6ms+4.17) within Moose::Meta::Class::add_attribute which was called 123 times, avg 34.0ms/call:
# 116 times (11.9ms+4.15s) by Moose::has at line 70 of Moose.pm, avg 35.8ms/call
# 7 times (685µs+18.9ms) by Moose::Meta::Role::Application::ToClass::apply_attributes at line 142 of Moose/Meta/Role/Application/ToClass.pm, avg 2.80ms/call | ||||
| 299 | 615 | 13.8ms | my $self = shift; | ||
| 300 | 246 | 2.88s | my $attr = # spent 2.88s making 116 calls to Moose::Meta::Class::_process_attribute, avg 24.8ms/call
# spent 618µs making 123 calls to Scalar::Util::blessed, avg 5µs/call
# spent 53µs making 7 calls to UNIVERSAL::isa, avg 8µs/call | ||
| 301 | (blessed $_[0] && $_[0]->isa('Class::MOP::Attribute') | ||||
| 302 | ? $_[0] | ||||
| 303 | : $self->_process_attribute(@_)); | ||||
| 304 | 123 | 1.31s | $self->SUPER::add_attribute($attr); # spent 1.31s making 123 calls to Class::MOP::Mixin::HasAttributes::add_attribute, avg 10.7ms/call | ||
| 305 | # it may be a Class::MOP::Attribute, theoretically, which doesn't have | ||||
| 306 | # 'bare' and doesn't implement this method | ||||
| 307 | 246 | 6.01ms | if ($attr->can('_check_associated_methods')) { # spent 4.74ms making 123 calls to Moose::Meta::Attribute::_check_associated_methods, avg 39µs/call
# spent 1.26ms making 123 calls to UNIVERSAL::can, avg 10µs/call | ||
| 308 | $attr->_check_associated_methods; | ||||
| 309 | } | ||||
| 310 | return $attr; | ||||
| 311 | } | ||||
| 312 | |||||
| 313 | # spent 27.4ms (944µs+26.5) within Moose::Meta::Class::add_override_method_modifier which was called 17 times, avg 1.61ms/call:
# 17 times (944µs+26.5ms) by Moose::Meta::Role::Application::ToClass::apply_override_method_modifiers at line 208 of Moose/Meta/Role/Application/ToClass.pm, avg 1.61ms/call | ||||
| 314 | 51 | 853µs | my ($self, $name, $method, $_super_package) = @_; | ||
| 315 | |||||
| 316 | 17 | 3.19ms | (!$self->has_method($name)) # spent 3.19ms making 17 calls to Class::MOP::Mixin::HasMethods::has_method, avg 188µs/call | ||
| 317 | || $self->throw_error("Cannot add an override method if a local method is already present"); | ||||
| 318 | |||||
| 319 | 34 | 23.3ms | $self->add_method($name => Moose::Meta::Method::Overridden->new( # spent 15.2ms making 17 calls to Moose::Meta::Method::Overridden::new, avg 896µs/call
# spent 8.06ms making 17 calls to Class::MOP::Mixin::HasMethods::add_method, avg 474µs/call | ||
| 320 | method => $method, | ||||
| 321 | class => $self, | ||||
| 322 | package => $_super_package, # need this for roles | ||||
| 323 | name => $name, | ||||
| 324 | )); | ||||
| 325 | } | ||||
| 326 | |||||
| 327 | sub add_augment_method_modifier { | ||||
| 328 | my ($self, $name, $method) = @_; | ||||
| 329 | (!$self->has_method($name)) | ||||
| 330 | || $self->throw_error("Cannot add an augment method if a local method is already present"); | ||||
| 331 | |||||
| 332 | $self->add_method($name => Moose::Meta::Method::Augmented->new( | ||||
| 333 | method => $method, | ||||
| 334 | class => $self, | ||||
| 335 | name => $name, | ||||
| 336 | )); | ||||
| 337 | } | ||||
| 338 | |||||
| 339 | ## Private Utility methods ... | ||||
| 340 | |||||
| 341 | sub _find_next_method_by_name_which_is_not_overridden { | ||||
| 342 | my ($self, $name) = @_; | ||||
| 343 | foreach my $method ($self->find_all_methods_by_name($name)) { | ||||
| 344 | return $method->{code} | ||||
| 345 | if blessed($method->{code}) && !$method->{code}->isa('Moose::Meta::Method::Overridden'); | ||||
| 346 | } | ||||
| 347 | return undef; | ||||
| 348 | } | ||||
| 349 | |||||
| 350 | ## Metaclass compatibility | ||||
| 351 | |||||
| 352 | # spent 16.0ms (10.7+5.37) within Moose::Meta::Class::_base_metaclasses which was called 73 times, avg 220µs/call:
# 39 times (5.70ms+2.92ms) by Class::MOP::Class::_can_fix_metaclass_incompatibility at line 343 of Class/MOP/Class.pm, avg 221µs/call
# 34 times (4.96ms+2.45ms) by Class::MOP::Class::_check_metaclass_compatibility at line 218 of Class/MOP/Class.pm, avg 218µs/call | ||||
| 353 | 730 | 14.5ms | my $self = shift; | ||
| 354 | 73 | 1.36ms | my %metaclasses = $self->SUPER::_base_metaclasses; # spent 1.36ms making 73 calls to Class::MOP::Class::_base_metaclasses, avg 19µs/call | ||
| 355 | for my $class (keys %metaclasses) { | ||||
| 356 | 438 | 4.00ms | $metaclasses{$class} =~ s/^Class::MOP/Moose::Meta/; # spent 4.00ms making 438 calls to Moose::Meta::Class::CORE:subst, avg 9µs/call | ||
| 357 | } | ||||
| 358 | return ( | ||||
| 359 | %metaclasses, | ||||
| 360 | error_class => 'Moose::Error::Default', | ||||
| 361 | ); | ||||
| 362 | } | ||||
| 363 | |||||
| 364 | sub _fix_class_metaclass_incompatibility { | ||||
| 365 | my $self = shift; | ||||
| 366 | my ($super_meta) = @_; | ||||
| 367 | |||||
| 368 | $self->SUPER::_fix_class_metaclass_incompatibility(@_); | ||||
| 369 | |||||
| 370 | if ($self->_class_metaclass_can_be_made_compatible($super_meta)) { | ||||
| 371 | ($self->is_pristine) | ||||
| 372 | || confess "Can't fix metaclass incompatibility for " | ||||
| 373 | . $self->name | ||||
| 374 | . " because it is not pristine."; | ||||
| 375 | my $super_meta_name = $super_meta->_real_ref_name; | ||||
| 376 | my $class_meta_subclass_meta_name = Moose::Util::_reconcile_roles_for_metaclass(blessed($self), $super_meta_name); | ||||
| 377 | my $new_self = $class_meta_subclass_meta_name->reinitialize( | ||||
| 378 | $self->name, | ||||
| 379 | ); | ||||
| 380 | |||||
| 381 | $self->_replace_self( $new_self, $class_meta_subclass_meta_name ); | ||||
| 382 | } | ||||
| 383 | } | ||||
| 384 | |||||
| 385 | sub _fix_single_metaclass_incompatibility { | ||||
| 386 | my $self = shift; | ||||
| 387 | my ($metaclass_type, $super_meta) = @_; | ||||
| 388 | |||||
| 389 | $self->SUPER::_fix_single_metaclass_incompatibility(@_); | ||||
| 390 | |||||
| 391 | if ($self->_single_metaclass_can_be_made_compatible($super_meta, $metaclass_type)) { | ||||
| 392 | ($self->is_pristine) | ||||
| 393 | || confess "Can't fix metaclass incompatibility for " | ||||
| 394 | . $self->name | ||||
| 395 | . " because it is not pristine."; | ||||
| 396 | my $super_meta_name = $super_meta->_real_ref_name; | ||||
| 397 | my $class_specific_meta_subclass_meta_name = Moose::Util::_reconcile_roles_for_metaclass($self->$metaclass_type, $super_meta->$metaclass_type); | ||||
| 398 | my $new_self = $super_meta->reinitialize( | ||||
| 399 | $self->name, | ||||
| 400 | $metaclass_type => $class_specific_meta_subclass_meta_name, | ||||
| 401 | ); | ||||
| 402 | |||||
| 403 | $self->_replace_self( $new_self, $super_meta_name ); | ||||
| 404 | } | ||||
| 405 | } | ||||
| 406 | |||||
| 407 | sub _replace_self { | ||||
| 408 | my $self = shift; | ||||
| 409 | my ( $new_self, $new_class) = @_; | ||||
| 410 | |||||
| 411 | %$self = %$new_self; | ||||
| 412 | bless $self, $new_class; | ||||
| 413 | |||||
| 414 | # We need to replace the cached metaclass instance or else when it goes | ||||
| 415 | # out of scope Class::MOP::Class destroy's the namespace for the | ||||
| 416 | # metaclass's class, causing much havoc. | ||||
| 417 | my $weaken = Class::MOP::metaclass_is_weak( $self->name ); | ||||
| 418 | Class::MOP::store_metaclass_by_name( $self->name, $self ); | ||||
| 419 | Class::MOP::weaken_metaclass( $self->name ) if $weaken; | ||||
| 420 | } | ||||
| 421 | |||||
| 422 | # spent 2.88s (5.84ms+2.87) within Moose::Meta::Class::_process_attribute which was called 116 times, avg 24.8ms/call:
# 116 times (5.84ms+2.87s) by Moose::Meta::Class::add_attribute at line 300, avg 24.8ms/call | ||||
| 423 | 464 | 6.84ms | my ( $self, $name, @args ) = @_; | ||
| 424 | |||||
| 425 | @args = %{$args[0]} if scalar @args == 1 && ref($args[0]) eq 'HASH'; | ||||
| 426 | |||||
| 427 | 116 | 677µs | if (($name || '') =~ /^\+(.*)/) { # spent 677µs making 116 calls to Moose::Meta::Class::CORE:match, avg 6µs/call | ||
| 428 | 2 | 19.4ms | return $self->_process_inherited_attribute($1, @args); # spent 19.4ms making 2 calls to Moose::Meta::Class::_process_inherited_attribute, avg 9.70ms/call | ||
| 429 | } | ||||
| 430 | else { | ||||
| 431 | 114 | 2.85s | return $self->_process_new_attribute($name, @args); # spent 2.85s making 114 calls to Moose::Meta::Class::_process_new_attribute, avg 25.0ms/call | ||
| 432 | } | ||||
| 433 | } | ||||
| 434 | |||||
| 435 | # spent 2.85s (6.12ms+2.85) within Moose::Meta::Class::_process_new_attribute which was called 114 times, avg 25.0ms/call:
# 114 times (6.12ms+2.85s) by Moose::Meta::Class::_process_attribute at line 431, avg 25.0ms/call | ||||
| 436 | 228 | 5.39ms | my ( $self, $name, @args ) = @_; | ||
| 437 | |||||
| 438 | 228 | 2.85s | $self->attribute_metaclass->interpolate_class_and_new($name, @args); # spent 2.84s making 114 calls to Moose::Meta::Attribute::interpolate_class_and_new, avg 25.0ms/call
# spent 1.43ms making 114 calls to Class::MOP::Mixin::HasAttributes::attribute_metaclass, avg 13µs/call | ||
| 439 | } | ||||
| 440 | |||||
| 441 | # spent 19.4ms (184µs+19.2) within Moose::Meta::Class::_process_inherited_attribute which was called 2 times, avg 9.70ms/call:
# 2 times (184µs+19.2ms) by Moose::Meta::Class::_process_attribute at line 428, avg 9.70ms/call | ||||
| 442 | 8 | 188µs | my ($self, $attr_name, %options) = @_; | ||
| 443 | 2 | 769µs | my $inherited_attr = $self->find_attribute_by_name($attr_name); # spent 769µs making 2 calls to Class::MOP::Class::find_attribute_by_name, avg 384µs/call | ||
| 444 | (defined $inherited_attr) | ||||
| 445 | || $self->throw_error("Could not find an attribute by the name of '$attr_name' to inherit from in ${\$self->name}", data => $attr_name); | ||||
| 446 | 4 | 18.4ms | if ($inherited_attr->isa('Moose::Meta::Attribute')) { # spent 18.4ms making 2 calls to Moose::Meta::Attribute::clone_and_inherit_options, avg 9.22ms/call
# spent 15µs making 2 calls to UNIVERSAL::isa, avg 8µs/call | ||
| 447 | return $inherited_attr->clone_and_inherit_options(%options); | ||||
| 448 | } | ||||
| 449 | else { | ||||
| 450 | # NOTE: | ||||
| 451 | # kind of a kludge to handle Class::MOP::Attributes | ||||
| 452 | return $inherited_attr->Moose::Meta::Attribute::clone_and_inherit_options(%options); | ||||
| 453 | } | ||||
| 454 | } | ||||
| 455 | |||||
| 456 | ## Immutability | ||||
| 457 | |||||
| 458 | # spent 4.34ms (1.02+3.32) within Moose::Meta::Class::_immutable_options which was called 24 times, avg 181µs/call:
# 24 times (1.02ms+3.32ms) by Class::MOP::Class::make_immutable at line 1180 of Class/MOP/Class.pm, avg 181µs/call | ||||
| 459 | 48 | 1.04ms | my ( $self, @args ) = @_; | ||
| 460 | |||||
| 461 | 24 | 3.32ms | $self->SUPER::_immutable_options( # spent 3.32ms making 24 calls to Class::MOP::Class::_immutable_options, avg 138µs/call | ||
| 462 | inline_destructor => 1, | ||||
| 463 | |||||
| 464 | # Moose always does this when an attribute is created | ||||
| 465 | inline_accessors => 0, | ||||
| 466 | |||||
| 467 | @args, | ||||
| 468 | ); | ||||
| 469 | } | ||||
| 470 | |||||
| 471 | ## ------------------------------------------------- | ||||
| 472 | |||||
| 473 | 1 | 2µs | our $error_level; | ||
| 474 | |||||
| 475 | sub throw_error { | ||||
| 476 | my ( $self, @args ) = @_; | ||||
| 477 | local $error_level = ($error_level || 0) + 1; | ||||
| 478 | $self->raise_error($self->create_error(@args)); | ||||
| 479 | } | ||||
| 480 | |||||
| 481 | sub raise_error { | ||||
| 482 | my ( $self, @args ) = @_; | ||||
| 483 | die @args; | ||||
| 484 | } | ||||
| 485 | |||||
| 486 | sub create_error { | ||||
| 487 | my ( $self, @args ) = @_; | ||||
| 488 | |||||
| 489 | require Carp::Heavy; | ||||
| 490 | |||||
| 491 | local $error_level = ($error_level || 0 ) + 1; | ||||
| 492 | |||||
| 493 | if ( @args % 2 == 1 ) { | ||||
| 494 | unshift @args, "message"; | ||||
| 495 | } | ||||
| 496 | |||||
| 497 | my %args = ( metaclass => $self, last_error => $@, @args ); | ||||
| 498 | |||||
| 499 | $args{depth} += $error_level; | ||||
| 500 | |||||
| 501 | my $class = ref $self ? $self->error_class : "Moose::Error::Default"; | ||||
| 502 | |||||
| 503 | Class::MOP::load_class($class); | ||||
| 504 | |||||
| 505 | $class->new( | ||||
| 506 | Carp::caller_info($args{depth}), | ||||
| 507 | %args | ||||
| 508 | ); | ||||
| 509 | } | ||||
| 510 | |||||
| 511 | 1 | 96µs | 1; | ||
| 512 | |||||
| 513 | __END__ | ||||
# spent 677µs within Moose::Meta::Class::CORE:match which was called 116 times, avg 6µs/call:
# 116 times (677µs+0s) by Moose::Meta::Class::_process_attribute at line 427, avg 6µs/call | |||||
# spent 59µs within Moose::Meta::Class::CORE:sort which was called 15 times, avg 4µs/call:
# 15 times (59µs+0s) by Moose::Meta::Class::_anon_cache_key at line 127, avg 4µs/call | |||||
# spent 4.00ms within Moose::Meta::Class::CORE:subst which was called 438 times, avg 9µs/call:
# 438 times (4.00ms+0s) by Moose::Meta::Class::_base_metaclasses at line 356, avg 9µs/call |