| Filename | /2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/Class/Accessor/Grouped.pm |
| Statements | Executed 346982 statements in 1.56s |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 85383 | 14 | 14 | 1.19s | 1.39s | Class::Accessor::Grouped::get_inherited |
| 822 | 1 | 1 | 20.1ms | 24.1ms | Class::Accessor::Grouped::__ANON__[:810] |
| 359 | 1 | 1 | 9.73ms | 39.8ms | Class::Accessor::Grouped::_mk_group_accessors |
| 359 | 21 | 13 | 2.29ms | 42.1ms | Class::Accessor::Grouped::mk_group_accessors |
| 822 | 1 | 1 | 2.25ms | 26.4ms | Class::Accessor::Grouped::make_group_accessor |
| 221 | 15 | 15 | 1.46ms | 1.67ms | Class::Accessor::Grouped::set_inherited |
| 179 | 1 | 1 | 1.16ms | 1.27ms | Class::Accessor::Grouped::__ANON__[:606] |
| 1 | 1 | 1 | 667µs | 1.56ms | Class::Accessor::Grouped::BEGIN@529 |
| 50 | 1 | 1 | 367µs | 451µs | Class::Accessor::Grouped::get_super_paths |
| 179 | 1 | 1 | 108µs | 108µs | Class::Accessor::Grouped::CORE:subst (opcode) |
| 1 | 1 | 1 | 12µs | 14µs | Class::Accessor::Grouped::BEGIN@2 |
| 1 | 1 | 1 | 12µs | 28µs | Class::Accessor::Grouped::BEGIN@744 |
| 1 | 1 | 1 | 8µs | 22µs | Class::Accessor::Grouped::BEGIN@38 |
| 1 | 1 | 1 | 7µs | 15µs | Class::Accessor::Grouped::BEGIN@250 |
| 1 | 1 | 1 | 7µs | 18µs | Class::Accessor::Grouped::BEGIN@37 |
| 1 | 1 | 1 | 7µs | 16µs | Class::Accessor::Grouped::BEGIN@249 |
| 1 | 1 | 1 | 7µs | 21µs | Class::Accessor::Grouped::BEGIN@766 |
| 1 | 1 | 1 | 7µs | 15µs | Class::Accessor::Grouped::BEGIN@793 |
| 1 | 1 | 1 | 7µs | 14µs | Class::Accessor::Grouped::BEGIN@3 |
| 1 | 1 | 1 | 7µs | 14µs | Class::Accessor::Grouped::BEGIN@765 |
| 1 | 1 | 1 | 7µs | 14µs | Class::Accessor::Grouped::BEGIN@297 |
| 1 | 1 | 1 | 4µs | 4µs | Class::Accessor::Grouped::BEGIN@7 |
| 1 | 1 | 1 | 4µs | 4µs | Class::Accessor::Grouped::BEGIN@5 |
| 1 | 1 | 1 | 4µs | 4µs | Class::Accessor::Grouped::BEGIN@4 |
| 1 | 1 | 1 | 4µs | 4µs | Class::Accessor::Grouped::BEGIN@21 |
| 1 | 1 | 1 | 2µs | 2µs | Class::Accessor::Grouped::CORE:match (opcode) |
| 0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::__ANON__[:543] |
| 0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::__ANON__[:559] |
| 0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::__ANON__[:625] |
| 0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::__ANON__[:644] |
| 0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::__ANON__[:782] |
| 0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::get_component_class |
| 0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::get_simple |
| 0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::make_group_ro_accessor |
| 0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::make_group_wo_accessor |
| 0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::mk_group_ro_accessors |
| 0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::mk_group_wo_accessors |
| 0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::set_component_class |
| 0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::set_simple |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | package Class::Accessor::Grouped; | ||||
| 2 | 3 | 18µs | 2 | 16µs | # spent 14µs (12+2) within Class::Accessor::Grouped::BEGIN@2 which was called:
# once (12µs+2µs) by base::import at line 2 # spent 14µs making 1 call to Class::Accessor::Grouped::BEGIN@2
# spent 2µs making 1 call to strict::import |
| 3 | 3 | 17µs | 2 | 22µs | # spent 14µs (7+7) within Class::Accessor::Grouped::BEGIN@3 which was called:
# once (7µs+7µs) by base::import at line 3 # spent 14µs making 1 call to Class::Accessor::Grouped::BEGIN@3
# spent 7µs making 1 call to warnings::import |
| 4 | 3 | 16µs | 1 | 4µs | # spent 4µs within Class::Accessor::Grouped::BEGIN@4 which was called:
# once (4µs+0s) by base::import at line 4 # spent 4µs making 1 call to Class::Accessor::Grouped::BEGIN@4 |
| 5 | 3 | 35µs | 1 | 4µs | # spent 4µs within Class::Accessor::Grouped::BEGIN@5 which was called:
# once (4µs+0s) by base::import at line 5 # spent 4µs making 1 call to Class::Accessor::Grouped::BEGIN@5 |
| 6 | |||||
| 7 | # spent 4µs within Class::Accessor::Grouped::BEGIN@7 which was called:
# once (4µs+0s) by base::import at line 14 | ||||
| 8 | 2 | 6µs | if ($] < 5.009_005) { | ||
| 9 | require MRO::Compat; | ||||
| 10 | } | ||||
| 11 | else { | ||||
| 12 | require mro; | ||||
| 13 | } | ||||
| 14 | 1 | 52µs | 1 | 4µs | } # spent 4µs making 1 call to Class::Accessor::Grouped::BEGIN@7 |
| 15 | |||||
| 16 | 1 | 1µs | our $VERSION = '0.10006'; | ||
| 17 | 1 | 8µs | 1 | 2µs | $VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases # spent 2µs making 1 call to Class::Accessor::Grouped::CORE:match |
| 18 | |||||
| 19 | # when changing minimum version don't forget to adjust Makefile.PL as well | ||||
| 20 | 1 | 100ns | our $__minimum_xsa_version; | ||
| 21 | 1 | 63µs | 1 | 4µs | # spent 4µs within Class::Accessor::Grouped::BEGIN@21 which was called:
# once (4µs+0s) by base::import at line 21 # spent 4µs making 1 call to Class::Accessor::Grouped::BEGIN@21 |
| 22 | |||||
| 23 | 1 | 200ns | our $USE_XS; | ||
| 24 | # the unless defined is here so that we can override the value | ||||
| 25 | # before require/use, *regardless* of the state of $ENV{CAG_USE_XS} | ||||
| 26 | 1 | 1µs | $USE_XS = $ENV{CAG_USE_XS} | ||
| 27 | unless defined $USE_XS; | ||||
| 28 | |||||
| 29 | # Yes this method is undocumented | ||||
| 30 | # Yes it should be a private coderef like all the rest at the end of this file | ||||
| 31 | # No we can't do that (yet) because the DBIC-CDBI compat layer overrides it | ||||
| 32 | # %$*@!?&!&#*$!!! | ||||
| 33 | # spent 39.8ms (9.73+30.1) within Class::Accessor::Grouped::_mk_group_accessors which was called 359 times, avg 111µs/call:
# 359 times (9.73ms+30.1ms) by Class::Accessor::Grouped::mk_group_accessors at line 125, avg 111µs/call | ||||
| 34 | 1436 | 4.40ms | my($self, $maker, $group, @fields) = @_; | ||
| 35 | 359 | 201µs | my $class = Scalar::Util::blessed $self || $self; # spent 201µs making 359 calls to Scalar::Util::blessed, avg 560ns/call | ||
| 36 | |||||
| 37 | 3 | 19µs | 2 | 28µs | # spent 18µs (7+10) within Class::Accessor::Grouped::BEGIN@37 which was called:
# once (7µs+10µs) by base::import at line 37 # spent 18µs making 1 call to Class::Accessor::Grouped::BEGIN@37
# spent 10µs making 1 call to strict::unimport |
| 38 | 3 | 362µs | 2 | 36µs | # spent 22µs (8+14) within Class::Accessor::Grouped::BEGIN@38 which was called:
# once (8µs+14µs) by base::import at line 38 # spent 22µs making 1 call to Class::Accessor::Grouped::BEGIN@38
# spent 14µs making 1 call to warnings::unimport |
| 39 | |||||
| 40 | # So we don't have to do lots of lookups inside the loop. | ||||
| 41 | 359 | 1.27ms | $maker = $self->can($maker) unless ref $maker; # spent 1.27ms making 359 calls to UNIVERSAL::can, avg 4µs/call | ||
| 42 | |||||
| 43 | foreach (@fields) { | ||||
| 44 | 1644 | 1.22ms | if( $_ eq 'DESTROY' ) { | ||
| 45 | Carp::carp("Having a data accessor named DESTROY in ". | ||||
| 46 | "'$class' is unwise."); | ||||
| 47 | } | ||||
| 48 | |||||
| 49 | my ($name, $field) = (ref $_) | ||||
| 50 | ? (@$_) | ||||
| 51 | : ($_, $_) | ||||
| 52 | ; | ||||
| 53 | |||||
| 54 | my $alias = "_${name}_accessor"; | ||||
| 55 | |||||
| 56 | for my $meth ($name, $alias) { | ||||
| 57 | |||||
| 58 | # the maker may elect to not return anything, meaning it already | ||||
| 59 | # installed the coderef for us (e.g. lack of Sub::Name) | ||||
| 60 | 2466 | 7.59ms | 822 | 26.4ms | my $cref = $self->$maker($group, $field, $meth) # spent 26.4ms making 822 calls to Class::Accessor::Grouped::make_group_accessor, avg 32µs/call |
| 61 | or next; | ||||
| 62 | |||||
| 63 | my $fq_meth = "${class}::${meth}"; | ||||
| 64 | |||||
| 65 | 822 | 2.27ms | *$fq_meth = Sub::Name::subname($fq_meth, $cref); # spent 2.27ms making 822 calls to Sub::Name::subname, avg 3µs/call | ||
| 66 | #unless defined &{$class."\:\:$field"} | ||||
| 67 | } | ||||
| 68 | } | ||||
| 69 | }; | ||||
| 70 | |||||
| 71 | # coderef is setup at the end for clarity | ||||
| 72 | 1 | 200ns | my $gen_accessor; | ||
| 73 | |||||
| 74 | =head1 NAME | ||||
| 75 | |||||
| 76 | Class::Accessor::Grouped - Lets you build groups of accessors | ||||
| 77 | |||||
| 78 | =head1 SYNOPSIS | ||||
| 79 | |||||
| 80 | use base 'Class::Accessor::Grouped'; | ||||
| 81 | |||||
| 82 | # make basic accessors for objects | ||||
| 83 | __PACKAGE__->mk_group_accessors(simple => qw(id name email)); | ||||
| 84 | |||||
| 85 | # make accessor that works for objects and classes | ||||
| 86 | __PACKAGE__->mk_group_accessors(inherited => 'awesome_level'); | ||||
| 87 | |||||
| 88 | =head1 DESCRIPTION | ||||
| 89 | |||||
| 90 | This class lets you build groups of accessors that will call different | ||||
| 91 | getters and setters. | ||||
| 92 | |||||
| 93 | =head1 METHODS | ||||
| 94 | |||||
| 95 | =head2 mk_group_accessors | ||||
| 96 | |||||
| 97 | __PACKAGE__->mk_group_accessors(simple => 'hair_length', [ hair_color => 'hc' ]); | ||||
| 98 | |||||
| 99 | =over 4 | ||||
| 100 | |||||
| 101 | =item Arguments: $group, @fieldspec | ||||
| 102 | |||||
| 103 | Returns: none | ||||
| 104 | |||||
| 105 | =back | ||||
| 106 | |||||
| 107 | Creates a set of accessors in a given group. | ||||
| 108 | |||||
| 109 | $group is the name of the accessor group for the generated accessors; they | ||||
| 110 | will call get_$group($field) on get and set_$group($field, $value) on set. | ||||
| 111 | |||||
| 112 | If you want to mimic Class::Accessor's mk_accessors $group has to be 'simple' | ||||
| 113 | to tell Class::Accessor::Grouped to use its own get_simple and set_simple | ||||
| 114 | methods. | ||||
| 115 | |||||
| 116 | @fieldspec is a list of field/accessor names; if a fieldspec is a scalar | ||||
| 117 | this is used as both field and accessor name, if a listref it is expected to | ||||
| 118 | be of the form [ $accessor, $field ]. | ||||
| 119 | |||||
| 120 | =cut | ||||
| 121 | |||||
| 122 | # spent 42.1ms (2.29+39.8) within Class::Accessor::Grouped::mk_group_accessors which was called 359 times, avg 117µs/call:
# 250 times (1.00ms+25.1ms) by DBIx::Class::Row::register_column at line 1346 of DBIx/Class/Row.pm, avg 105µs/call
# 53 times (929µs+5.86ms) by DBIx::Class::mk_classaccessor at line 82 of DBIx/Class.pm, avg 128µs/call
# 38 times (150µs+2.94ms) by DBIx::Class::InflateColumn::inflate_column at line 89 of DBIx/Class/InflateColumn.pm, avg 81µs/call
# once (5µs+605µs) by Class::C3::Componentised::ensure_class_loaded at line 68 of DBIx/Class/Storage/DBI.pm
# once (5µs+590µs) by Class::C3::Componentised::ensure_class_loaded at line 69 of DBIx/Class/Storage/DBI.pm
# once (19µs+556µs) by Class::C3::Componentised::ensure_class_loaded at line 18 of DBIx/Class/ResultSource.pm
# once (7µs+523µs) by Class::C3::Componentised::ensure_class_loaded at line 33 of DBIx/Class/Storage/DBI.pm
# once (16µs+447µs) by Class::C3::Componentised::ensure_class_loaded at line 22 of DBIx/Class/Storage/DBI.pm
# once (18µs+378µs) by Class::C3::Componentised::ensure_class_loaded at line 11 of DBIx/Class/Storage/DBI/Cursor.pm
# once (5µs+348µs) by Class::C3::Componentised::ensure_class_loaded at line 44 of DBIx/Class/Storage/DBI.pm
# once (19µs+333µs) by base::import at line 21 of DBIx/Class/Storage.pm
# once (5µs+284µs) by Class::C3::Componentised::ensure_class_loaded at line 25 of DBIx/Class/ResultSource.pm
# once (5µs+271µs) by Class::C3::Componentised::ensure_class_loaded at line 26 of DBIx/Class/Storage/DBI.pm
# once (18µs+215µs) by base::import at line 50 of DBIx/Class/SQLMaker.pm
# once (14µs+210µs) by Class::C3::Componentised::ensure_class_loaded at line 10 of DBIx/Class/ResultSource/View.pm
# once (4µs+207µs) by DBIx::Class::FilterColumn::filter_column at line 27 of DBIx/Class/FilterColumn.pm
# once (16µs+195µs) by base::import at line 12 of DBIx/Class/ResultSourceProxy.pm
# once (5µs+205µs) by base::import at line 22 of DBIx/Class/Storage.pm
# once (14µs+190µs) by parent::import at line 73 of DBIx/Class.pm
# once (15µs+183µs) by DBIx::Class::ResultSource::BEGIN@7 at line 17 of DBIx/Class/ResultSourceHandle.pm
# once (16µs+157µs) by DBIx::Class::ResultSource::Table::BEGIN@6 at line 29 of DBIx/Class/ResultSet.pm | ||||
| 123 | 1077 | 2.28ms | my ($self, $group, @fields) = @_; | ||
| 124 | |||||
| 125 | 359 | 39.8ms | $self->_mk_group_accessors('make_group_accessor', $group, @fields); # spent 39.8ms making 359 calls to Class::Accessor::Grouped::_mk_group_accessors, avg 111µs/call | ||
| 126 | return; | ||||
| 127 | } | ||||
| 128 | |||||
| 129 | =head2 mk_group_ro_accessors | ||||
| 130 | |||||
| 131 | __PACKAGE__->mk_group_ro_accessors(simple => 'birthdate', [ social_security_number => 'ssn' ]); | ||||
| 132 | |||||
| 133 | =over 4 | ||||
| 134 | |||||
| 135 | =item Arguments: $group, @fieldspec | ||||
| 136 | |||||
| 137 | Returns: none | ||||
| 138 | |||||
| 139 | =back | ||||
| 140 | |||||
| 141 | Creates a set of read only accessors in a given group. Identical to | ||||
| 142 | L</mk_group_accessors> but accessors will throw an error if passed a value | ||||
| 143 | rather than setting the value. | ||||
| 144 | |||||
| 145 | =cut | ||||
| 146 | |||||
| 147 | sub mk_group_ro_accessors { | ||||
| 148 | my($self, $group, @fields) = @_; | ||||
| 149 | |||||
| 150 | $self->_mk_group_accessors('make_group_ro_accessor', $group, @fields); | ||||
| 151 | } | ||||
| 152 | |||||
| 153 | =head2 mk_group_wo_accessors | ||||
| 154 | |||||
| 155 | __PACKAGE__->mk_group_wo_accessors(simple => 'lie', [ subject => 'subj' ]); | ||||
| 156 | |||||
| 157 | =over 4 | ||||
| 158 | |||||
| 159 | =item Arguments: $group, @fieldspec | ||||
| 160 | |||||
| 161 | Returns: none | ||||
| 162 | |||||
| 163 | =back | ||||
| 164 | |||||
| 165 | Creates a set of write only accessors in a given group. Identical to | ||||
| 166 | L</mk_group_accessors> but accessors will throw an error if not passed a | ||||
| 167 | value rather than getting the value. | ||||
| 168 | |||||
| 169 | =cut | ||||
| 170 | |||||
| 171 | sub mk_group_wo_accessors { | ||||
| 172 | my($self, $group, @fields) = @_; | ||||
| 173 | |||||
| 174 | $self->_mk_group_accessors('make_group_wo_accessor', $group, @fields); | ||||
| 175 | } | ||||
| 176 | |||||
| 177 | =head2 get_simple | ||||
| 178 | |||||
| 179 | =over 4 | ||||
| 180 | |||||
| 181 | =item Arguments: $field | ||||
| 182 | |||||
| 183 | Returns: $value | ||||
| 184 | |||||
| 185 | =back | ||||
| 186 | |||||
| 187 | Simple getter for hash-based objects which returns the value for the field | ||||
| 188 | name passed as an argument. | ||||
| 189 | |||||
| 190 | =cut | ||||
| 191 | |||||
| 192 | sub get_simple { | ||||
| 193 | return $_[0]->{$_[1]}; | ||||
| 194 | } | ||||
| 195 | |||||
| 196 | =head2 set_simple | ||||
| 197 | |||||
| 198 | =over 4 | ||||
| 199 | |||||
| 200 | =item Arguments: $field, $new_value | ||||
| 201 | |||||
| 202 | Returns: $new_value | ||||
| 203 | |||||
| 204 | =back | ||||
| 205 | |||||
| 206 | Simple setter for hash-based objects which sets and then returns the value | ||||
| 207 | for the field name passed as an argument. | ||||
| 208 | |||||
| 209 | =cut | ||||
| 210 | |||||
| 211 | sub set_simple { | ||||
| 212 | return $_[0]->{$_[1]} = $_[2]; | ||||
| 213 | } | ||||
| 214 | |||||
| 215 | |||||
| 216 | =head2 get_inherited | ||||
| 217 | |||||
| 218 | =over 4 | ||||
| 219 | |||||
| 220 | =item Arguments: $field | ||||
| 221 | |||||
| 222 | Returns: $value | ||||
| 223 | |||||
| 224 | =back | ||||
| 225 | |||||
| 226 | Simple getter for Classes and hash-based objects which returns the value for | ||||
| 227 | the field name passed as an argument. This behaves much like | ||||
| 228 | L<Class::Data::Accessor> where the field can be set in a base class, | ||||
| 229 | inherited and changed in subclasses, and inherited and changed for object | ||||
| 230 | instances. | ||||
| 231 | |||||
| 232 | =cut | ||||
| 233 | |||||
| 234 | # spent 1.39s (1.19+196ms) within Class::Accessor::Grouped::get_inherited which was called 85383 times, avg 16µs/call:
# 35102 times (325ms+64.2ms) by DBIx::Class::AccessorGroup::get_component_class at line 13 of DBIx/Class/AccessorGroup.pm, avg 11µs/call
# 13801 times (279ms+33.9ms) by DBIx::Class::Version::Table::result_source_instance or DBIx::Class::Version::TableCompat::result_source_instance or Tapper::Schema::ReportsDB::Result::Contact::result_source_instance or Tapper::Schema::ReportsDB::Result::Notification::result_source_instance or Tapper::Schema::ReportsDB::Result::NotificationEvent::result_source_instance or Tapper::Schema::ReportsDB::Result::Report::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportComment::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportFile::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportSection::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportTopic::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportgroupArbitrary::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportgroupTestrun::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportgroupTestrunStats::result_source_instance or Tapper::Schema::ReportsDB::Result::Suite::result_source_instance or Tapper::Schema::ReportsDB::Result::Tap::result_source_instance or Tapper::Schema::ReportsDB::Result::User::result_source_instance or Tapper::Schema::ReportsDB::Result::View010TestrunOverviewReports::result_source_instance or Tapper::Schema::ReportsDB::Result::View020TestrunOverview::result_source_instance or Tapper::Schema::TestrunDB::Result::Host::result_source_instance or Tapper::Schema::TestrunDB::Result::HostFeature::result_source_instance or Tapper::Schema::TestrunDB::Result::Message::result_source_instance or Tapper::Schema::TestrunDB::Result::PrePrecondition::result_source_instance or Tapper::Schema::TestrunDB::Result::Precondition::result_source_instance or Tapper::Schema::TestrunDB::Result::Preconditiontype::result_source_instance or Tapper::Schema::TestrunDB::Result::Queue::result_source_instance or Tapper::Schema::TestrunDB::Result::QueueHost::result_source_instance or Tapper::Schema::TestrunDB::Result::Scenario::result_source_instance or Tapper::Schema::TestrunDB::Result::ScenarioElement::result_source_instance or Tapper::Schema::TestrunDB::Result::State::result_source_instance or Tapper::Schema::TestrunDB::Result::TestplanInstance::result_source_instance or Tapper::Schema::TestrunDB::Result::Testrun::result_source_instance or Tapper::Schema::TestrunDB::Result::TestrunPrecondition::result_source_instance or Tapper::Schema::TestrunDB::Result::TestrunRequestedFeature::result_source_instance or Tapper::Schema::TestrunDB::Result::TestrunRequestedHost::result_source_instance or Tapper::Schema::TestrunDB::Result::TestrunScheduling::result_source_instance or Tapper::Schema::TestrunDB::Result::Topic::result_source_instance or Tapper::Schema::TestrunDB::Result::User::result_source_instance at line 2 of (eval 300)[Class/Accessor/Grouped.pm:807], avg 23µs/call
# 12983 times (104ms+24.4ms) by DBIx::Class::Schema::storage at line 2 of (eval 335)[Class/Accessor/Grouped.pm:807], avg 10µs/call
# 7002 times (180ms+26.5ms) by DBIx::Class::Storage::DBI::get_use_dbms_capability at line 1040 of DBIx/Class/Storage/DBI.pm, avg 29µs/call
# 6450 times (69.2ms+15.6ms) by DBIx::Class::Schema::source_registrations at line 2 of (eval 333)[Class/Accessor/Grouped.pm:807], avg 13µs/call
# 5708 times (210ms+25.9ms) by DBIx::Class::Schema::default_resultset_attributes at line 2 of (eval 338)[Class/Accessor/Grouped.pm:807], avg 41µs/call
# 4198 times (21.6ms+4.77ms) by DBIx::Class::Schema::class_mappings at line 2 of (eval 332)[Class/Accessor/Grouped.pm:807], avg 6µs/call
# 40 times (720µs+95µs) by DBIx::Class::_skip_namespace_frames at line 2 of (eval 272)[Class/Accessor/Grouped.pm:807], avg 20µs/call
# 37 times (2.71ms+414µs) by DBIx::Class::ResultSourceProxy::Table::table_class at line 2 of (eval 298)[Class/Accessor/Grouped.pm:807], avg 84µs/call
# 37 times (646µs+114µs) by DBIx::Class::ResultSource::sqlt_deploy_callback at line 2 of (eval 297)[Class/Accessor/Grouped.pm:807], avg 21µs/call
# 12 times (163µs+23µs) by DBIx::Class::Schema::storage_type at line 2 of (eval 334)[Class/Accessor/Grouped.pm:807], avg 16µs/call
# 5 times (70µs+9µs) by DBIx::Class::Storage::DBI::sql_limit_dialect at line 2 of (eval 1391)[Class/Accessor/Grouped.pm:807], avg 16µs/call
# 4 times (191µs+21µs) by DBIx::Class::Schema::exception_action at line 2 of (eval 336)[Class/Accessor/Grouped.pm:807], avg 53µs/call
# 4 times (81µs+13µs) by DBIx::Class::Schema::stacktrace at line 2 of (eval 337)[Class/Accessor/Grouped.pm:807], avg 24µs/call | ||||
| 235 | 286751 | 1.31s | my $class; | ||
| 236 | |||||
| 237 | 2800 | 2.17ms | 167966 | 150ms | if ( defined( $class = Scalar::Util::blessed $_[0] ) ) { # spent 85.3ms making 85383 calls to Scalar::Util::blessed, avg 999ns/call
# spent 64.9ms making 82583 calls to Scalar::Util::reftype, avg 786ns/call |
| 238 | if (Scalar::Util::reftype $_[0] eq 'HASH') { | ||||
| 239 | return $_[0]->{$_[1]} if exists $_[0]->{$_[1]}; | ||||
| 240 | } | ||||
| 241 | else { | ||||
| 242 | Carp::croak('Cannot get inherited value on an object instance that is not hash-based'); | ||||
| 243 | } | ||||
| 244 | } | ||||
| 245 | else { | ||||
| 246 | $class = $_[0]; | ||||
| 247 | } | ||||
| 248 | |||||
| 249 | 3 | 19µs | 2 | 24µs | # spent 16µs (7+8) within Class::Accessor::Grouped::BEGIN@249 which was called:
# once (7µs+8µs) by base::import at line 249 # spent 16µs making 1 call to Class::Accessor::Grouped::BEGIN@249
# spent 8µs making 1 call to strict::unimport |
| 250 | 3 | 171µs | 2 | 24µs | # spent 15µs (7+8) within Class::Accessor::Grouped::BEGIN@250 which was called:
# once (7µs+8µs) by base::import at line 250 # spent 15µs making 1 call to Class::Accessor::Grouped::BEGIN@250
# spent 8µs making 1 call to warnings::unimport |
| 251 | |||||
| 252 | my $cag_slot = '::__cag_'. $_[1]; | ||||
| 253 | return ${$class.$cag_slot} if defined(${$class.$cag_slot}); | ||||
| 254 | |||||
| 255 | # we need to be smarter about recalculation, as @ISA (thus supers) can very well change in-flight | ||||
| 256 | 17553 | 45.3ms | my $cur_gen = mro::get_pkg_gen ($class); # spent 45.3ms making 17553 calls to mro::get_pkg_gen, avg 3µs/call | ||
| 257 | 100 | 1.40ms | if ( $cur_gen != ${$class.'::__cag_pkg_gen__'} ) { | ||
| 258 | 50 | 451µs | @{$class.'::__cag_supers__'} = $_[0]->get_super_paths; # spent 451µs making 50 calls to Class::Accessor::Grouped::get_super_paths, avg 9µs/call | ||
| 259 | ${$class.'::__cag_pkg_gen__'} = $cur_gen; | ||||
| 260 | } | ||||
| 261 | |||||
| 262 | for (@{$class.'::__cag_supers__'}) { | ||||
| 263 | 43553 | 204ms | return ${$_.$cag_slot} if defined(${$_.$cag_slot}); | ||
| 264 | }; | ||||
| 265 | |||||
| 266 | return undef; | ||||
| 267 | } | ||||
| 268 | |||||
| 269 | =head2 set_inherited | ||||
| 270 | |||||
| 271 | =over 4 | ||||
| 272 | |||||
| 273 | =item Arguments: $field, $new_value | ||||
| 274 | |||||
| 275 | Returns: $new_value | ||||
| 276 | |||||
| 277 | =back | ||||
| 278 | |||||
| 279 | Simple setter for Classes and hash-based objects which sets and then returns | ||||
| 280 | the value for the field name passed as an argument. When called on a hash-based | ||||
| 281 | object it will set the appropriate hash key value. When called on a class, it | ||||
| 282 | will set a class level variable. | ||||
| 283 | |||||
| 284 | B<Note:>: This method will die if you try to set an object variable on a non | ||||
| 285 | hash-based object. | ||||
| 286 | |||||
| 287 | =cut | ||||
| 288 | |||||
| 289 | # spent 1.67ms (1.46+209µs) within Class::Accessor::Grouped::set_inherited which was called 221 times, avg 8µs/call:
# 100 times (625µs+125µs) by DBIx::Class::Schema::source_registrations at line 2 of (eval 333)[Class/Accessor/Grouped.pm:807], avg 7µs/call
# 43 times (213µs+31µs) by DBIx::Class::Schema::class_mappings at line 2 of (eval 332)[Class/Accessor/Grouped.pm:807], avg 6µs/call
# 37 times (317µs+18µs) by DBIx::Class::Version::Table::result_source_instance or DBIx::Class::Version::TableCompat::result_source_instance or Tapper::Schema::ReportsDB::Result::Contact::result_source_instance or Tapper::Schema::ReportsDB::Result::Notification::result_source_instance or Tapper::Schema::ReportsDB::Result::NotificationEvent::result_source_instance or Tapper::Schema::ReportsDB::Result::Report::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportComment::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportFile::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportSection::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportTopic::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportgroupArbitrary::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportgroupTestrun::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportgroupTestrunStats::result_source_instance or Tapper::Schema::ReportsDB::Result::Suite::result_source_instance or Tapper::Schema::ReportsDB::Result::Tap::result_source_instance or Tapper::Schema::ReportsDB::Result::User::result_source_instance or Tapper::Schema::ReportsDB::Result::View010TestrunOverviewReports::result_source_instance or Tapper::Schema::ReportsDB::Result::View020TestrunOverview::result_source_instance or Tapper::Schema::TestrunDB::Result::Host::result_source_instance or Tapper::Schema::TestrunDB::Result::HostFeature::result_source_instance or Tapper::Schema::TestrunDB::Result::Message::result_source_instance or Tapper::Schema::TestrunDB::Result::PrePrecondition::result_source_instance or Tapper::Schema::TestrunDB::Result::Precondition::result_source_instance or Tapper::Schema::TestrunDB::Result::Preconditiontype::result_source_instance or Tapper::Schema::TestrunDB::Result::Queue::result_source_instance or Tapper::Schema::TestrunDB::Result::QueueHost::result_source_instance or Tapper::Schema::TestrunDB::Result::Scenario::result_source_instance or Tapper::Schema::TestrunDB::Result::ScenarioElement::result_source_instance or Tapper::Schema::TestrunDB::Result::State::result_source_instance or Tapper::Schema::TestrunDB::Result::TestplanInstance::result_source_instance or Tapper::Schema::TestrunDB::Result::Testrun::result_source_instance or Tapper::Schema::TestrunDB::Result::TestrunPrecondition::result_source_instance or Tapper::Schema::TestrunDB::Result::TestrunRequestedFeature::result_source_instance or Tapper::Schema::TestrunDB::Result::TestrunRequestedHost::result_source_instance or Tapper::Schema::TestrunDB::Result::TestrunScheduling::result_source_instance or Tapper::Schema::TestrunDB::Result::Topic::result_source_instance or Tapper::Schema::TestrunDB::Result::User::result_source_instance at line 2 of (eval 300)[Class/Accessor/Grouped.pm:807], avg 9µs/call
# 12 times (98µs+14µs) by DBIx::Class::AccessorGroup::set_component_class at line 29 of DBIx/Class/AccessorGroup.pm, avg 9µs/call
# 8 times (62µs+3µs) by DBIx::Class::mk_classaccessor at line 83 of DBIx/Class.pm, avg 8µs/call
# 6 times (33µs+8µs) by DBIx::Class::Schema::storage at line 2 of (eval 335)[Class/Accessor/Grouped.pm:807], avg 7µs/call
# 4 times (31µs+2µs) by DBIx::Class::DynamicDefault::__column_dynamic_default_triggers at line 2 of (eval 1304)[Class/Accessor/Grouped.pm:807], avg 8µs/call
# 2 times (20µs+2µs) by DBIx::Class::ResultSourceProxy::Table::table_class at line 2 of (eval 298)[Class/Accessor/Grouped.pm:807], avg 11µs/call
# 2 times (15µs+2µs) by DBIx::Class::Schema::Versioned::upgrade_directory at line 2 of (eval 349)[Class/Accessor/Grouped.pm:807], avg 8µs/call
# 2 times (10µs+900ns) by DBIx::Class::Schema::Versioned::backup_directory at line 2 of (eval 350)[Class/Accessor/Grouped.pm:807], avg 5µs/call
# once (13µs+600ns) by DBIx::Class::_skip_namespace_frames at line 2 of (eval 272)[Class/Accessor/Grouped.pm:807]
# once (7µs+500ns) by DBIx::Class::Storage::DBI::set_use_dbms_capability at line 1034 of DBIx/Class/Storage/DBI.pm
# once (5µs+400ns) by DBIx::Class::Storage::DBI::sql_limit_dialect at line 2 of (eval 1391)[Class/Accessor/Grouped.pm:807]
# once (5µs+400ns) by DBIx::Class::Storage::DBI::sql_name_sep at line 2 of (eval 1393)[Class/Accessor/Grouped.pm:807]
# once (5µs+400ns) by DBIx::Class::Storage::DBI::sql_quote_char at line 2 of (eval 1392)[Class/Accessor/Grouped.pm:807] | ||||
| 290 | 361 | 1.97ms | 302 | 209µs | if (defined Scalar::Util::blessed $_[0]) { # spent 144µs making 221 calls to Scalar::Util::blessed, avg 650ns/call
# spent 65µs making 81 calls to Scalar::Util::reftype, avg 807ns/call |
| 291 | if (Scalar::Util::reftype $_[0] eq 'HASH') { | ||||
| 292 | return $_[0]->{$_[1]} = $_[2]; | ||||
| 293 | } else { | ||||
| 294 | Carp::croak('Cannot set inherited value on an object instance that is not hash-based'); | ||||
| 295 | }; | ||||
| 296 | } else { | ||||
| 297 | 3 | 526µs | 2 | 22µs | # spent 14µs (7+7) within Class::Accessor::Grouped::BEGIN@297 which was called:
# once (7µs+7µs) by base::import at line 297 # spent 14µs making 1 call to Class::Accessor::Grouped::BEGIN@297
# spent 7µs making 1 call to strict::unimport |
| 298 | |||||
| 299 | return ${$_[0].'::__cag_'.$_[1]} = $_[2]; | ||||
| 300 | }; | ||||
| 301 | } | ||||
| 302 | |||||
| 303 | =head2 get_component_class | ||||
| 304 | |||||
| 305 | =over 4 | ||||
| 306 | |||||
| 307 | =item Arguments: $field | ||||
| 308 | |||||
| 309 | Returns: $value | ||||
| 310 | |||||
| 311 | =back | ||||
| 312 | |||||
| 313 | Gets the value of the specified component class. | ||||
| 314 | |||||
| 315 | __PACKAGE__->mk_group_accessors('component_class' => 'result_class'); | ||||
| 316 | |||||
| 317 | $self->result_class->method(); | ||||
| 318 | |||||
| 319 | ## same as | ||||
| 320 | $self->get_component_class('result_class')->method(); | ||||
| 321 | |||||
| 322 | =cut | ||||
| 323 | |||||
| 324 | sub get_component_class { | ||||
| 325 | return $_[0]->get_inherited($_[1]); | ||||
| 326 | }; | ||||
| 327 | |||||
| 328 | =head2 set_component_class | ||||
| 329 | |||||
| 330 | =over 4 | ||||
| 331 | |||||
| 332 | =item Arguments: $field, $class | ||||
| 333 | |||||
| 334 | Returns: $new_value | ||||
| 335 | |||||
| 336 | =back | ||||
| 337 | |||||
| 338 | Inherited accessor that automatically loads the specified class before setting | ||||
| 339 | it. This method will die if the specified class could not be loaded. | ||||
| 340 | |||||
| 341 | __PACKAGE__->mk_group_accessors('component_class' => 'result_class'); | ||||
| 342 | __PACKAGE__->result_class('MyClass'); | ||||
| 343 | |||||
| 344 | $self->result_class->method(); | ||||
| 345 | |||||
| 346 | =cut | ||||
| 347 | |||||
| 348 | sub set_component_class { | ||||
| 349 | if ($_[2]) { | ||||
| 350 | local $^W = 0; | ||||
| 351 | require Class::Inspector; | ||||
| 352 | if (Class::Inspector->installed($_[2]) && !Class::Inspector->loaded($_[2])) { | ||||
| 353 | eval "require $_[2]"; | ||||
| 354 | |||||
| 355 | Carp::croak("Could not load $_[1] '$_[2]': ", $@) if $@; | ||||
| 356 | }; | ||||
| 357 | }; | ||||
| 358 | |||||
| 359 | return $_[0]->set_inherited($_[1], $_[2]); | ||||
| 360 | }; | ||||
| 361 | |||||
| 362 | =head1 INTERNAL METHODS | ||||
| 363 | |||||
| 364 | These methods are documented for clarity, but are never meant to be called | ||||
| 365 | directly, and are not really meant for overriding either. | ||||
| 366 | |||||
| 367 | =head2 get_super_paths | ||||
| 368 | |||||
| 369 | Returns a list of 'parent' or 'super' class names that the current class | ||||
| 370 | inherited from. This is what drives the traversal done by L</get_inherited>. | ||||
| 371 | |||||
| 372 | =cut | ||||
| 373 | |||||
| 374 | # spent 451µs (367+84) within Class::Accessor::Grouped::get_super_paths which was called 50 times, avg 9µs/call:
# 50 times (367µs+84µs) by Class::Accessor::Grouped::get_inherited at line 258, avg 9µs/call | ||||
| 375 | 50 | 493µs | 50 | 84µs | return @{mro::get_linear_isa( ref($_[0]) || $_[0] )}; # spent 84µs making 50 calls to mro::get_linear_isa, avg 2µs/call |
| 376 | }; | ||||
| 377 | |||||
| 378 | =head2 make_group_accessor | ||||
| 379 | |||||
| 380 | __PACKAGE__->make_group_accessor('simple', 'hair_length', 'hair_length'); | ||||
| 381 | __PACKAGE__->make_group_accessor('simple', 'hc', 'hair_color'); | ||||
| 382 | |||||
| 383 | =over 4 | ||||
| 384 | |||||
| 385 | =item Arguments: $group, $field, $accessor | ||||
| 386 | |||||
| 387 | Returns: \&accessor_coderef ? | ||||
| 388 | |||||
| 389 | =back | ||||
| 390 | |||||
| 391 | Called by mk_group_accessors for each entry in @fieldspec. Either returns | ||||
| 392 | a coderef which will be installed at C<&__PACKAGE__::$accessor>, or returns | ||||
| 393 | C<undef> if it elects to install the coderef on its own. | ||||
| 394 | |||||
| 395 | =cut | ||||
| 396 | |||||
| 397 | 822 | 2.06ms | 822 | 24.1ms | # spent 26.4ms (2.25+24.1) within Class::Accessor::Grouped::make_group_accessor which was called 822 times, avg 32µs/call:
# 822 times (2.25ms+24.1ms) by Class::Accessor::Grouped::_mk_group_accessors at line 60, avg 32µs/call # spent 24.1ms making 822 calls to Class::Accessor::Grouped::__ANON__[Class/Accessor/Grouped.pm:810], avg 29µs/call |
| 398 | |||||
| 399 | =head2 make_group_ro_accessor | ||||
| 400 | |||||
| 401 | __PACKAGE__->make_group_ro_accessor('simple', 'birthdate', 'birthdate'); | ||||
| 402 | __PACKAGE__->make_group_ro_accessor('simple', 'ssn', 'social_security_number'); | ||||
| 403 | |||||
| 404 | =over 4 | ||||
| 405 | |||||
| 406 | =item Arguments: $group, $field, $accessor | ||||
| 407 | |||||
| 408 | Returns: \&accessor_coderef ? | ||||
| 409 | |||||
| 410 | =back | ||||
| 411 | |||||
| 412 | Called by mk_group_ro_accessors for each entry in @fieldspec. Either returns | ||||
| 413 | a coderef which will be installed at C<&__PACKAGE__::$accessor>, or returns | ||||
| 414 | C<undef> if it elects to install the coderef on its own. | ||||
| 415 | |||||
| 416 | =cut | ||||
| 417 | |||||
| 418 | sub make_group_ro_accessor { $gen_accessor->('ro', @_) } | ||||
| 419 | |||||
| 420 | =head2 make_group_wo_accessor | ||||
| 421 | |||||
| 422 | __PACKAGE__->make_group_wo_accessor('simple', 'lie', 'lie'); | ||||
| 423 | __PACKAGE__->make_group_wo_accessor('simple', 'subj', 'subject'); | ||||
| 424 | |||||
| 425 | =over 4 | ||||
| 426 | |||||
| 427 | =item Arguments: $group, $field, $accessor | ||||
| 428 | |||||
| 429 | Returns: \&accessor_coderef ? | ||||
| 430 | |||||
| 431 | =back | ||||
| 432 | |||||
| 433 | Called by mk_group_wo_accessors for each entry in @fieldspec. Either returns | ||||
| 434 | a coderef which will be installed at C<&__PACKAGE__::$accessor>, or returns | ||||
| 435 | C<undef> if it elects to install the coderef on its own. | ||||
| 436 | |||||
| 437 | =cut | ||||
| 438 | |||||
| 439 | sub make_group_wo_accessor { $gen_accessor->('wo', @_) } | ||||
| 440 | |||||
| 441 | |||||
| 442 | =head1 PERFORMANCE | ||||
| 443 | |||||
| 444 | To provide total flexibility L<Class::Accessor::Grouped> calls methods | ||||
| 445 | internally while performing get/set actions, which makes it noticeably | ||||
| 446 | slower than similar modules. To compensate, this module will automatically | ||||
| 447 | use the insanely fast L<Class::XSAccessor> to generate the C<simple>-group | ||||
| 448 | accessors if this module is available on your system. | ||||
| 449 | |||||
| 450 | =head2 Benchmark | ||||
| 451 | |||||
| 452 | This is the result of a set/get/set loop benchmark on perl 5.12.1 with | ||||
| 453 | thread support, showcasing most popular accessor builders: L<Moose>, L<Mouse>, | ||||
| 454 | L<Moo>, L<CAF|Class::Accessor::Fast>, L<CAF_XS|Class::Accessor::Fast::XS>, | ||||
| 455 | L<XSA|Class::XSAccessor>, and L<CAF_XSA|Class::XSAccessor::Compat>: | ||||
| 456 | |||||
| 457 | Rate CAG moOse CAF moUse moo HANDMADE CAF_XS moUse_XS moo_XS CAF_XSA XSA CAG_XS | ||||
| 458 | CAG 169/s -- -21% -24% -32% -32% -34% -59% -63% -67% -67% -67% -67% | ||||
| 459 | moOse 215/s 27% -- -3% -13% -13% -15% -48% -53% -58% -58% -58% -58% | ||||
| 460 | CAF 222/s 31% 3% -- -10% -10% -13% -46% -52% -57% -57% -57% -57% | ||||
| 461 | moUse 248/s 46% 15% 11% -- -0% -3% -40% -46% -52% -52% -52% -52% | ||||
| 462 | moo 248/s 46% 15% 11% 0% -- -3% -40% -46% -52% -52% -52% -52% | ||||
| 463 | HANDMADE 255/s 50% 18% 14% 3% 3% -- -38% -45% -50% -51% -51% -51% | ||||
| 464 | CAF_XS 411/s 143% 91% 85% 66% 66% 61% -- -11% -20% -20% -21% -21% | ||||
| 465 | moUse_XS 461/s 172% 114% 107% 86% 86% 81% 12% -- -10% -11% -11% -11% | ||||
| 466 | moo_XS 514/s 204% 139% 131% 107% 107% 102% 25% 12% -- -0% -1% -1% | ||||
| 467 | CAF_XSA 516/s 205% 140% 132% 108% 108% 103% 26% 12% 0% -- -0% -0% | ||||
| 468 | XSA 519/s 206% 141% 133% 109% 109% 104% 26% 13% 1% 0% -- -0% | ||||
| 469 | CAG_XS 519/s 206% 141% 133% 109% 109% 104% 26% 13% 1% 0% 0% -- | ||||
| 470 | |||||
| 471 | Benchmark program is available in the root of the | ||||
| 472 | L<repository|http://search.cpan.org/dist/Class-Accessor-Grouped/>: | ||||
| 473 | |||||
| 474 | =head2 Notes on Class::XSAccessor | ||||
| 475 | |||||
| 476 | You can force (or disable) the use of L<Class::XSAccessor> before creating a | ||||
| 477 | particular C<simple> accessor by either manipulating the global variable | ||||
| 478 | C<$Class::Accessor::Grouped::USE_XS> to true or false (preferably with | ||||
| 479 | L<localization|perlfunc/local>, or you can do so before runtime via the | ||||
| 480 | C<CAG_USE_XS> environment variable. | ||||
| 481 | |||||
| 482 | Since L<Class::XSAccessor> has no knowledge of L</get_simple> and | ||||
| 483 | L</set_simple> this module does its best to detect if you are overriding | ||||
| 484 | one of these methods and will fall back to using the perl version of the | ||||
| 485 | accessor in order to maintain consistency. However be aware that if you | ||||
| 486 | enable use of C<Class::XSAccessor> (automatically or explicitly), create | ||||
| 487 | an object, invoke a simple accessor on that object, and B<then> manipulate | ||||
| 488 | the symbol table to install a C<get/set_simple> override - you get to keep | ||||
| 489 | all the pieces. | ||||
| 490 | |||||
| 491 | =head1 AUTHORS | ||||
| 492 | |||||
| 493 | Matt S. Trout <mst@shadowcatsystems.co.uk> | ||||
| 494 | |||||
| 495 | Christopher H. Laco <claco@chrislaco.com> | ||||
| 496 | |||||
| 497 | =head1 CONTRIBUTORS | ||||
| 498 | |||||
| 499 | Caelum: Rafael Kitover <rkitover@cpan.org> | ||||
| 500 | |||||
| 501 | frew: Arthur Axel "fREW" Schmidt <frioux@gmail.com> | ||||
| 502 | |||||
| 503 | groditi: Guillermo Roditi <groditi@cpan.org> | ||||
| 504 | |||||
| 505 | Jason Plum <jason.plum@bmmsi.com> | ||||
| 506 | |||||
| 507 | ribasushi: Peter Rabbitson <ribasushi@cpan.org> | ||||
| 508 | |||||
| 509 | |||||
| 510 | =head1 COPYRIGHT & LICENSE | ||||
| 511 | |||||
| 512 | Copyright (c) 2006-2010 Matt S. Trout <mst@shadowcatsystems.co.uk> | ||||
| 513 | |||||
| 514 | This program is free software; you can redistribute it and/or modify | ||||
| 515 | it under the same terms as perl itself. | ||||
| 516 | |||||
| 517 | =cut | ||||
| 518 | |||||
| 519 | ######################################################################## | ||||
| 520 | ######################################################################## | ||||
| 521 | ######################################################################## | ||||
| 522 | # | ||||
| 523 | # Here be many angry dragons | ||||
| 524 | # (all code is in private coderefs since everything inherits CAG) | ||||
| 525 | # | ||||
| 526 | ######################################################################## | ||||
| 527 | ######################################################################## | ||||
| 528 | |||||
| 529 | # spent 1.56ms (667µs+891µs) within Class::Accessor::Grouped::BEGIN@529 which was called:
# once (667µs+891µs) by base::import at line 583 | ||||
| 530 | |||||
| 531 | 10 | 20µs | die "Huh?! No minimum C::XSA version?!\n" | ||
| 532 | unless $__minimum_xsa_version; | ||||
| 533 | |||||
| 534 | local $@; | ||||
| 535 | my $err; | ||||
| 536 | |||||
| 537 | |||||
| 538 | 2 | 2µs | $err = eval { require Sub::Name; 1; } ? undef : do { | ||
| 539 | delete $INC{'Sub/Name.pm'}; # because older perls suck | ||||
| 540 | $@; | ||||
| 541 | }; | ||||
| 542 | *__CAG_ENV__::NO_SUBNAME = $err | ||||
| 543 | ? sub () { $err } | ||||
| 544 | : sub () { 0 } | ||||
| 545 | ; | ||||
| 546 | |||||
| 547 | |||||
| 548 | $err = eval { | ||||
| 549 | require Class::XSAccessor; | ||||
| 550 | 1 | 8µs | Class::XSAccessor->VERSION($__minimum_xsa_version); # spent 8µs making 1 call to UNIVERSAL::VERSION | ||
| 551 | require Sub::Name; | ||||
| 552 | 1; | ||||
| 553 | 4 | 90µs | } ? undef : do { | ||
| 554 | delete $INC{'Sub/Name.pm'}; # because older perls suck | ||||
| 555 | delete $INC{'Class/XSAccessor.pm'}; | ||||
| 556 | $@; | ||||
| 557 | }; | ||||
| 558 | *__CAG_ENV__::NO_CXSA = $err | ||||
| 559 | ? sub () { $err } | ||||
| 560 | : sub () { 0 } | ||||
| 561 | ; | ||||
| 562 | |||||
| 563 | |||||
| 564 | *__CAG_ENV__::BROKEN_GOTO = ($] < '5.008009') | ||||
| 565 | ? sub () { 1 } | ||||
| 566 | : sub () { 0 } | ||||
| 567 | ; | ||||
| 568 | |||||
| 569 | |||||
| 570 | *__CAG_ENV__::UNSTABLE_DOLLARAT = ($] < '5.013002') | ||||
| 571 | ? sub () { 1 } | ||||
| 572 | : sub () { 0 } | ||||
| 573 | ; | ||||
| 574 | |||||
| 575 | |||||
| 576 | *__CAG_ENV__::TRACK_UNDEFER_FAIL = ( | ||||
| 577 | $INC{'Test/Builder.pm'} || $INC{'Test/Builder2.pm'} | ||||
| 578 | and | ||||
| 579 | $0 =~ m|^ x?t / .+ \.t $|x | ||||
| 580 | ) ? sub () { 1 } | ||||
| 581 | : sub () { 0 } | ||||
| 582 | ; | ||||
| 583 | 1 | 523µs | 1 | 1.56ms | } # spent 1.56ms making 1 call to Class::Accessor::Grouped::BEGIN@529 |
| 584 | |||||
| 585 | # Autodetect unless flag supplied | ||||
| 586 | 1 | 200ns | my $xsa_autodetected; | ||
| 587 | 3 | 1µs | if (! defined $USE_XS) { | ||
| 588 | $USE_XS = __CAG_ENV__::NO_CXSA ? 0 : 1; | ||||
| 589 | $xsa_autodetected++; | ||||
| 590 | } | ||||
| 591 | |||||
| 592 | my $maker_templates = { | ||||
| 593 | rw => { | ||||
| 594 | xs_call => 'accessors', | ||||
| 595 | # spent 1.27ms (1.16+108µs) within Class::Accessor::Grouped::__ANON__[/2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/Class/Accessor/Grouped.pm:606] which was called 179 times, avg 7µs/call:
# 179 times (1.16ms+108µs) by Class::Accessor::Grouped::__ANON__[/2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/Class/Accessor/Grouped.pm:810] at line 803, avg 7µs/call | ||||
| 596 | 895 | 1.48ms | my $set = "set_$_[0]"; | ||
| 597 | my $get = "get_$_[0]"; | ||||
| 598 | my $field = $_[1]; | ||||
| 599 | 179 | 108µs | $field =~ s/'/\\'/g; # spent 108µs making 179 calls to Class::Accessor::Grouped::CORE:subst, avg 605ns/call | ||
| 600 | |||||
| 601 | " | ||||
| 602 | \@_ != 1 | ||||
| 603 | ? shift->$set('$field', \@_) | ||||
| 604 | : shift->$get('$field') | ||||
| 605 | " | ||||
| 606 | }, | ||||
| 607 | }, | ||||
| 608 | ro => { | ||||
| 609 | xs_call => 'getters', | ||||
| 610 | pp_code => sub { | ||||
| 611 | my $get = "get_$_[0]"; | ||||
| 612 | my $field = $_[1]; | ||||
| 613 | $field =~ s/'/\\'/g; | ||||
| 614 | |||||
| 615 | " | ||||
| 616 | \@_ == 1 | ||||
| 617 | ? shift->$get('$field') | ||||
| 618 | : do { | ||||
| 619 | my \$caller = caller; | ||||
| 620 | my \$class = ref \$_[0] || \$_[0]; | ||||
| 621 | Carp::croak(\"'\$caller' cannot alter the value of '$field' \". | ||||
| 622 | \"(read-only attributes of class '\$class')\"); | ||||
| 623 | } | ||||
| 624 | " | ||||
| 625 | }, | ||||
| 626 | }, | ||||
| 627 | wo => { | ||||
| 628 | xs_call => 'setters', | ||||
| 629 | pp_code => sub { | ||||
| 630 | my $set = "set_$_[0]"; | ||||
| 631 | my $field = $_[1]; | ||||
| 632 | $field =~ s/'/\\'/g; | ||||
| 633 | |||||
| 634 | " | ||||
| 635 | \@_ != 1 | ||||
| 636 | ? shift->$set('$field', \@_) | ||||
| 637 | : do { | ||||
| 638 | my \$caller = caller; | ||||
| 639 | my \$class = ref \$_[0] || \$_[0]; | ||||
| 640 | Carp::croak(\"'\$caller' cannot access the value of '$field' \". | ||||
| 641 | \"(write-only attributes of class '\$class')\"); | ||||
| 642 | } | ||||
| 643 | " | ||||
| 644 | }, | ||||
| 645 | }, | ||||
| 646 | 1 | 10µs | }; | ||
| 647 | |||||
| 648 | |||||
| 649 | 1 | 400ns | my ($accessor_maker_cache, $no_xsa_warned_classes); | ||
| 650 | |||||
| 651 | # can't use pkg_gen to track this stuff, as it doesn't | ||||
| 652 | # detect superclass mucking | ||||
| 653 | 1 | 10µs | 1 | 2µs | my $original_simple_getter = __PACKAGE__->can ('get_simple'); # spent 2µs making 1 call to UNIVERSAL::can |
| 654 | 1 | 4µs | 1 | 1µs | my $original_simple_setter = __PACKAGE__->can ('set_simple'); # spent 1µs making 1 call to UNIVERSAL::can |
| 655 | |||||
| 656 | # Note!!! Unusual signature | ||||
| 657 | # spent 24.1ms (20.1+4.05) within Class::Accessor::Grouped::__ANON__[/2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/Class/Accessor/Grouped.pm:810] which was called 822 times, avg 29µs/call:
# 822 times (20.1ms+4.05ms) by Class::Accessor::Grouped::make_group_accessor at line 397, avg 29µs/call | ||||
| 658 | 2466 | 4.66ms | my ($type, $class, $group, $field, $methname) = @_; | ||
| 659 | 822 | 402µs | if (my $c = Scalar::Util::blessed( $class )) { # spent 402µs making 822 calls to Scalar::Util::blessed, avg 488ns/call | ||
| 660 | $class = $c; | ||||
| 661 | } | ||||
| 662 | |||||
| 663 | # When installing an XSA simple accessor, we need to make sure we are not | ||||
| 664 | # short-circuiting a (compile or runtime) get_simple/set_simple override. | ||||
| 665 | # What we do here is install a lazy first-access check, which will decide | ||||
| 666 | # the ultimate coderef being placed in the accessor slot | ||||
| 667 | # | ||||
| 668 | # Also note that the *original* class will always retain this shim, as | ||||
| 669 | # different branches inheriting from it may have different overrides. | ||||
| 670 | # Thus the final method (properly labeled and all) is installed in the | ||||
| 671 | # calling-package's namespace | ||||
| 672 | 1214 | 2.70ms | if ($USE_XS and $group eq 'simple') { | ||
| 673 | die sprintf( "Class::XSAccessor requested but not available:\n%s\n", __CAG_ENV__::NO_CXSA ) | ||||
| 674 | if __CAG_ENV__::NO_CXSA; | ||||
| 675 | |||||
| 676 | my ($expected_cref, $cached_implementation); | ||||
| 677 | my $ret = $expected_cref = sub { | ||||
| 678 | 362 | 1.18ms | 78 | 60µs | my $current_class = Scalar::Util::blessed( $_[0] ) || $_[0]; # spent 60µs making 78 calls to Scalar::Util::blessed, avg 773ns/call |
| 679 | |||||
| 680 | # $cached_implementation will be set only if the shim got | ||||
| 681 | # 'around'ed, in which case it is handy to avoid re-running | ||||
| 682 | # this block over and over again | ||||
| 683 | 36 | 453µs | my $resolved_implementation = $cached_implementation->{$current_class} || do { | ||
| 684 | 72 | 397µs | 72 | 202µs | if ( # spent 202µs making 72 calls to UNIVERSAL::can, avg 3µs/call |
| 685 | ($current_class->can('get_simple')||0) == $original_simple_getter | ||||
| 686 | && | ||||
| 687 | ($current_class->can('set_simple')||0) == $original_simple_setter | ||||
| 688 | ) { | ||||
| 689 | # nothing has changed, might as well use the XS crefs | ||||
| 690 | # | ||||
| 691 | # note that by the time this code executes, we already have | ||||
| 692 | # *objects* (since XSA works on 'simple' only by definition). | ||||
| 693 | # If someone is mucking with the symbol table *after* there | ||||
| 694 | # are some objects already - look! many, shiny pieces! :) | ||||
| 695 | # | ||||
| 696 | # The weird breeder thingy is because XSA does not have an | ||||
| 697 | # interface returning *just* a coderef, without installing it | ||||
| 698 | # anywhere :( | ||||
| 699 | 36 | 3.36ms | Class::XSAccessor->import( # spent 3.36ms making 36 calls to Class::XSAccessor::import, avg 93µs/call | ||
| 700 | replace => 1, | ||||
| 701 | class => '__CAG__XSA__BREEDER__', | ||||
| 702 | $maker_templates->{$type}{xs_call} => { | ||||
| 703 | $methname => $field, | ||||
| 704 | }, | ||||
| 705 | ); | ||||
| 706 | 36 | 47µs | __CAG__XSA__BREEDER__->can($methname); # spent 47µs making 36 calls to UNIVERSAL::can, avg 1µs/call | ||
| 707 | } | ||||
| 708 | else { | ||||
| 709 | if (! $xsa_autodetected and ! $no_xsa_warned_classes->{$current_class}++) { | ||||
| 710 | # not using Carp since the line where this happens doesn't mean much | ||||
| 711 | warn 'Explicitly requested use of Class::XSAccessor disabled for objects of class ' | ||||
| 712 | . "'$current_class' inheriting from '$class' due to an overriden get_simple and/or " | ||||
| 713 | . "set_simple\n"; | ||||
| 714 | } | ||||
| 715 | |||||
| 716 | do { | ||||
| 717 | # that's faster than local | ||||
| 718 | $USE_XS = 0; | ||||
| 719 | my $c = $gen_accessor->($type, $class, 'simple', $field, $methname); | ||||
| 720 | $USE_XS = 1; | ||||
| 721 | $c; | ||||
| 722 | }; | ||||
| 723 | } | ||||
| 724 | }; | ||||
| 725 | |||||
| 726 | # if after this shim was created someone wrapped it with an 'around', | ||||
| 727 | # we can not blindly reinstall the method slot - we will destroy the | ||||
| 728 | # wrapper. Silently chain execution further... | ||||
| 729 | 138 | 293µs | 78 | 116µs | if ( !$expected_cref or $expected_cref != ($current_class->can($methname)||0) ) { # spent 116µs making 78 calls to UNIVERSAL::can, avg 1µs/call |
| 730 | |||||
| 731 | # there is no point in re-determining it on every subsequent call, | ||||
| 732 | # just store for future reference | ||||
| 733 | $cached_implementation->{$current_class} ||= $resolved_implementation; | ||||
| 734 | |||||
| 735 | # older perls segfault if the cref behind the goto throws | ||||
| 736 | # http://rt.perl.org/rt3/Public/Bug/Display.html?id=35878 | ||||
| 737 | return $resolved_implementation->(@_) if __CAG_ENV__::BROKEN_GOTO; | ||||
| 738 | |||||
| 739 | 46 | 20µs | goto $resolved_implementation; # spent 11µs making 32 calls to __CAG__XSA__BREEDER__::_columns, avg 359ns/call
# spent 4µs making 6 calls to __CAG__XSA__BREEDER__::source_name, avg 583ns/call
# spent 3µs making 4 calls to __CAG__XSA__BREEDER__::name, avg 675ns/call
# spent 2µs making 4 calls to __CAG__XSA__BREEDER__::_ordered_columns, avg 550ns/call | ||
| 740 | } | ||||
| 741 | |||||
| 742 | if (__CAG_ENV__::TRACK_UNDEFER_FAIL) { | ||||
| 743 | my $deferred_calls_seen = do { | ||||
| 744 | 3 | 88µs | 2 | 44µs | # spent 28µs (12+16) within Class::Accessor::Grouped::BEGIN@744 which was called:
# once (12µs+16µs) by base::import at line 744 # spent 28µs making 1 call to Class::Accessor::Grouped::BEGIN@744
# spent 16µs making 1 call to strict::unimport |
| 745 | \%{"${current_class}::__cag_deferred_xs_shim_invocations"} | ||||
| 746 | }; | ||||
| 747 | my @cframe = caller(0); | ||||
| 748 | if (my $already_seen = $deferred_calls_seen->{$cframe[3]}) { | ||||
| 749 | Carp::carp ( | ||||
| 750 | "Deferred version of method $cframe[3] invoked more than once (originally " | ||||
| 751 | . "invoked at $already_seen). This is a strong indication your code has " | ||||
| 752 | . 'cached the original ->can derived method coderef, and is using it instead ' | ||||
| 753 | . 'of the proper method re-lookup, causing performance regressions' | ||||
| 754 | ); | ||||
| 755 | } | ||||
| 756 | else { | ||||
| 757 | $deferred_calls_seen->{$cframe[3]} = "$cframe[1] line $cframe[2]"; | ||||
| 758 | } | ||||
| 759 | } | ||||
| 760 | |||||
| 761 | # install the resolved implementation into the code slot so we do not | ||||
| 762 | # come here anymore (hopefully) | ||||
| 763 | # since XSAccessor was available - so is Sub::Name | ||||
| 764 | { | ||||
| 765 | 3 | 19µs | 2 | 22µs | # spent 14µs (7+8) within Class::Accessor::Grouped::BEGIN@765 which was called:
# once (7µs+8µs) by base::import at line 765 # spent 14µs making 1 call to Class::Accessor::Grouped::BEGIN@765
# spent 8µs making 1 call to strict::unimport |
| 766 | 3 | 113µs | 2 | 35µs | # spent 21µs (7+14) within Class::Accessor::Grouped::BEGIN@766 which was called:
# once (7µs+14µs) by base::import at line 766 # spent 21µs making 1 call to Class::Accessor::Grouped::BEGIN@766
# spent 14µs making 1 call to warnings::unimport |
| 767 | |||||
| 768 | 128 | 570µs | my $fq_name = "${current_class}::${methname}"; | ||
| 769 | 32 | 113µs | *$fq_name = Sub::Name::subname($fq_name, $resolved_implementation); # spent 113µs making 32 calls to Sub::Name::subname, avg 4µs/call | ||
| 770 | |||||
| 771 | # need to update what the shim expects too *in case* its | ||||
| 772 | # ->can was cached for some moronic reason | ||||
| 773 | $expected_cref = $resolved_implementation; | ||||
| 774 | 32 | 48µs | Scalar::Util::weaken($expected_cref); # spent 48µs making 32 calls to Scalar::Util::weaken, avg 2µs/call | ||
| 775 | } | ||||
| 776 | |||||
| 777 | # older perls segfault if the cref behind the goto throws | ||||
| 778 | # http://rt.perl.org/rt3/Public/Bug/Display.html?id=35878 | ||||
| 779 | return $resolved_implementation->(@_) if __CAG_ENV__::BROKEN_GOTO; | ||||
| 780 | |||||
| 781 | 32 | 17µs | goto $resolved_implementation; # spent 2µs making 1 call to DBIx::Class::ResultSet::result_source
# spent 700ns making 1 call to DBIx::Class::ResultSource::Table::name
# spent 600ns making 1 call to DBIx::Class::ResultSource::Table::_primaries
# spent 600ns making 1 call to DBIx::Class::Storage::DBI::schema
# spent 500ns making 1 call to DBIx::Class::ResultSet::_result_class
# spent 500ns making 1 call to DBIx::Class::ResultSource::Table::_columns
# spent 500ns making 1 call to DBIx::Class::ResultSource::Table::_ordered_columns
# spent 500ns making 1 call to DBIx::Class::ResultSource::Table::source_name
# spent 500ns making 1 call to DBIx::Class::ResultSource::View::view_definition
# spent 500ns making 1 call to DBIx::Class::SQLMaker::SQLite::limit_dialect
# spent 500ns making 1 call to DBIx::Class::Storage::DBI::Cursor::sth
# spent 500ns making 1 call to DBIx::Class::Storage::DBI::SQLite::_conn_pid
# spent 500ns making 1 call to DBIx::Class::Storage::DBI::SQLite::_dbh_autocommit
# spent 500ns making 1 call to DBIx::Class::Storage::DBI::SQLite::debug
# spent 500ns making 1 call to DBIx::Class::Storage::DBI::SQLite::disable_sth_caching
# spent 500ns making 1 call to DBIx::Class::Storage::DBI::SQLite::on_connect_do
# spent 500ns making 1 call to DBIx::Class::Storage::DBI::SQLite::transaction_depth
# spent 500ns making 1 call to DBIx::Class::Storage::DBI::SQLite::unsafe
# spent 500ns making 1 call to DBIx::Class::Storage::DBI::_connect_info
# spent 500ns making 1 call to DBIx::Class::Storage::DBI::_dbh
# spent 500ns making 1 call to DBIx::Class::Storage::DBI::_dbh_details
# spent 500ns making 1 call to DBIx::Class::Storage::DBI::_dbi_connect_info
# spent 500ns making 1 call to DBIx::Class::Storage::DBI::_dbic_connect_attributes
# spent 500ns making 1 call to DBIx::Class::Storage::DBI::_driver_determined
# spent 500ns making 1 call to DBIx::Class::Storage::DBI::_sql_maker_opts
# spent 400ns making 1 call to DBIx::Class::ResultSource::Table::_relationships
# spent 400ns making 1 call to DBIx::Class::ResultSource::Table::_unique_constraints
# spent 400ns making 1 call to DBIx::Class::ResultSource::Table::resultset_attributes
# spent 400ns making 1 call to DBIx::Class::ResultSource::View::is_virtual
# spent 400ns making 1 call to DBIx::Class::Storage::DBI::SQLite::on_connect_call
# spent 400ns making 1 call to DBIx::Class::Storage::DBI::_sql_maker
# spent 300ns making 1 call to DBIx::Class::SQLMaker::SQLite::name_sep | ||
| 782 | }; | ||||
| 783 | |||||
| 784 | 98 | 93µs | Scalar::Util::weaken($expected_cref); # to break the self-reference # spent 93µs making 98 calls to Scalar::Util::weaken, avg 952ns/call | ||
| 785 | $ret; | ||||
| 786 | } | ||||
| 787 | |||||
| 788 | # no Sub::Name - just install the coderefs directly (compiling every time) | ||||
| 789 | elsif (__CAG_ENV__::NO_SUBNAME) { | ||||
| 790 | my $src = $accessor_maker_cache->{source}{$type}{$group}{$field} ||= | ||||
| 791 | $maker_templates->{$type}{pp_code}->($group, $field); | ||||
| 792 | |||||
| 793 | 3 | 122µs | 2 | 23µs | # spent 15µs (7+8) within Class::Accessor::Grouped::BEGIN@793 which was called:
# once (7µs+8µs) by base::import at line 793 # spent 15µs making 1 call to Class::Accessor::Grouped::BEGIN@793
# spent 8µs making 1 call to warnings::unimport |
| 794 | local $@ if __CAG_ENV__::UNSTABLE_DOLLARAT; | ||||
| 795 | eval "sub ${class}::${methname} { $src }"; | ||||
| 796 | |||||
| 797 | undef; # so that no further attempt will be made to install anything | ||||
| 798 | } | ||||
| 799 | |||||
| 800 | # a coderef generator with a variable pad (returns a fresh cref on every invocation) | ||||
| 801 | else { | ||||
| 802 | 537 | 11.9ms | 724 | 2.28ms | ($accessor_maker_cache->{pp}{$type}{$group}{$field} ||= do { # spent 264µs making 74 calls to Class::Accessor::Grouped::__ANON__[(eval 300)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call
# spent 192µs making 52 calls to Class::Accessor::Grouped::__ANON__[(eval 301)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call
# spent 114µs making 20 calls to Class::Accessor::Grouped::__ANON__[(eval 358)[Class/Accessor/Grouped.pm:807]:5], avg 6µs/call
# spent 110µs making 32 calls to Class::Accessor::Grouped::__ANON__[(eval 309)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 96µs making 28 calls to Class::Accessor::Grouped::__ANON__[(eval 367)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 92µs making 30 calls to Class::Accessor::Grouped::__ANON__[(eval 310)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 89µs making 28 calls to Class::Accessor::Grouped::__ANON__[(eval 366)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 68µs making 18 calls to Class::Accessor::Grouped::__ANON__[(eval 302)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call
# spent 53µs making 14 calls to Class::Accessor::Grouped::__ANON__[(eval 1305)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call
# spent 33µs making 8 calls to Class::Accessor::Grouped::__ANON__[(eval 304)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call
# spent 29µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1376)[Class/Accessor/Grouped.pm:807]:5], avg 7µs/call
# spent 27µs making 6 calls to Class::Accessor::Grouped::__ANON__[(eval 1297)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call
# spent 25µs making 8 calls to Class::Accessor::Grouped::__ANON__[(eval 374)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 25µs making 8 calls to Class::Accessor::Grouped::__ANON__[(eval 357)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 23µs making 8 calls to Class::Accessor::Grouped::__ANON__[(eval 394)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 20µs making 6 calls to Class::Accessor::Grouped::__ANON__[(eval 397)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 16µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 353)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call
# spent 16µs making 6 calls to Class::Accessor::Grouped::__ANON__[(eval 1298)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 15µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 359)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call
# spent 15µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 303)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call
# spent 15µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 364)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call
# spent 14µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1373)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call
# spent 14µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1324)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 14µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1370)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 14µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 383)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 14µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1311)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 13µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 391)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 12µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1368)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 12µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1314)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 12µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1312)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 12µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 386)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1365)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1366)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 360)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 385)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 392)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1315)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1375)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 365)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1371)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1374)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1316)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1372)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1369)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 10µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 384)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 10µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1328)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 10µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1340)[Class/Accessor/Grouped.pm:807]:5], avg 5µs/call
# spent 10µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1357)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 10µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1385)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 9µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1341)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 8µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1394)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 272)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 295)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1310)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 356)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1404)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1307)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 334)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 354)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1363)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1318)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1390)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1391)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1392)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1400)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 348)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1336)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1342)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1348)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1364)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 332)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 336)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 297)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1304)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1332)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1335)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1355)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1360)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1367)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1397)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1402)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 373)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1344)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1356)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 338)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1352)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 287)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1326)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1378)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 298)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 344)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1306)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1358)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 345)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 396)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1393)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1395)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 362)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 375)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1317)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1384)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1398)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1403)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1405)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 299)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 349)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 355)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 368)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 370)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 371)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 379)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 380)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1299)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1320)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1321)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1322)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1325)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1327)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1329)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1330)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1331)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1333)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1345)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1354)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1359)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1383)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1396)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 363)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 369)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 382)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 393)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 395)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1337)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1339)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1362)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1377)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1379)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 333)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 337)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1399)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 296)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 347)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1308)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1309)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1319)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1323)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1334)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1343)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1346)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1349)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1350)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1353)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1381)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1401)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 307)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 308)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 335)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 376)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 387)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 389)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1338)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1380)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1351)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 305)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 306)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 351)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1347)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 352)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 378)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 388)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 398)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
# spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 381)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call |
| 803 | 179 | 1.27ms | my $src = $accessor_maker_cache->{source}{$type}{$group}{$field} ||= # spent 1.27ms making 179 calls to Class::Accessor::Grouped::__ANON__[Class/Accessor/Grouped.pm:606], avg 7µs/call | ||
| 804 | $maker_templates->{$type}{pp_code}->($group, $field); | ||||
| 805 | |||||
| 806 | local $@ if __CAG_ENV__::UNSTABLE_DOLLARAT; | ||||
| 807 | eval "sub { my \$dummy; sub { \$dummy if 0; $src } }" or die $@; # spent 105ms executing statements in string eval # includes 264µs spent executing 74 calls to 1 sub defined therein. # spent 90.8ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 69.6ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 65.3ms executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 42.1ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 40.4ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 32.3ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 26.5ms executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 20.7ms executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 16.7ms executing statements in string eval # includes 192µs spent executing 52 calls to 1 sub defined therein. # spent 9.89ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 9.12ms executing statements in string eval # includes 114µs spent executing 20 calls to 1 sub defined therein. # spent 6.88ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 4.86ms executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 3.41ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 2.61ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 2.57ms executing statements in string eval # includes 15µs spent executing 4 calls to 1 sub defined therein. # spent 1.83ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 1.70ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 1.56ms executing statements in string eval # includes 33µs spent executing 8 calls to 1 sub defined therein. # spent 1.27ms executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 973µs executing statements in string eval # includes 15µs spent executing 4 calls to 1 sub defined therein. # spent 766µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 694µs executing statements in 2 string evals (merged) # includes 10µs spent executing 4 calls to 1 sub defined therein. # spent 681µs executing statements in string eval # includes 16µs spent executing 4 calls to 1 sub defined therein. # spent 617µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 568µs executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 194µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 160µs executing statements in string eval # includes 110µs spent executing 32 calls to 1 sub defined therein. # spent 138µs executing statements in string eval # includes 96µs spent executing 28 calls to 1 sub defined therein. # spent 135µs executing statements in string eval # includes 89µs spent executing 28 calls to 1 sub defined therein. # spent 134µs executing statements in string eval # includes 92µs spent executing 30 calls to 1 sub defined therein. # spent 134µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 99µs executing statements in string eval # includes 8µs spent executing 2 calls to 1 sub defined therein. # spent 95µs executing statements in string eval # includes 68µs spent executing 18 calls to 1 sub defined therein. # spent 76µs executing statements in string eval # includes 53µs spent executing 14 calls to 1 sub defined therein. # spent 61µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 60µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 50µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 42µs executing statements in string eval # includes 27µs spent executing 6 calls to 1 sub defined therein. # spent 42µs executing statements in string eval # includes 29µs spent executing 4 calls to 1 sub defined therein. # spent 41µs executing statements in string eval # includes 25µs spent executing 8 calls to 1 sub defined therein. # spent 40µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 40µs executing statements in string eval # includes 23µs spent executing 8 calls to 1 sub defined therein. # spent 39µs executing statements in string eval # includes 25µs spent executing 8 calls to 1 sub defined therein. # spent 38µs executing statements in 3 string evals (merged) # includes 16µs spent executing 6 calls to 1 sub defined therein. # spent 35µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 35µs executing statements in string eval # includes 20µs spent executing 6 calls to 1 sub defined therein. # spent 34µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 33µs executing statements in 2 string evals (merged) # includes 10µs spent executing 4 calls to 1 sub defined therein. # spent 32µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 30µs executing statements in 2 string evals (merged) # includes 14µs spent executing 4 calls to 1 sub defined therein. # spent 29µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 25µs executing statements in string eval # includes 14µs spent executing 4 calls to 1 sub defined therein. # spent 25µs executing statements in 2 string evals (merged) # includes 10µs spent executing 4 calls to 1 sub defined therein. # spent 25µs executing statements in string eval # includes 15µs spent executing 4 calls to 1 sub defined therein. # spent 25µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 24µs executing statements in string eval # includes 14µs spent executing 4 calls to 1 sub defined therein. # spent 23µs executing statements in string eval # includes 14µs spent executing 4 calls to 1 sub defined therein. # spent 23µs executing statements in string eval # includes 12µs spent executing 4 calls to 1 sub defined therein. # spent 23µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 23µs executing statements in string eval # includes 13µs spent executing 4 calls to 1 sub defined therein. # spent 23µs executing statements in string eval # includes 14µs spent executing 4 calls to 1 sub defined therein. # spent 22µs executing statements in 2 string evals (merged) # includes 9µs spent executing 4 calls to 1 sub defined therein. # spent 22µs executing statements in string eval # includes 12µs spent executing 4 calls to 1 sub defined therein. # spent 22µs executing statements in string eval # includes 12µs spent executing 4 calls to 1 sub defined therein. # spent 21µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 21µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 21µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 21µs executing statements in string eval # includes 12µs spent executing 4 calls to 1 sub defined therein. # spent 21µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 21µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 20µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 20µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 20µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 20µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 20µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 20µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 20µs executing statements in string eval # includes 10µs spent executing 4 calls to 1 sub defined therein. # spent 19µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 18µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 18µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 17µs executing statements in string eval # includes 10µs spent executing 2 calls to 1 sub defined therein. # spent 17µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 17µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 16µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 15µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 15µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 14µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 14µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 14µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 14µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 14µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 14µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. | ||||
| 808 | })->() | ||||
| 809 | } | ||||
| 810 | 1 | 3µs | }; | ||
| 811 | |||||
| 812 | 1 | 11µs | 1; | ||
# spent 2µs within Class::Accessor::Grouped::CORE:match which was called:
# once (2µs+0s) by base::import at line 17 | |||||
# spent 108µs within Class::Accessor::Grouped::CORE:subst which was called 179 times, avg 605ns/call:
# 179 times (108µs+0s) by Class::Accessor::Grouped::__ANON__[/2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/Class/Accessor/Grouped.pm:606] at line 599, avg 605ns/call |