← Index
NYTProf Performance Profile   « line view »
For starman worker -M FindBin --max-requests 50 --workers 2 --user=kohadev-koha --group kohadev-koha --pid /var/run/koha/kohadev/plack.pid --daemonize --access-log /var/log/koha/kohadev/plack.log --error-log /var/log/koha/kohadev/plack-error.log -E deployment --socket /var/run/koha/kohadev/plack.sock /etc/koha/sites/kohadev/plack.psgi
  Run on Fri Jan 8 14:31:06 2016
Reported on Fri Jan 8 14:31:36 2016

Filename/usr/share/perl5/Class/Accessor/Grouped.pm
StatementsExecuted 81435 statements in 393ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
92711402ms455msClass::Accessor::Grouped::::__ANON__[:774] Class::Accessor::Grouped::__ANON__[:774]
19221179.0ms674msClass::Accessor::Grouped::::_mk_group_accessors Class::Accessor::Grouped::_mk_group_accessors
39441156.3ms534msClass::Accessor::Grouped::::__ANON__[:942] Class::Accessor::Grouped::__ANON__[:942]
41752230.1ms34.6msClass::Accessor::Grouped::::get_inherited Class::Accessor::Grouped::get_inherited
39441124.6ms558msClass::Accessor::Grouped::::make_group_accessor Class::Accessor::Grouped::make_group_accessor
1922201118.2ms692msClass::Accessor::Grouped::::mk_group_accessors Class::Accessor::Grouped::mk_group_accessors
927117.04ms8.86msClass::Accessor::Grouped::::__ANON__[:708] Class::Accessor::Grouped::__ANON__[:708]
3945315.47ms5.47msClass::Accessor::Grouped::::CORE:match Class::Accessor::Grouped::CORE:match (opcode)
268112.64ms3.56msClass::Accessor::Grouped::::get_super_paths Class::Accessor::Grouped::get_super_paths
720442.35ms2.47msClass::Accessor::Grouped::::set_inherited Class::Accessor::Grouped::set_inherited
927111.82ms1.82ms__CAG_ENV__::::perlstring __CAG_ENV__::perlstring
11171µs273µsDBIx::Class::SQLMaker::::name_sep DBIx::Class::SQLMaker::name_sep
11159µs2.04msClass::Accessor::Grouped::::BEGIN@31 Class::Accessor::Grouped::BEGIN@31
11153µs166µsDBIx::Class::Storage::DBI::::disable_sth_caching DBIx::Class::Storage::DBI::disable_sth_caching
33252µs163µsDBIx::Class::Storage::DBI::::_dbh_autocommit DBIx::Class::Storage::DBI::_dbh_autocommit
11151µs168µsDBIx::Class::ResultSource::::source_name DBIx::Class::ResultSource::source_name
54250µs162µsDBIx::Class::ResultSet::::_result_class DBIx::Class::ResultSet::_result_class
11148µs190µsDBIx::Class::ResultSource::::name DBIx::Class::ResultSource::name
11146µs152µsDBIx::Class::Storage::DBI::::on_connect_call DBIx::Class::Storage::DBI::on_connect_call
1110345µs111µsDBIx::Class::ResultSet::::result_source DBIx::Class::ResultSet::result_source
11144µs146µsDBIx::Class::Storage::::debug DBIx::Class::Storage::debug
11143µs162µsDBIx::Class::Storage::::schema DBIx::Class::Storage::schema
22242µs149µsDBIx::Class::Storage::DBI::Cursor::::storageDBIx::Class::Storage::DBI::Cursor::storage
11142µs137µsDBIx::Class::ResultSource::::_primaries DBIx::Class::ResultSource::_primaries
33239µs107µsDBIx::Class::Storage::DBI::::_conn_pid DBIx::Class::Storage::DBI::_conn_pid
11139µs125µsDBIx::Class::ResultSource::::_relationships DBIx::Class::ResultSource::_relationships
1513338µs101µsDBIx::Class::Storage::DBI::::_dbh DBIx::Class::Storage::DBI::_dbh
11138µs140µsDBIx::Class::Row::::in_storage DBIx::Class::Row::in_storage
22236µs98µsDBIx::Class::Storage::DBI::::_dbic_connect_attributes DBIx::Class::Storage::DBI::_dbic_connect_attributes
33234µs97µsDBIx::Class::Storage::DBI::::_driver_determined DBIx::Class::Storage::DBI::_driver_determined
66233µs92µsDBIx::Class::Storage::DBI::::_dbh_details DBIx::Class::Storage::DBI::_dbh_details
11132µs100µsDBIx::Class::ResultSource::::_ordered_columns DBIx::Class::ResultSource::_ordered_columns
11132µs97µsDBIx::Class::Storage::::transaction_depth DBIx::Class::Storage::transaction_depth
33231µs106µsDBIx::Class::Storage::DBI::::_connect_info DBIx::Class::Storage::DBI::_connect_info
33231µs103µsDBIx::Class::Storage::DBI::::on_connect_do DBIx::Class::Storage::DBI::on_connect_do
44231µs93µsDBIx::Class::Storage::DBI::::_sql_maker_opts DBIx::Class::Storage::DBI::_sql_maker_opts
33230µs90µsDBIx::Class::Storage::DBI::::unsafe DBIx::Class::Storage::DBI::unsafe
11130µs102µsDBIx::Class::ResultSource::::_unique_constraints DBIx::Class::ResultSource::_unique_constraints
11129µs96µsDBIx::Class::ResultSource::::_columns DBIx::Class::ResultSource::_columns
55228µs88µsDBIx::Class::Storage::DBI::::_sql_maker DBIx::Class::Storage::DBI::_sql_maker
11118µs24µsClass::Accessor::Grouped::::BEGIN@2 Class::Accessor::Grouped::BEGIN@2
11113µs19µsClass::Accessor::Grouped::::BEGIN@87 Class::Accessor::Grouped::BEGIN@87
11111µs18µsClass::Accessor::Grouped::::BEGIN@872 Class::Accessor::Grouped::BEGIN@872
11111µs14µsClass::Accessor::Grouped::::BEGIN@3 Class::Accessor::Grouped::BEGIN@3
11110µs18µsClass::Accessor::Grouped::::BEGIN@895 Class::Accessor::Grouped::BEGIN@895
1119µs16µsClass::Accessor::Grouped::::BEGIN@377 Class::Accessor::Grouped::BEGIN@377
1119µs14µsClass::Accessor::Grouped::::BEGIN@418 Class::Accessor::Grouped::BEGIN@418
2219µs9µsDBIx::Class::Storage::DBI::::CORE:match DBIx::Class::Storage::DBI::CORE:match (opcode)
1118µs13µsClass::Accessor::Grouped::::BEGIN@894 Class::Accessor::Grouped::BEGIN@894
1117µs16µsClass::Accessor::Grouped::::BEGIN@88 Class::Accessor::Grouped::BEGIN@88
1117µs16µsClass::Accessor::Grouped::::BEGIN@378 Class::Accessor::Grouped::BEGIN@378
1116µs6µsClass::Accessor::Grouped::::BEGIN@8 Class::Accessor::Grouped::BEGIN@8
1115µs5µsClass::Accessor::Grouped::::BEGIN@5 Class::Accessor::Grouped::BEGIN@5
1114µs4µsClass::Accessor::Grouped::::BEGIN@6 Class::Accessor::Grouped::BEGIN@6
1114µs4µsClass::Accessor::Grouped::::BEGIN@23 Class::Accessor::Grouped::BEGIN@23
1113µs3µsClass::Accessor::Grouped::::BEGIN@4 Class::Accessor::Grouped::BEGIN@4
2211µs1µs__CAG_ENV__::::__ANON__ __CAG_ENV__::__ANON__ (xsub)
111500ns500nsDBIx::Class::Storage::DBI::::schema DBIx::Class::Storage::DBI::schema (xsub)
0000s0sClass::Accessor::Grouped::::CLONE Class::Accessor::Grouped::CLONE
0000s0sClass::Accessor::Grouped::::__ANON__[:728] Class::Accessor::Grouped::__ANON__[:728]
0000s0sClass::Accessor::Grouped::::__ANON__[:748] Class::Accessor::Grouped::__ANON__[:748]
0000s0sClass::Accessor::Grouped::::__ANON__[:914] Class::Accessor::Grouped::__ANON__[:914]
0000s0sClass::Accessor::Grouped::::get_component_class Class::Accessor::Grouped::get_component_class
0000s0sClass::Accessor::Grouped::::get_simple Class::Accessor::Grouped::get_simple
0000s0sClass::Accessor::Grouped::::make_group_ro_accessor Class::Accessor::Grouped::make_group_ro_accessor
0000s0sClass::Accessor::Grouped::::make_group_wo_accessor Class::Accessor::Grouped::make_group_wo_accessor
0000s0sClass::Accessor::Grouped::::mk_group_ro_accessors Class::Accessor::Grouped::mk_group_ro_accessors
0000s0sClass::Accessor::Grouped::::mk_group_wo_accessors Class::Accessor::Grouped::mk_group_wo_accessors
0000s0sClass::Accessor::Grouped::::set_component_class Class::Accessor::Grouped::set_component_class
0000s0sClass::Accessor::Grouped::::set_simple Class::Accessor::Grouped::set_simple
0000s0sDBIx::Class::ResultSet::::__result_class_accessor DBIx::Class::ResultSet::__result_class_accessor
0000s0sDBIx::Class::ResultSet::::_result_source_accessor DBIx::Class::ResultSet::_result_source_accessor
0000s0sDBIx::Class::ResultSource::::__columns_accessor DBIx::Class::ResultSource::__columns_accessor
0000s0sDBIx::Class::ResultSource::::__ordered_columns_accessor DBIx::Class::ResultSource::__ordered_columns_accessor
0000s0sDBIx::Class::ResultSource::::__primaries_accessor DBIx::Class::ResultSource::__primaries_accessor
0000s0sDBIx::Class::ResultSource::::__relationships_accessor DBIx::Class::ResultSource::__relationships_accessor
0000s0sDBIx::Class::ResultSource::::__unique_constraints_accessor DBIx::Class::ResultSource::__unique_constraints_accessor
0000s0sDBIx::Class::ResultSource::::_column_info_from_storage_accessor DBIx::Class::ResultSource::_column_info_from_storage_accessor
0000s0sDBIx::Class::ResultSource::::_name_accessor DBIx::Class::ResultSource::_name_accessor
0000s0sDBIx::Class::ResultSource::::_resultset_attributes_accessor DBIx::Class::ResultSource::_resultset_attributes_accessor
0000s0sDBIx::Class::ResultSource::::_source_info_accessor DBIx::Class::ResultSource::_source_info_accessor
0000s0sDBIx::Class::ResultSource::::_source_name_accessor DBIx::Class::ResultSource::_source_name_accessor
0000s0sDBIx::Class::ResultSource::::column_info_from_storage DBIx::Class::ResultSource::column_info_from_storage
0000s0sDBIx::Class::ResultSource::::resultset_attributes DBIx::Class::ResultSource::resultset_attributes
0000s0sDBIx::Class::ResultSource::::source_info DBIx::Class::ResultSource::source_info
0000s0sDBIx::Class::ResultSourceHandle::::__detached_source_accessor DBIx::Class::ResultSourceHandle::__detached_source_accessor
0000s0sDBIx::Class::ResultSourceHandle::::_detached_source DBIx::Class::ResultSourceHandle::_detached_source
0000s0sDBIx::Class::ResultSourceHandle::::_schema_accessor DBIx::Class::ResultSourceHandle::_schema_accessor
0000s0sDBIx::Class::ResultSourceHandle::::_source_moniker_accessor DBIx::Class::ResultSourceHandle::_source_moniker_accessor
0000s0sDBIx::Class::ResultSourceHandle::::schema DBIx::Class::ResultSourceHandle::schema
0000s0sDBIx::Class::ResultSourceHandle::::source_moniker DBIx::Class::ResultSourceHandle::source_moniker
0000s0sDBIx::Class::Row::::_in_storage_accessor DBIx::Class::Row::_in_storage_accessor
0000s0sDBIx::Class::SQLMaker::::_limit_dialect_accessor DBIx::Class::SQLMaker::_limit_dialect_accessor
0000s0sDBIx::Class::SQLMaker::::_name_sep_accessor DBIx::Class::SQLMaker::_name_sep_accessor
0000s0sDBIx::Class::SQLMaker::::_quote_char_accessor DBIx::Class::SQLMaker::_quote_char_accessor
0000s0sDBIx::Class::SQLMaker::::limit_dialect DBIx::Class::SQLMaker::limit_dialect
0000s0sDBIx::Class::SQLMaker::::quote_char DBIx::Class::SQLMaker::quote_char
0000s0sDBIx::Class::Storage::DBI::Cursor::::_args_accessorDBIx::Class::Storage::DBI::Cursor::_args_accessor
0000s0sDBIx::Class::Storage::DBI::Cursor::::_attrs_accessorDBIx::Class::Storage::DBI::Cursor::_attrs_accessor
0000s0sDBIx::Class::Storage::DBI::Cursor::::_storage_accessorDBIx::Class::Storage::DBI::Cursor::_storage_accessor
0000s0sDBIx::Class::Storage::DBI::Cursor::::argsDBIx::Class::Storage::DBI::Cursor::args
0000s0sDBIx::Class::Storage::DBI::Cursor::::attrsDBIx::Class::Storage::DBI::Cursor::attrs
0000s0sDBIx::Class::Storage::DBI::::__autoinc_supplied_for_op_accessor DBIx::Class::Storage::DBI::__autoinc_supplied_for_op_accessor
0000s0sDBIx::Class::Storage::DBI::::__conn_pid_accessor DBIx::Class::Storage::DBI::__conn_pid_accessor
0000s0sDBIx::Class::Storage::DBI::::__connect_info_accessor DBIx::Class::Storage::DBI::__connect_info_accessor
0000s0sDBIx::Class::Storage::DBI::::__dbh_accessor DBIx::Class::Storage::DBI::__dbh_accessor
0000s0sDBIx::Class::Storage::DBI::::__dbh_autocommit_accessor DBIx::Class::Storage::DBI::__dbh_autocommit_accessor
0000s0sDBIx::Class::Storage::DBI::::__dbh_details_accessor DBIx::Class::Storage::DBI::__dbh_details_accessor
0000s0sDBIx::Class::Storage::DBI::::__dbic_connect_attributes_accessor DBIx::Class::Storage::DBI::__dbic_connect_attributes_accessor
0000s0sDBIx::Class::Storage::DBI::::__driver_determined_accessor DBIx::Class::Storage::DBI::__driver_determined_accessor
0000s0sDBIx::Class::Storage::DBI::::__perform_autoinc_retrieval_accessor DBIx::Class::Storage::DBI::__perform_autoinc_retrieval_accessor
0000s0sDBIx::Class::Storage::DBI::::__sql_maker_accessor DBIx::Class::Storage::DBI::__sql_maker_accessor
0000s0sDBIx::Class::Storage::DBI::::__sql_maker_opts_accessor DBIx::Class::Storage::DBI::__sql_maker_opts_accessor
0000s0sDBIx::Class::Storage::DBI::::_auto_savepoint_accessor DBIx::Class::Storage::DBI::_auto_savepoint_accessor
0000s0sDBIx::Class::Storage::DBI::::_autoinc_supplied_for_op DBIx::Class::Storage::DBI::_autoinc_supplied_for_op
0000s0sDBIx::Class::Storage::DBI::::_disable_sth_caching_accessor DBIx::Class::Storage::DBI::_disable_sth_caching_accessor
0000s0sDBIx::Class::Storage::DBI::::_on_connect_call_accessor DBIx::Class::Storage::DBI::_on_connect_call_accessor
0000s0sDBIx::Class::Storage::DBI::::_on_connect_do_accessor DBIx::Class::Storage::DBI::_on_connect_do_accessor
0000s0sDBIx::Class::Storage::DBI::::_on_disconnect_call_accessor DBIx::Class::Storage::DBI::_on_disconnect_call_accessor
0000s0sDBIx::Class::Storage::DBI::::_on_disconnect_do_accessor DBIx::Class::Storage::DBI::_on_disconnect_do_accessor
0000s0sDBIx::Class::Storage::DBI::::_perform_autoinc_retrieval DBIx::Class::Storage::DBI::_perform_autoinc_retrieval
0000s0sDBIx::Class::Storage::DBI::::_unsafe_accessor DBIx::Class::Storage::DBI::_unsafe_accessor
0000s0sDBIx::Class::Storage::DBI::::auto_savepoint DBIx::Class::Storage::DBI::auto_savepoint
0000s0sDBIx::Class::Storage::DBI::::on_disconnect_call DBIx::Class::Storage::DBI::on_disconnect_call
0000s0sDBIx::Class::Storage::DBI::::on_disconnect_do DBIx::Class::Storage::DBI::on_disconnect_do
0000s0sDBIx::Class::Storage::::_auto_savepoint_accessor DBIx::Class::Storage::_auto_savepoint_accessor
0000s0sDBIx::Class::Storage::::_debug_accessor DBIx::Class::Storage::_debug_accessor
0000s0sDBIx::Class::Storage::::_savepoints_accessor DBIx::Class::Storage::_savepoints_accessor
0000s0sDBIx::Class::Storage::::_schema_accessor DBIx::Class::Storage::_schema_accessor
0000s0sDBIx::Class::Storage::::_transaction_depth_accessor DBIx::Class::Storage::_transaction_depth_accessor
0000s0sDBIx::Class::Storage::::auto_savepoint DBIx::Class::Storage::auto_savepoint
0000s0sDBIx::Class::Storage::::savepoints DBIx::Class::Storage::savepoints
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Class::Accessor::Grouped;
2238µs230µs
# spent 24µs (18+6) within Class::Accessor::Grouped::BEGIN@2 which was called: # once (18µs+6µs) by base::import at line 2
use strict;
# spent 24µs making 1 call to Class::Accessor::Grouped::BEGIN@2 # spent 6µs making 1 call to strict::import
3229µs218µs
# spent 14µs (11+4) within Class::Accessor::Grouped::BEGIN@3 which was called: # once (11µs+4µs) by base::import at line 3
use warnings;
# spent 14µs making 1 call to Class::Accessor::Grouped::BEGIN@3 # spent 4µs making 1 call to warnings::import
4218µs13µs
# spent 3µs within Class::Accessor::Grouped::BEGIN@4 which was called: # once (3µs+0s) by base::import at line 4
use Carp ();
# spent 3µs making 1 call to Class::Accessor::Grouped::BEGIN@4
5224µs15µs
# spent 5µs within Class::Accessor::Grouped::BEGIN@5 which was called: # once (5µs+0s) by base::import at line 5
use Scalar::Util ();
# spent 5µs making 1 call to Class::Accessor::Grouped::BEGIN@5
6266µs14µs
# spent 4µs within Class::Accessor::Grouped::BEGIN@6 which was called: # once (4µs+0s) by base::import at line 6
use Module::Runtime ();
# spent 4µs making 1 call to Class::Accessor::Grouped::BEGIN@6
7
8
# spent 6µs within Class::Accessor::Grouped::BEGIN@8 which was called: # once (6µs+0s) by base::import at line 16
BEGIN {
9 # use M::R to work around the 5.8 require bugs
1016µs if ($] < 5.009_005) {
11 Module::Runtime::require_module('MRO::Compat');
12 }
13 else {
141500ns require mro;
15 }
16172µs16µs}
# spent 6µs making 1 call to Class::Accessor::Grouped::BEGIN@8
17
181600nsour $VERSION = '0.10012';
1919µs12µs$VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases
# spent 2µs making 1 call to Class::Accessor::Grouped::CORE:match
20
21# when changing minimum version don't forget to adjust Makefile.PL as well
221100nsour $__minimum_xsa_version;
231329µs14µs
# spent 4µs within Class::Accessor::Grouped::BEGIN@23 which was called: # once (4µs+0s) by base::import at line 23
BEGIN { $__minimum_xsa_version = '1.19' }
# spent 4µs making 1 call to Class::Accessor::Grouped::BEGIN@23
24
251100nsour $USE_XS;
26# the unless defined is here so that we can override the value
27# before require/use, *regardless* of the state of $ENV{CAG_USE_XS}
2811µs$USE_XS = $ENV{CAG_USE_XS}
29 unless defined $USE_XS;
30
31
# spent 2.04ms (59µs+1.98) within Class::Accessor::Grouped::BEGIN@31 which was called: # once (59µs+1.98ms) by base::import at line 75
BEGIN {
32 package # hide from PAUSE
33 __CAG_ENV__;
34
351200ns die "Huh?! No minimum C::XSA version?!\n"
36 unless $__minimum_xsa_version;
37
381200ns local $@;
391600ns require constant;
40
41 # individual (one const at a time) imports so we are 5.6.2 compatible
42 # if we can - why not ;)
43144µs137µs constant->import( NO_SUBNAME => eval {
# spent 37µs making 1 call to constant::import
44133µs127µs Module::Runtime::require_module('Sub::Name')
# spent 27µs making 1 call to Module::Runtime::require_module
45 } ? 0 : "$@" );
46
471100ns my $found_cxsa;
48137µs227µs constant->import( NO_CXSA => ( NO_SUBNAME() || ( eval {
# spent 26µs making 1 call to constant::import # spent 600ns making 1 call to __CAG_ENV__::__ANON__
491109µs11.85ms Module::Runtime::require_module('Class::XSAccessor');
# spent 1.85ms making 1 call to Module::Runtime::require_module
50116µs18µs $found_cxsa = Class::XSAccessor->VERSION;
# spent 8µs making 1 call to version::vxs::_VERSION
5117µs14µs Class::XSAccessor->VERSION($__minimum_xsa_version);
# spent 4µs making 1 call to version::vxs::_VERSION
52 } ? 0 : "$@" ) ) );
53
5413µs1600ns if (NO_CXSA() and $found_cxsa and !$ENV{CAG_OLD_XS_NOWARN}) {
# spent 600ns making 1 call to __CAG_ENV__::__ANON__
55 warn(
56 'The installed version of Class::XSAccessor is too old '
57 . "(v$found_cxsa < v$__minimum_xsa_version). Please upgrade "
58 . "to instantly quadruple the performance of 'simple' accessors. "
59 . 'Set $ENV{CAG_OLD_XS_NOWARN} if you wish to disable this '
60 . "warning.\n"
61 );
62 }
63
64118µs113µs constant->import( BROKEN_GOTO => ($] < '5.008009') ? 1 : 0 );
# spent 13µs making 1 call to constant::import
65
66113µs110µs constant->import( UNSTABLE_DOLLARAT => ($] < '5.013002') ? 1 : 0 );
# spent 10µs making 1 call to constant::import
67
68117µs19µs constant->import( TRACK_UNDEFER_FAIL => (
# spent 9µs making 1 call to constant::import
69 $INC{'Test/Builder.pm'} || $INC{'Test/Builder2.pm'}
70 and
71 $0 =~ m{ ^ (?: \. \/ )? x?t / .+ \.t $}x
72 ) ? 1 : 0 );
73
749272.97ms
# spent 1.82ms within __CAG_ENV__::perlstring which was called 927 times, avg 2µs/call: # 927 times (1.82ms+0s) by Class::Accessor::Grouped::__ANON__[/usr/share/perl5/Class/Accessor/Grouped.pm:708] at line 700, avg 2µs/call
sub perlstring ($) { q{"}. quotemeta( shift ). q{"} };
75180µs12.04ms}
# spent 2.04ms making 1 call to Class::Accessor::Grouped::BEGIN@31
76
77# Yes this method is undocumented
78# Yes it should be a private coderef like all the rest at the end of this file
79# No we can't do that (yet) because the DBIC-CDBI compat layer overrides it
80# %$*@!?&!&#*$!!!
81
821200nsmy $illegal_accessors_warned;
83
# spent 674ms (79.0+595) within Class::Accessor::Grouped::_mk_group_accessors which was called 1922 times, avg 351µs/call: # 1922 times (79.0ms+595ms) by Class::Accessor::Grouped::mk_group_accessors at line 251, avg 351µs/call
sub _mk_group_accessors {
8419221.16ms my($self, $maker, $group, @fields) = @_;
851922841µs my $class = length (ref ($self) ) ? ref ($self) : $self;
86
87240µs226µs
# spent 19µs (13+7) within Class::Accessor::Grouped::BEGIN@87 which was called: # once (13µs+7µs) by base::import at line 87
no strict 'refs';
# spent 19µs making 1 call to Class::Accessor::Grouped::BEGIN@87 # spent 7µs making 1 call to strict::unimport
882672µs225µs
# spent 16µs (7+9) within Class::Accessor::Grouped::BEGIN@88 which was called: # once (7µs+9µs) by base::import at line 88
no warnings 'redefine';
# spent 16µs making 1 call to Class::Accessor::Grouped::BEGIN@88 # spent 9µs making 1 call to warnings::unimport
89
90 # So we don't have to do lots of lookups inside the loop.
91192225.0ms192210.1ms $maker = $self->can($maker) unless ref $maker;
# spent 10.1ms making 1922 calls to UNIVERSAL::can, avg 5µs/call
92
9319228.75ms for (@fields) {
94
9519721.09ms my ($name, $field) = (ref $_) ? (@$_) : ($_, $_);
96
9719728.11ms19724.47ms if ($name !~ /\A[A-Z_a-z][0-9A-Z_a-z]*\z/) {
# spent 4.47ms making 1972 calls to Class::Accessor::Grouped::CORE:match, avg 2µs/call
98
99 if ($name =~ /\0/) {
100 Carp::croak(sprintf
101 "Illegal accessor name %s - nulls should never appear in stash keys",
102 __CAG_ENV__::perlstring($name),
103 );
104 }
105 elsif (! $ENV{CAG_ILLEGAL_ACCESSOR_NAME_OK} ) {
106 Carp::croak(
107 "Illegal accessor name '$name'. If you want CAG to attempt creating "
108 . 'it anyway (possible if Sub::Name is available) set '
109 . '$ENV{CAG_ILLEGAL_ACCESSOR_NAME_OK}'
110 );
111 }
112 elsif (__CAG_ENV__::NO_SUBNAME) {
113 Carp::croak(
114 "Unable to install accessor with illegal name '$name': "
115 . 'Sub::Name not available'
116 );
117 }
118 elsif (
119 # Because one of the former maintainers of DBIC::SL is a raging
120 # idiot, there is now a ton of DBIC code out there that attempts
121 # to create column accessors with illegal names. In the interest
122 # of not cluttering the logs of unsuspecting victims (unsuspecting
123 # because these accessors are unusable anyway) we provide an
124 # explicit "do not warn at all" escape, until all such code is
125 # fixed (this will be a loooooong time >:(
126 $ENV{CAG_ILLEGAL_ACCESSOR_NAME_OK} ne 'DO_NOT_WARN'
127 and
128 ! $illegal_accessors_warned->{$class}++
129 ) {
130 Carp::carp(
131 "Installing illegal accessor '$name' into $class, see "
132 . 'documentation for more details'
133 );
134 }
135 }
136
13719728.06ms1972997µs Carp::carp("Having a data accessor named '$name' in '$class' is unwise.")
# spent 997µs making 1972 calls to Class::Accessor::Grouped::CORE:match, avg 506ns/call
138 if $name =~ /\A(?: DESTROY | AUTOLOAD | CLONE )\z/x;
139
14019721.53ms my $alias = "_${name}_accessor";
141
14219722.28ms for ($name, $alias) {
143
144 # the maker may elect to not return anything, meaning it already
145 # installed the coderef for us (e.g. lack of Sub::Name)
14639445.90ms3944558ms my $cref = $self->$maker($group, $field, $_)
# spent 558ms making 3944 calls to Class::Accessor::Grouped::make_group_accessor, avg 142µs/call
147 or next;
148
14939442.66ms my $fq_meth = "${class}::$_";
150
151394450.4ms394421.3ms *$fq_meth = Sub::Name::subname($fq_meth, $cref);
# spent 21.3ms making 3944 calls to Sub::Name::subname, avg 5µs/call
152 #unless defined &{$class."\:\:$field"}
153 }
154 }
155};
156
157# $gen_accessor coderef is setup at the end for clarity
158my $gen_accessor;
159
160=head1 NAME
161
162Class::Accessor::Grouped - Lets you build groups of accessors
163
164=head1 SYNOPSIS
165
166 use base 'Class::Accessor::Grouped';
167
168 # make basic accessors for objects
169 __PACKAGE__->mk_group_accessors(simple => qw(id name email));
170
171 # make accessor that works for objects and classes
172 __PACKAGE__->mk_group_accessors(inherited => 'awesome_level');
173
174 # make an accessor which calls a custom pair of getters/setters
175 sub get_column { ... this will be called when you do $obj->name() ... }
176 sub set_column { ... this will be called when you do $obj->name('foo') ... }
177 __PACKAGE__->mk_group_accessors(column => 'name');
178
179=head1 DESCRIPTION
180
181This class lets you build groups of accessors that will call different
182getters and setters. The documentation of this module still requires a lot
183of work (B<< volunteers welcome >.> >>), but in the meantime you can refer to
184L<this post|http://lo-f.at/glahn/2009/08/WritingPowerfulAccessorsForPerlClasses.html>
185for more information.
186
187=head2 Notes on accessor names
188
189In general method names in Perl are considered identifiers, and as such need to
190conform to the identifier specification of C<qr/\A[A-Z_a-z][0-9A-Z_a-z]*\z/>.
191While it is rather easy to invoke methods with non-standard names
192(C<< $obj->${\"anything goes"} >>), it is not possible to properly declare such
193methods without the use of L<Sub::Name>. Since this module must be able to
194function identically with and without its optional dependencies, starting with
195version C<0.10008> attempting to declare an accessor with a non-standard name
196is a fatal error (such operations would silently succeed since version
197C<0.08004>, as long as L<Sub::Name> is present, or otherwise would result in a
198syntax error during a string eval).
199
200Unfortunately in the years since C<0.08004> a rather large body of code
201accumulated in the wild that does attempt to declare accessors with funny
202names. One notable perpetrator is L<DBIx::Class::Schema::Loader>, which under
203certain conditions could create accessors of the C<column> group which start
204with numbers and/or some other punctuation (the proper way would be to declare
205columns with the C<accessor> attribute set to C<undef>).
206
207Therefore an escape mechanism is provided via the environment variable
208C<CAG_ILLEGAL_ACCESSOR_NAME_OK>. When set to a true value, one warning is
209issued B<per class> on attempts to declare an accessor with a non-conforming
210name, and as long as L<Sub::Name> is available all accessors will be properly
211created. Regardless of this setting, accessor names containing nulls C<"\0">
212are disallowed, due to various deficiencies in perl itself.
213
214If your code base has too many instances of illegal accessor declarations, and
215a fix is not feasible due to time constraints, it is possible to disable the
216warnings altogether by setting C<$ENV{CAG_ILLEGAL_ACCESSOR_NAME_OK}> to
217C<DO_NOT_WARN> (observe capitalization).
218
219=head1 METHODS
220
221=head2 mk_group_accessors
222
223 __PACKAGE__->mk_group_accessors(simple => 'hair_length', [ hair_color => 'hc' ]);
224
225=over 4
226
227=item Arguments: $group, @fieldspec
228
229Returns: none
230
231=back
232
233Creates a set of accessors in a given group.
234
235$group is the name of the accessor group for the generated accessors; they
236will call get_$group($field) on get and set_$group($field, $value) on set.
237
238If you want to mimic Class::Accessor's mk_accessors $group has to be 'simple'
239to tell Class::Accessor::Grouped to use its own get_simple and set_simple
240methods.
241
242@fieldspec is a list of field/accessor names; if a fieldspec is a scalar
243this is used as both field and accessor name, if a listref it is expected to
244be of the form [ $accessor, $field ].
245
246=cut
247
248
# spent 692ms (18.2+674) within Class::Accessor::Grouped::mk_group_accessors which was called 1922 times, avg 360µs/call: # 1599 times (15.1ms+597ms) by DBIx::Class::Row::register_column at line 1454 of DBIx/Class/Row.pm, avg 383µs/call # 184 times (2.25ms+23.9ms) by DBIx::Class::mk_classaccessor at line 36 of DBIx/Class.pm, avg 142µs/call # 122 times (760µs+35.3ms) by DBIx::Class::InflateColumn::inflate_column at line 101 of DBIx/Class/InflateColumn.pm, avg 295µs/call # once (5µs+4.88ms) by Class::C3::Componentised::ensure_class_loaded at line 73 of DBIx/Class/Storage/DBI.pm # once (11µs+4.53ms) by Class::C3::Componentised::ensure_class_loaded at line 74 of DBIx/Class/Storage/DBI.pm # once (4µs+2.34ms) by Class::C3::Componentised::ensure_class_loaded at line 22 of DBIx/Class/Storage/DBI.pm # once (10µs+1.58ms) by Class::C3::Componentised::ensure_class_loaded at line 26 of DBIx/Class/Storage/DBI.pm # once (4µs+1.01ms) by base::import at line 23 of DBIx/Class/Storage.pm # once (4µs+708µs) by Class::C3::Componentised::ensure_class_loaded at line 28 of DBIx/Class/ResultSource.pm # once (11µs+565µs) by Class::C3::Componentised::ensure_class_loaded at line 33 of DBIx/Class/Storage/DBI.pm # once (15µs+519µs) by Class::C3::Componentised::ensure_class_loaded at line 21 of DBIx/Class/ResultSource.pm # once (10µs+381µs) by base::import at line 27 of DBIx/Class.pm # once (9µs+377µs) by base::import at line 13 of DBIx/Class/ResultSourceProxy.pm # once (4µs+313µs) by Class::C3::Componentised::ensure_class_loaded at line 45 of DBIx/Class/Storage/DBI.pm # once (12µs+260µs) by base::import at line 22 of DBIx/Class/Storage.pm # once (12µs+195µs) by Class::C3::Componentised::ensure_class_loaded at line 13 of DBIx/Class/Storage/DBI/Cursor.pm # once (11µs+190µs) by DBIx::Class::ResultSource::BEGIN@9 at line 15 of DBIx/Class/ResultSourceHandle.pm # once (12µs+154µs) by DBIx::Class::ResultSource::Table::BEGIN@6 at line 34 of DBIx/Class/ResultSet.pm # once (11µs+101µs) by base::import at line 27 of DBIx/Class/Row.pm # once (0s+400ns) by base::import at line 45 of DBIx/Class/SQLMaker.pm
sub mk_group_accessors {
24919221.31ms my ($self, $group, @fields) = @_;
250
25119228.65ms1922674ms $self->_mk_group_accessors('make_group_accessor', $group, @fields);
# spent 674ms making 1922 calls to Class::Accessor::Grouped::_mk_group_accessors, avg 351µs/call
25219229.50ms return;
253}
254
255=head2 mk_group_ro_accessors
256
257 __PACKAGE__->mk_group_ro_accessors(simple => 'birthdate', [ social_security_number => 'ssn' ]);
258
259=over 4
260
261=item Arguments: $group, @fieldspec
262
263Returns: none
264
265=back
266
267Creates a set of read only accessors in a given group. Identical to
268L</mk_group_accessors> but accessors will throw an error if passed a value
269rather than setting the value.
270
271=cut
272
273sub mk_group_ro_accessors {
274 my($self, $group, @fields) = @_;
275
276 $self->_mk_group_accessors('make_group_ro_accessor', $group, @fields);
277 return;
278}
279
280=head2 mk_group_wo_accessors
281
282 __PACKAGE__->mk_group_wo_accessors(simple => 'lie', [ subject => 'subj' ]);
283
284=over 4
285
286=item Arguments: $group, @fieldspec
287
288Returns: none
289
290=back
291
292Creates a set of write only accessors in a given group. Identical to
293L</mk_group_accessors> but accessors will throw an error if not passed a
294value rather than getting the value.
295
296=cut
297
298sub mk_group_wo_accessors {
299 my($self, $group, @fields) = @_;
300
301 $self->_mk_group_accessors('make_group_wo_accessor', $group, @fields);
302 return;
303}
304
305=head2 get_simple
306
307=over 4
308
309=item Arguments: $field
310
311Returns: $value
312
313=back
314
315Simple getter for hash-based objects which returns the value for the field
316name passed as an argument.
317
318=cut
319
320sub get_simple {
321 $_[0]->{$_[1]};
322}
323
324=head2 set_simple
325
326=over 4
327
328=item Arguments: $field, $new_value
329
330Returns: $new_value
331
332=back
333
334Simple setter for hash-based objects which sets and then returns the value
335for the field name passed as an argument.
336
337=cut
338
339sub set_simple {
340 $_[0]->{$_[1]} = $_[2];
341}
342
343
344=head2 get_inherited
345
346=over 4
347
348=item Arguments: $field
349
350Returns: $value
351
352=back
353
354Simple getter for Classes and hash-based objects which returns the value for
355the field name passed as an argument. This behaves much like
356L<Class::Data::Accessor> where the field can be set in a base class,
357inherited and changed in subclasses, and inherited and changed for object
358instances.
359
360=cut
361
362
# spent 34.6ms (30.1+4.53) within Class::Accessor::Grouped::get_inherited which was called 4175 times, avg 8µs/call: # 3644 times (24.0ms+4.14ms) by C4::Context::dbh or C4::Context::preference or C4::Languages::getTranslatedLanguages or C4::Languages::getlanguage or C4::Members::GetMember or C4::NewsChannels::GetNewsToDisplay or DBIx::Class::ResultSourceProxy::Table::table_class or DBIx::Class::Schema::class_mappings or DBIx::Class::Schema::default_resultset_attributes or DBIx::Class::Schema::source_registrations or DBIx::Class::Schema::storage or DBIx::Class::Schema::storage_type or DBIx::Class::Storage::DBI::sql_limit_dialect or Koha::Schema::Result::Accountline::result_source_instance or Koha::Schema::Result::Accountoffset::result_source_instance or Koha::Schema::Result::ActionLog::result_source_instance or Koha::Schema::Result::ActionLogs::result_source_instance or Koha::Schema::Result::AdditionalField::result_source_instance or Koha::Schema::Result::AdditionalFieldValue::result_source_instance or Koha::Schema::Result::Alert::result_source_instance or Koha::Schema::Result::Aqbasket::result_source_instance or Koha::Schema::Result::Aqbasketgroup::result_source_instance or Koha::Schema::Result::Aqbasketuser::result_source_instance or Koha::Schema::Result::Aqbookseller::result_source_instance or Koha::Schema::Result::Aqbudget::result_source_instance or Koha::Schema::Result::Aqbudgetborrower::result_source_instance or Koha::Schema::Result::Aqbudgetperiod::result_source_instance or Koha::Schema::Result::AqbudgetsPlanning::result_source_instance or Koha::Schema::Result::Aqcontact::result_source_instance or Koha::Schema::Result::Aqcontract::result_source_instance or Koha::Schema::Result::Aqinvoice::result_source_instance or Koha::Schema::Result::Aqorder::result_source_instance or Koha::Schema::Result::AqorderUser::result_source_instance or Koha::Schema::Result::AqordersItem::result_source_instance or Koha::Schema::Result::AqordersTransfer::result_source_instance or Koha::Schema::Result::AudioAlert::result_source_instance or Koha::Schema::Result::AuthHeader::result_source_instance or Koha::Schema::Result::AuthSubfieldStructure::result_source_instance or Koha::Schema::Result::AuthTagStructure::result_source_instance or Koha::Schema::Result::AuthType::result_source_instance or Koha::Schema::Result::AuthorisedValue::result_source_instance or Koha::Schema::Result::AuthorisedValuesBranch::result_source_instance or Koha::Schema::Result::Biblio::result_source_instance or Koha::Schema::Result::BiblioFramework::result_source_instance or Koha::Schema::Result::Biblioimage::result_source_instance or Koha::Schema::Result::Biblioitem::result_source_instance or Koha::Schema::Result::Borrower::result_source_instance or Koha::Schema::Result::BorrowerAttribute::result_source_instance or Koha::Schema::Result::BorrowerAttributeType::result_source_instance or Koha::Schema::Result::BorrowerAttributeTypesBranch::result_source_instance or Koha::Schema::Result::BorrowerDebarment::result_source_instance or Koha::Schema::Result::BorrowerFile::result_source_instance or Koha::Schema::Result::BorrowerMessagePreference::result_source_instance or Koha::Schema::Result::BorrowerMessageTransportPreference::result_source_instance or Koha::Schema::Result::BorrowerModification::result_source_instance or Koha::Schema::Result::BorrowerSync::result_source_instance or Koha::Schema::Result::Branch::result_source_instance or Koha::Schema::Result::BranchBorrowerCircRule::result_source_instance or Koha::Schema::Result::BranchItemRule::result_source_instance or Koha::Schema::Result::BranchTransferLimit::result_source_instance or Koha::Schema::Result::Branchcategory::result_source_instance or Koha::Schema::Result::Branchrelation::result_source_instance or Koha::Schema::Result::Branchtransfer::result_source_instance or Koha::Schema::Result::Browser::result_source_instance or Koha::Schema::Result::CategoriesBranch::result_source_instance or Koha::Schema::Result::Category::result_source_instance or Koha::Schema::Result::City::result_source_instance or Koha::Schema::Result::ClassSortRule::result_source_instance or Koha::Schema::Result::ClassSource::result_source_instance or Koha::Schema::Result::Collection::result_source_instance or Koha::Schema::Result::CollectionsTracking::result_source_instance or Koha::Schema::Result::ColumnsSetting::result_source_instance or Koha::Schema::Result::Course::result_source_instance or Koha::Schema::Result::CourseInstructor::result_source_instance or Koha::Schema::Result::CourseItem::result_source_instance or Koha::Schema::Result::CourseReserve::result_source_instance or Koha::Schema::Result::CreatorBatch::result_source_instance or Koha::Schema::Result::CreatorImage::result_source_instance or Koha::Schema::Result::CreatorLayout::result_source_instance or Koha::Schema::Result::CreatorTemplate::result_source_instance or Koha::Schema::Result::Currency::result_source_instance or Koha::Schema::Result::DefaultBorrowerCircRule::result_source_instance or Koha::Schema::Result::DefaultBranchCircRule::result_source_instance or Koha::Schema::Result::DefaultBranchItemRule::result_source_instance or Koha::Schema::Result::DefaultCircRule::result_source_instance or Koha::Schema::Result::Deletedbiblio::result_source_instance or Koha::Schema::Result::Deletedbiblioitem::result_source_instance or Koha::Schema::Result::Deletedborrower::result_source_instance or Koha::Schema::Result::Deleteditem::result_source_instance or Koha::Schema::Result::Discharge::result_source_instance or Koha::Schema::Result::ExportFormat::result_source_instance or Koha::Schema::Result::Fieldmapping::result_source_instance or Koha::Schema::Result::HoldFillTarget::result_source_instance or Koha::Schema::Result::ImportAuth::result_source_instance or Koha::Schema::Result::ImportBatch::result_source_instance or Koha::Schema::Result::ImportBiblio::result_source_instance or Koha::Schema::Result::ImportItem::result_source_instance or Koha::Schema::Result::ImportRecord::result_source_instance or Koha::Schema::Result::ImportRecordMatch::result_source_instance or Koha::Schema::Result::Issue::result_source_instance or Koha::Schema::Result::Issuingrule::result_source_instance or Koha::Schema::Result::Item::result_source_instance or Koha::Schema::Result::ItemCirculationAlertPreference::result_source_instance or Koha::Schema::Result::ItemsLastBorrower::result_source_instance or Koha::Schema::Result::ItemsSearchField::result_source_instance or Koha::Schema::Result::Itemtype::result_source_instance or Koha::Schema::Result::LanguageDescription::result_source_instance or Koha::Schema::Result::LanguageRfc4646ToIso639::result_source_instance or Koha::Schema::Result::LanguageScriptBidi::result_source_instance or Koha::Schema::Result::LanguageScriptMapping::result_source_instance or Koha::Schema::Result::LanguageSubtagRegistry::result_source_instance or Koha::Schema::Result::Letter::result_source_instance or Koha::Schema::Result::Linktracker::result_source_instance or Koha::Schema::Result::Localization::result_source_instance or Koha::Schema::Result::MarcMatcher::result_source_instance or Koha::Schema::Result::MarcModificationTemplate::result_source_instance or Koha::Schema::Result::MarcModificationTemplateAction::result_source_instance or Koha::Schema::Result::MarcSubfieldStructure::result_source_instance or Koha::Schema::Result::MarcTagStructure::result_source_instance or Koha::Schema::Result::Matchcheck::result_source_instance or Koha::Schema::Result::MatcherMatchpoint::result_source_instance or Koha::Schema::Result::Matchpoint::result_source_instance or Koha::Schema::Result::MatchpointComponent::result_source_instance or Koha::Schema::Result::MatchpointComponentNorm::result_source_instance or Koha::Schema::Result::Message::result_source_instance or Koha::Schema::Result::MessageAttribute::result_source_instance or Koha::Schema::Result::MessageQueue::result_source_instance or Koha::Schema::Result::MessageTransport::result_source_instance or Koha::Schema::Result::MessageTransportType::result_source_instance or Koha::Schema::Result::MiscFile::result_source_instance or Koha::Schema::Result::NeedMergeAuthority::result_source_instance or Koha::Schema::Result::Notify::result_source_instance or Koha::Schema::Result::OaiSet::result_source_instance or Koha::Schema::Result::OaiSetsBiblio::result_source_instance or Koha::Schema::Result::OaiSetsDescription::result_source_instance or Koha::Schema::Result::OaiSetsMapping::result_source_instance or Koha::Schema::Result::OldIssue::result_source_instance or Koha::Schema::Result::OldReserve::result_source_instance or Koha::Schema::Result::OpacNews::result_source_instance or Koha::Schema::Result::Overduerule::result_source_instance or Koha::Schema::Result::OverduerulesTransportType::result_source_instance or Koha::Schema::Result::PatronList::result_source_instance or Koha::Schema::Result::PatronListPatron::result_source_instance or Koha::Schema::Result::Patronimage::result_source_instance or Koha::Schema::Result::PendingOfflineOperation::result_source_instance or Koha::Schema::Result::Permission::result_source_instance or Koha::Schema::Result::PluginData::result_source_instance or Koha::Schema::Result::Printer::result_source_instance or Koha::Schema::Result::PrintersProfile::result_source_instance or Koha::Schema::Result::Quote::result_source_instance or Koha::Schema::Result::Rating::result_source_instance or Koha::Schema::Result::RepeatableHoliday::result_source_instance or Koha::Schema::Result::ReportsDictionary::result_source_instance or Koha::Schema::Result::Reserve::result_source_instance or Koha::Schema::Result::Review::result_source_instance or Koha::Schema::Result::SavedReport::result_source_instance or Koha::Schema::Result::SavedSql::result_source_instance or Koha::Schema::Result::SearchHistory::result_source_instance or Koha::Schema::Result::Serial::result_source_instance or Koha::Schema::Result::Serialitem::result_source_instance or Koha::Schema::Result::ServicesThrottle::result_source_instance or Koha::Schema::Result::Session::result_source_instance or Koha::Schema::Result::SocialData::result_source_instance or Koha::Schema::Result::SpecialHoliday::result_source_instance or Koha::Schema::Result::Statistic::result_source_instance or Koha::Schema::Result::Stopword::result_source_instance or Koha::Schema::Result::Subscription::result_source_instance or Koha::Schema::Result::SubscriptionFrequency::result_source_instance or Koha::Schema::Result::SubscriptionNumberpattern::result_source_instance or Koha::Schema::Result::Subscriptionhistory::result_source_instance or Koha::Schema::Result::Subscriptionroutinglist::result_source_instance or Koha::Schema::Result::Suggestion::result_source_instance or Koha::Schema::Result::Systempreference::result_source_instance or Koha::Schema::Result::Tag::result_source_instance or Koha::Schema::Result::TagAll::result_source_instance or Koha::Schema::Result::TagsApproval::result_source_instance or Koha::Schema::Result::TagsIndex::result_source_instance or Koha::Schema::Result::TmpHoldsqueue::result_source_instance or Koha::Schema::Result::TransportCost::result_source_instance or Koha::Schema::Result::UploadedFile::result_source_instance or Koha::Schema::Result::UserPermission::result_source_instance or Koha::Schema::Result::Userflag::result_source_instance or Koha::Schema::Result::Virtualshelfcontent::result_source_instance or Koha::Schema::Result::Virtualshelfshare::result_source_instance or Koha::Schema::Result::Virtualshelve::result_source_instance or Koha::Schema::Result::Z3950server::result_source_instance or Koha::Schema::Result::Zebraqueue::result_source_instance at line 2 of (eval 171)[Class/Accessor/Grouped.pm:764], avg 8µs/call # 531 times (6.09ms+387µs) by DBIx::Class::AccessorGroup::get_component_class at line 13 of DBIx/Class/AccessorGroup.pm, avg 12µs/call
sub get_inherited {
36341751.55ms if ( length (ref ($_[0]) ) ) {
36412657.59ms1265972µs if (Scalar::Util::reftype $_[0] eq 'HASH') {
# spent 972µs making 1265 calls to Scalar::Util::reftype, avg 769ns/call
36512655.38ms return $_[0]->{$_[1]} if exists $_[0]->{$_[1]};
366 # everything in @_ is aliased, an assignment won't work
36793143µs splice @_, 0, 1, ref($_[0]);
368 }
369 else {
370 Carp::croak('Cannot get inherited value on an object instance that is not hash-based');
371 }
372 }
373
374 # if we got this far there is nothing in the instance
375 # OR this is a class call
376 # in any case $_[0] contains the class name (see splice above)
377239µs222µs
# spent 16µs (9+6) within Class::Accessor::Grouped::BEGIN@377 which was called: # once (9µs+6µs) by base::import at line 377
no strict 'refs';
# spent 16µs making 1 call to Class::Accessor::Grouped::BEGIN@377 # spent 6µs making 1 call to strict::unimport
3782163µs226µs
# spent 16µs (7+9) within Class::Accessor::Grouped::BEGIN@378 which was called: # once (7µs+9µs) by base::import at line 378
no warnings 'uninitialized';
# spent 16µs making 1 call to Class::Accessor::Grouped::BEGIN@378 # spent 9µs making 1 call to warnings::unimport
379
38030031.59ms my $cag_slot = '::__cag_'. $_[1];
381300313.1ms return ${$_[0].$cag_slot} if defined(${$_[0].$cag_slot});
382
383 do { return ${$_.$cag_slot} if defined(${$_.$cag_slot}) }
3842688.94ms2683.56ms for $_[0]->get_super_paths;
# spent 3.56ms making 268 calls to Class::Accessor::Grouped::get_super_paths, avg 13µs/call
385
38614µs return undef;
387}
388
389=head2 set_inherited
390
391=over 4
392
393=item Arguments: $field, $new_value
394
395Returns: $new_value
396
397=back
398
399Simple setter for Classes and hash-based objects which sets and then returns
400the value for the field name passed as an argument. When called on a hash-based
401object it will set the appropriate hash key value. When called on a class, it
402will set a class level variable.
403
404B<Note:>: This method will die if you try to set an object variable on a non
405hash-based object.
406
407=cut
408
409
# spent 2.47ms (2.35+111µs) within Class::Accessor::Grouped::set_inherited which was called 720 times, avg 3µs/call: # 706 times (2.28ms+111µs) by DBIx::Class::Schema::class_mappings or DBIx::Class::Schema::source_registrations or DBIx::Class::Schema::storage or DBIx::Class::Storage::DBI::sql_limit_dialect or DBIx::Class::Storage::DBI::sql_name_sep or DBIx::Class::Storage::DBI::sql_quote_char or DBIx::Class::_skip_namespace_frames or Koha::Schema::Result::Accountline::result_source_instance or Koha::Schema::Result::Accountoffset::result_source_instance or Koha::Schema::Result::ActionLog::result_source_instance or Koha::Schema::Result::ActionLogs::result_source_instance or Koha::Schema::Result::AdditionalField::result_source_instance or Koha::Schema::Result::AdditionalFieldValue::result_source_instance or Koha::Schema::Result::Alert::result_source_instance or Koha::Schema::Result::Aqbasket::result_source_instance or Koha::Schema::Result::Aqbasketgroup::result_source_instance or Koha::Schema::Result::Aqbasketuser::result_source_instance or Koha::Schema::Result::Aqbookseller::result_source_instance or Koha::Schema::Result::Aqbudget::result_source_instance or Koha::Schema::Result::Aqbudgetborrower::result_source_instance or Koha::Schema::Result::Aqbudgetperiod::result_source_instance or Koha::Schema::Result::AqbudgetsPlanning::result_source_instance or Koha::Schema::Result::Aqcontact::result_source_instance or Koha::Schema::Result::Aqcontract::result_source_instance or Koha::Schema::Result::Aqinvoice::result_source_instance or Koha::Schema::Result::Aqorder::result_source_instance or Koha::Schema::Result::AqorderUser::result_source_instance or Koha::Schema::Result::AqordersItem::result_source_instance or Koha::Schema::Result::AqordersTransfer::result_source_instance or Koha::Schema::Result::AudioAlert::result_source_instance or Koha::Schema::Result::AuthHeader::result_source_instance or Koha::Schema::Result::AuthSubfieldStructure::result_source_instance or Koha::Schema::Result::AuthTagStructure::result_source_instance or Koha::Schema::Result::AuthType::result_source_instance or Koha::Schema::Result::AuthorisedValue::result_source_instance or Koha::Schema::Result::AuthorisedValuesBranch::result_source_instance or Koha::Schema::Result::Biblio::result_source_instance or Koha::Schema::Result::BiblioFramework::result_source_instance or Koha::Schema::Result::Biblioimage::result_source_instance or Koha::Schema::Result::Biblioitem::result_source_instance or Koha::Schema::Result::Borrower::result_source_instance or Koha::Schema::Result::BorrowerAttribute::result_source_instance or Koha::Schema::Result::BorrowerAttributeType::result_source_instance or Koha::Schema::Result::BorrowerAttributeTypesBranch::result_source_instance or Koha::Schema::Result::BorrowerDebarment::result_source_instance or Koha::Schema::Result::BorrowerFile::result_source_instance or Koha::Schema::Result::BorrowerMessagePreference::result_source_instance or Koha::Schema::Result::BorrowerMessageTransportPreference::result_source_instance or Koha::Schema::Result::BorrowerModification::result_source_instance or Koha::Schema::Result::BorrowerSync::result_source_instance or Koha::Schema::Result::Branch::result_source_instance or Koha::Schema::Result::BranchBorrowerCircRule::result_source_instance or Koha::Schema::Result::BranchItemRule::result_source_instance or Koha::Schema::Result::BranchTransferLimit::result_source_instance or Koha::Schema::Result::Branchcategory::result_source_instance or Koha::Schema::Result::Branchrelation::result_source_instance or Koha::Schema::Result::Branchtransfer::result_source_instance or Koha::Schema::Result::Browser::result_source_instance or Koha::Schema::Result::CategoriesBranch::result_source_instance or Koha::Schema::Result::Category::result_source_instance or Koha::Schema::Result::City::result_source_instance or Koha::Schema::Result::ClassSortRule::result_source_instance or Koha::Schema::Result::ClassSource::result_source_instance or Koha::Schema::Result::Collection::result_source_instance or Koha::Schema::Result::CollectionsTracking::result_source_instance or Koha::Schema::Result::ColumnsSetting::result_source_instance or Koha::Schema::Result::Course::result_source_instance or Koha::Schema::Result::CourseInstructor::result_source_instance or Koha::Schema::Result::CourseItem::result_source_instance or Koha::Schema::Result::CourseReserve::result_source_instance or Koha::Schema::Result::CreatorBatch::result_source_instance or Koha::Schema::Result::CreatorImage::result_source_instance or Koha::Schema::Result::CreatorLayout::result_source_instance or Koha::Schema::Result::CreatorTemplate::result_source_instance or Koha::Schema::Result::Currency::result_source_instance or Koha::Schema::Result::DefaultBorrowerCircRule::result_source_instance or Koha::Schema::Result::DefaultBranchCircRule::result_source_instance or Koha::Schema::Result::DefaultBranchItemRule::result_source_instance or Koha::Schema::Result::DefaultCircRule::result_source_instance or Koha::Schema::Result::Deletedbiblio::result_source_instance or Koha::Schema::Result::Deletedbiblioitem::result_source_instance or Koha::Schema::Result::Deletedborrower::result_source_instance or Koha::Schema::Result::Deleteditem::result_source_instance or Koha::Schema::Result::Discharge::result_source_instance or Koha::Schema::Result::ExportFormat::result_source_instance or Koha::Schema::Result::Fieldmapping::result_source_instance or Koha::Schema::Result::HoldFillTarget::result_source_instance or Koha::Schema::Result::ImportAuth::result_source_instance or Koha::Schema::Result::ImportBatch::result_source_instance or Koha::Schema::Result::ImportBiblio::result_source_instance or Koha::Schema::Result::ImportItem::result_source_instance or Koha::Schema::Result::ImportRecord::result_source_instance or Koha::Schema::Result::ImportRecordMatch::result_source_instance or Koha::Schema::Result::Issue::result_source_instance or Koha::Schema::Result::Issuingrule::result_source_instance or Koha::Schema::Result::Item::result_source_instance or Koha::Schema::Result::ItemCirculationAlertPreference::result_source_instance or Koha::Schema::Result::ItemsLastBorrower::result_source_instance or Koha::Schema::Result::ItemsSearchField::result_source_instance or Koha::Schema::Result::Itemtype::result_source_instance or Koha::Schema::Result::LanguageDescription::result_source_instance or Koha::Schema::Result::LanguageRfc4646ToIso639::result_source_instance or Koha::Schema::Result::LanguageScriptBidi::result_source_instance or Koha::Schema::Result::LanguageScriptMapping::result_source_instance or Koha::Schema::Result::LanguageSubtagRegistry::result_source_instance or Koha::Schema::Result::Letter::result_source_instance or Koha::Schema::Result::Linktracker::result_source_instance or Koha::Schema::Result::Localization::result_source_instance or Koha::Schema::Result::MarcMatcher::result_source_instance or Koha::Schema::Result::MarcModificationTemplate::result_source_instance or Koha::Schema::Result::MarcModificationTemplateAction::result_source_instance or Koha::Schema::Result::MarcSubfieldStructure::result_source_instance or Koha::Schema::Result::MarcTagStructure::result_source_instance or Koha::Schema::Result::Matchcheck::result_source_instance or Koha::Schema::Result::MatcherMatchpoint::result_source_instance or Koha::Schema::Result::Matchpoint::result_source_instance or Koha::Schema::Result::MatchpointComponent::result_source_instance or Koha::Schema::Result::MatchpointComponentNorm::result_source_instance or Koha::Schema::Result::Message::result_source_instance or Koha::Schema::Result::MessageAttribute::result_source_instance or Koha::Schema::Result::MessageQueue::result_source_instance or Koha::Schema::Result::MessageTransport::result_source_instance or Koha::Schema::Result::MessageTransportType::result_source_instance or Koha::Schema::Result::MiscFile::result_source_instance or Koha::Schema::Result::NeedMergeAuthority::result_source_instance or Koha::Schema::Result::Notify::result_source_instance or Koha::Schema::Result::OaiSet::result_source_instance or Koha::Schema::Result::OaiSetsBiblio::result_source_instance or Koha::Schema::Result::OaiSetsDescription::result_source_instance or Koha::Schema::Result::OaiSetsMapping::result_source_instance or Koha::Schema::Result::OldIssue::result_source_instance or Koha::Schema::Result::OldReserve::result_source_instance or Koha::Schema::Result::OpacNews::result_source_instance or Koha::Schema::Result::Overduerule::result_source_instance or Koha::Schema::Result::OverduerulesTransportType::result_source_instance or Koha::Schema::Result::PatronList::result_source_instance or Koha::Schema::Result::PatronListPatron::result_source_instance or Koha::Schema::Result::Patronimage::result_source_instance or Koha::Schema::Result::PendingOfflineOperation::result_source_instance or Koha::Schema::Result::Permission::result_source_instance or Koha::Schema::Result::PluginData::result_source_instance or Koha::Schema::Result::Printer::result_source_instance or Koha::Schema::Result::PrintersProfile::result_source_instance or Koha::Schema::Result::Quote::result_source_instance or Koha::Schema::Result::Rating::result_source_instance or Koha::Schema::Result::RepeatableHoliday::result_source_instance or Koha::Schema::Result::ReportsDictionary::result_source_instance or Koha::Schema::Result::Reserve::result_source_instance or Koha::Schema::Result::Review::result_source_instance or Koha::Schema::Result::SavedReport::result_source_instance or Koha::Schema::Result::SavedSql::result_source_instance or Koha::Schema::Result::SearchHistory::result_source_instance or Koha::Schema::Result::Serial::result_source_instance or Koha::Schema::Result::Serialitem::result_source_instance or Koha::Schema::Result::ServicesThrottle::result_source_instance or Koha::Schema::Result::Session::result_source_instance or Koha::Schema::Result::SocialData::result_source_instance or Koha::Schema::Result::SpecialHoliday::result_source_instance or Koha::Schema::Result::Statistic::result_source_instance or Koha::Schema::Result::Stopword::result_source_instance or Koha::Schema::Result::Subscription::result_source_instance or Koha::Schema::Result::SubscriptionFrequency::result_source_instance or Koha::Schema::Result::SubscriptionNumberpattern::result_source_instance or Koha::Schema::Result::Subscriptionhistory::result_source_instance or Koha::Schema::Result::Subscriptionroutinglist::result_source_instance or Koha::Schema::Result::Suggestion::result_source_instance or Koha::Schema::Result::Systempreference::result_source_instance or Koha::Schema::Result::Tag::result_source_instance or Koha::Schema::Result::TagAll::result_source_instance or Koha::Schema::Result::TagsApproval::result_source_instance or Koha::Schema::Result::TagsIndex::result_source_instance or Koha::Schema::Result::TmpHoldsqueue::result_source_instance or Koha::Schema::Result::TransportCost::result_source_instance or Koha::Schema::Result::UploadedFile::result_source_instance or Koha::Schema::Result::UserPermission::result_source_instance or Koha::Schema::Result::Userflag::result_source_instance or Koha::Schema::Result::Virtualshelfcontent::result_source_instance or Koha::Schema::Result::Virtualshelfshare::result_source_instance or Koha::Schema::Result::Virtualshelve::result_source_instance or Koha::Schema::Result::Z3950server::result_source_instance or Koha::Schema::Result::Zebraqueue::result_source_instance at line 2 of (eval 171)[Class/Accessor/Grouped.pm:764], avg 3µs/call # 7 times (29µs+0s) by DBIx::Class::mk_classaccessor at line 37 of DBIx/Class.pm, avg 4µs/call # 5 times (42µs+0s) by DBIx::Class::AccessorGroup::set_component_class at line 32 of DBIx/Class/AccessorGroup.pm, avg 8µs/call # 2 times (8µs+0s) by DBIx::Class::Storage::DBI::set_use_dbms_capability at line 1072 of DBIx/Class/Storage/DBI.pm, avg 4µs/call
sub set_inherited {
4107201.18ms180111µs if (length (ref ($_[0]) ) ) {
# spent 111µs making 180 calls to Scalar::Util::reftype, avg 616ns/call
411 if (Scalar::Util::reftype $_[0] eq 'HASH') {
412 return $_[0]->{$_[1]} = $_[2];
413 } else {
414 Carp::croak('Cannot set inherited value on an object instance that is not hash-based');
415 };
416 }
417
41821.11ms219µs
# spent 14µs (9+5) within Class::Accessor::Grouped::BEGIN@418 which was called: # once (9µs+5µs) by base::import at line 418
no strict 'refs';
# spent 14µs making 1 call to Class::Accessor::Grouped::BEGIN@418 # spent 5µs making 1 call to strict::unimport
4195402.63ms ${$_[0].'::__cag_'.$_[1]} = $_[2];
420}
421
422=head2 get_component_class
423
424=over 4
425
426=item Arguments: $field
427
428Returns: $value
429
430=back
431
432Gets the value of the specified component class.
433
434 __PACKAGE__->mk_group_accessors('component_class' => 'result_class');
435
436 $self->result_class->method();
437
438 ## same as
439 $self->get_component_class('result_class')->method();
440
441=cut
442
443sub get_component_class {
444 $_[0]->get_inherited($_[1]);
445};
446
447=head2 set_component_class
448
449=over 4
450
451=item Arguments: $field, $class
452
453Returns: $new_value
454
455=back
456
457Inherited accessor that automatically loads the specified class before setting
458it. This method will die if the specified class could not be loaded.
459
460 __PACKAGE__->mk_group_accessors('component_class' => 'result_class');
461 __PACKAGE__->result_class('MyClass');
462
463 $self->result_class->method();
464
465=cut
466
467sub set_component_class {
468 if (defined $_[2] and length $_[2]) {
469 # disable warnings, and prevent $_ being eaten away by a behind-the-scenes
470 # module loading
471 local ($^W, $_);
472
473 if (__CAG_ENV__::UNSTABLE_DOLLARAT) {
474 my $err;
475 {
476 local $@;
477 eval { Module::Runtime::use_package_optimistically($_[2]) }
478 or $err = $@;
479 }
480 Carp::croak("Could not load $_[1] '$_[2]': $err") if defined $err;
481
482 }
483 else {
484 eval { Module::Runtime::use_package_optimistically($_[2]) }
485 or Carp::croak("Could not load $_[1] '$_[2]': $@");
486 }
487 };
488
489 $_[0]->set_inherited($_[1], $_[2]);
490};
491
492=head1 INTERNAL METHODS
493
494These methods are documented for clarity, but are never meant to be called
495directly, and are not really meant for overriding either.
496
497=head2 get_super_paths
498
499Returns a list of 'parent' or 'super' class names that the current class
500inherited from. This is what drives the traversal done by L</get_inherited>.
501
502=cut
503
504
# spent 3.56ms (2.64+912µs) within Class::Accessor::Grouped::get_super_paths which was called 268 times, avg 13µs/call: # 268 times (2.64ms+912µs) by Class::Accessor::Grouped::get_inherited at line 384, avg 13µs/call
sub get_super_paths {
505 # get_linear_isa returns the class itself as the 1st element
506 # use @_ as a pre-allocated scratch array
5072682.91ms268912µs (undef, @_) = @{mro::get_linear_isa( length( ref($_[0]) ) ? ref($_[0]) : $_[0] )};
# spent 912µs making 268 calls to mro::get_linear_isa, avg 3µs/call
5082681.07ms @_;
509};
510
511=head2 make_group_accessor
512
513 __PACKAGE__->make_group_accessor('simple', 'hair_length', 'hair_length');
514 __PACKAGE__->make_group_accessor('simple', 'hc', 'hair_color');
515
516=over 4
517
518=item Arguments: $group, $field, $accessor
519
520Returns: \&accessor_coderef ?
521
522=back
523
524Called by mk_group_accessors for each entry in @fieldspec. Either returns
525a coderef which will be installed at C<&__PACKAGE__::$accessor>, or returns
526C<undef> if it elects to install the coderef on its own.
527
528=cut
529
530394413.0ms3944534ms
# spent 558ms (24.6+534) within Class::Accessor::Grouped::make_group_accessor which was called 3944 times, avg 142µs/call: # 3944 times (24.6ms+534ms) by Class::Accessor::Grouped::_mk_group_accessors at line 146, avg 142µs/call
sub make_group_accessor { $gen_accessor->('rw', @_) }
# spent 534ms making 3944 calls to Class::Accessor::Grouped::__ANON__[Class/Accessor/Grouped.pm:942], avg 135µs/call
531
532=head2 make_group_ro_accessor
533
534 __PACKAGE__->make_group_ro_accessor('simple', 'birthdate', 'birthdate');
535 __PACKAGE__->make_group_ro_accessor('simple', 'ssn', 'social_security_number');
536
537=over 4
538
539=item Arguments: $group, $field, $accessor
540
541Returns: \&accessor_coderef ?
542
543=back
544
545Called by mk_group_ro_accessors for each entry in @fieldspec. Either returns
546a coderef which will be installed at C<&__PACKAGE__::$accessor>, or returns
547C<undef> if it elects to install the coderef on its own.
548
549=cut
550
551sub make_group_ro_accessor { $gen_accessor->('ro', @_) }
552
553=head2 make_group_wo_accessor
554
555 __PACKAGE__->make_group_wo_accessor('simple', 'lie', 'lie');
556 __PACKAGE__->make_group_wo_accessor('simple', 'subj', 'subject');
557
558=over 4
559
560=item Arguments: $group, $field, $accessor
561
562Returns: \&accessor_coderef ?
563
564=back
565
566Called by mk_group_wo_accessors for each entry in @fieldspec. Either returns
567a coderef which will be installed at C<&__PACKAGE__::$accessor>, or returns
568C<undef> if it elects to install the coderef on its own.
569
570=cut
571
572sub make_group_wo_accessor { $gen_accessor->('wo', @_) }
573
574
575=head1 PERFORMANCE
576
577To provide total flexibility L<Class::Accessor::Grouped> calls methods
578internally while performing get/set actions, which makes it noticeably
579slower than similar modules. To compensate, this module will automatically
580use the insanely fast L<Class::XSAccessor> to generate the C<simple>-group
581accessors if this module is available on your system.
582
583=head2 Benchmark
584
585This is the benchmark of 200 get/get/set/get/set cycles on perl 5.16.2 with
586thread support, showcasing how this modules L<simple (CAG_S)|/get_simple>,
587L<inherited (CAG_INH)|/get_inherited> and L<inherited with parent-class data
588(CAG_INHP)|/get_inherited> accessors stack up against most popular accessor
589builders: L<Moose>, L<Moo>, L<Mo>, L<Mouse> (both pure-perl and XS variant),
590L<Object::Tiny::RW (OTRW)|Object::Tiny::RW>,
591L<Class::Accessor (CA)|Class::Accessor>,
592L<Class::Accessor::Lite (CAL)|Class::Accessor::Lite>,
593L<Class::Accessor::Fast (CAF)|Class::Accessor::Fast>,
594L<Class::Accessor::Fast::XS (CAF_XS)|Class::Accessor::Fast::XS>
595and L<Class::XSAccessor (XSA)|Class::XSAccessor>
596
597 Rate CAG_INHP CAG_INH CA CAG_S CAF moOse OTRW CAL mo moUse HANDMADE moo CAF_XS moUse_XS XSA
598
599 CAG_INHP 287.021+-0.02/s -- -0.3% -10.0% -37.1% -53.1% -53.6% -53.7% -54.1% -56.9% -59.0% -59.6% -59.8% -78.7% -81.9% -83.5%
600
601 CAG_INH 288.025+-0.031/s 0.3% -- -9.7% -36.9% -52.9% -53.5% -53.5% -53.9% -56.7% -58.8% -59.5% -59.7% -78.6% -81.9% -83.5%
602
603 CA 318.967+-0.047/s 11.1% 10.7% -- -30.1% -47.9% -48.5% -48.5% -49.0% -52.1% -54.4% -55.1% -55.3% -76.3% -79.9% -81.7%
604
605 CAG_S 456.107+-0.054/s 58.9% 58.4% 43.0% -- -25.4% -26.3% -26.4% -27.0% -31.5% -34.8% -35.8% -36.1% -66.1% -71.3% -73.9%
606
607 CAF 611.745+-0.099/s 113.1% 112.4% 91.8% 34.1% -- -1.2% -1.2% -2.1% -8.1% -12.6% -14.0% -14.3% -54.5% -61.5% -64.9%
608
609 moOse 619.051+-0.059/s 115.7% 114.9% 94.1% 35.7% 1.2% -- -0.1% -1.0% -7.0% -11.6% -12.9% -13.3% -54.0% -61.0% -64.5%
610
611 OTRW 619.475+-0.1/s 115.8% 115.1% 94.2% 35.8% 1.3% 0.1% -- -0.9% -6.9% -11.5% -12.9% -13.2% -54.0% -61.0% -64.5%
612
613 CAL 625.106+-0.085/s 117.8% 117.0% 96.0% 37.1% 2.2% 1.0% 0.9% -- -6.1% -10.7% -12.1% -12.5% -53.5% -60.6% -64.2%
614
615 mo 665.44+-0.12/s 131.8% 131.0% 108.6% 45.9% 8.8% 7.5% 7.4% 6.5% -- -4.9% -6.4% -6.8% -50.5% -58.1% -61.9%
616
617 moUse 699.9+-0.15/s 143.9% 143.0% 119.4% 53.5% 14.4% 13.1% 13.0% 12.0% 5.2% -- -1.6% -2.0% -48.0% -55.9% -59.9%
618
619 HANDMADE 710.98+-0.16/s 147.7% 146.8% 122.9% 55.9% 16.2% 14.9% 14.8% 13.7% 6.8% 1.6% -- -0.4% -47.2% -55.2% -59.2%
620
621 moo 714.04+-0.13/s 148.8% 147.9% 123.9% 56.6% 16.7% 15.3% 15.3% 14.2% 7.3% 2.0% 0.4% -- -46.9% -55.0% -59.1%
622
623 CAF_XS 1345.55+-0.051/s 368.8% 367.2% 321.8% 195.0% 120.0% 117.4% 117.2% 115.3% 102.2% 92.2% 89.3% 88.4% -- -15.3% -22.9%
624
625 moUse_XS 1588+-0.036/s 453.3% 451.3% 397.9% 248.2% 159.6% 156.5% 156.3% 154.0% 138.6% 126.9% 123.4% 122.4% 18.0% -- -9.0%
626
627 XSA 1744.67+-0.052/s 507.9% 505.7% 447.0% 282.5% 185.2% 181.8% 181.6% 179.1% 162.2% 149.3% 145.4% 144.3% 29.7% 9.9% --
628
629Benchmarking program is available in the root of the
630L<repository|http://search.cpan.org/dist/Class-Accessor-Grouped/>:
631
632=head2 Notes on Class::XSAccessor
633
634You can force (or disable) the use of L<Class::XSAccessor> before creating a
635particular C<simple> accessor by either manipulating the global variable
636C<$Class::Accessor::Grouped::USE_XS> to true or false (preferably with
637L<localization|perlfunc/local>, or you can do so before runtime via the
638C<CAG_USE_XS> environment variable.
639
640Since L<Class::XSAccessor> has no knowledge of L</get_simple> and
641L</set_simple> this module does its best to detect if you are overriding
642one of these methods and will fall back to using the perl version of the
643accessor in order to maintain consistency. However be aware that if you
644enable use of C<Class::XSAccessor> (automatically or explicitly), create
645an object, invoke a simple accessor on that object, and B<then> manipulate
646the symbol table to install a C<get/set_simple> override - you get to keep
647all the pieces.
648
649=head1 AUTHORS
650
651Matt S. Trout <mst@shadowcatsystems.co.uk>
652
653Christopher H. Laco <claco@chrislaco.com>
654
655=head1 CONTRIBUTORS
656
657Caelum: Rafael Kitover <rkitover@cpan.org>
658
659frew: Arthur Axel "fREW" Schmidt <frioux@gmail.com>
660
661groditi: Guillermo Roditi <groditi@cpan.org>
662
663Jason Plum <jason.plum@bmmsi.com>
664
665ribasushi: Peter Rabbitson <ribasushi@cpan.org>
666
667
668=head1 COPYRIGHT & LICENSE
669
670Copyright (c) 2006-2010 Matt S. Trout <mst@shadowcatsystems.co.uk>
671
672This program is free software; you can redistribute it and/or modify
673it under the same terms as perl itself.
674
675=cut
676
677########################################################################
678########################################################################
679########################################################################
680#
681# Here be many angry dragons
682# (all code is in private coderefs since everything inherits CAG)
683#
684########################################################################
685########################################################################
686
687# Autodetect unless flag supplied
688my $xsa_autodetected;
6891300nsif (! defined $USE_XS) {
6901200ns $USE_XS = __CAG_ENV__::NO_CXSA ? 0 : 1;
6911500ns $xsa_autodetected++;
692}
693
694
695my $maker_templates = {
696 rw => {
697 cxsa_call => 'accessors',
698
# spent 8.86ms (7.04+1.82) within Class::Accessor::Grouped::__ANON__[/usr/share/perl5/Class/Accessor/Grouped.pm:708] which was called 927 times, avg 10µs/call: # 927 times (7.04ms+1.82ms) by Class::Accessor::Grouped::__ANON__[/usr/share/perl5/Class/Accessor/Grouped.pm:942] at line 936, avg 10µs/call
pp_generator => sub {
699 # my ($group, $fieldname) = @_;
7009271.64ms9271.82ms my $quoted_fieldname = __CAG_ENV__::perlstring($_[1]);
# spent 1.82ms making 927 calls to __CAG_ENV__::perlstring, avg 2µs/call
7019279.22ms sprintf <<'EOS', ($_[0], $quoted_fieldname) x 2;
702
703@_ > 1
704 ? shift->set_%s(%s, @_)
705 : shift->get_%s(%s)
706EOS
707
708 },
709 },
710 ro => {
711 cxsa_call => 'getters',
712 pp_generator => sub {
713 # my ($group, $fieldname) = @_;
714 my $quoted_fieldname = __CAG_ENV__::perlstring($_[1]);
715 sprintf <<'EOS', $_[0], $quoted_fieldname;
716
717@_ > 1
718 ? do {
719 my ($meth) = (caller(0))[3] =~ /([^\:]+)$/;
720 my $class = length( ref($_[0]) ) ? ref($_[0]) : $_[0];
721 Carp::croak(
722 "'$meth' cannot alter its value (read-only attribute of class $class)"
723 );
724 }
725 : shift->get_%s(%s)
726EOS
727
728 },
729 },
730 wo => {
731 cxsa_call => 'setters',
732 pp_generator => sub {
733 # my ($group, $fieldname) = @_;
734 my $quoted_fieldname = __CAG_ENV__::perlstring($_[1]);
735 sprintf <<'EOS', $_[0], $quoted_fieldname;
736
737@_ > 1
738 ? shift->set_%s(%s, @_)
739 : do {
740 my ($meth) = (caller(0))[3] =~ /([^\:]+)$/;
741 my $class = length( ref($_[0]) ) ? ref($_[0]) : $_[0];
742 Carp::croak(
743 "'$meth' cannot access its value (write-only attribute of class $class)"
744 );
745 }
746EOS
747
748 },
749 },
750111µs};
751
752
# spent 455ms (402+53.4) within Class::Accessor::Grouped::__ANON__[/usr/share/perl5/Class/Accessor/Grouped.pm:774] which was called 927 times, avg 491µs/call: # 927 times (402ms+53.4ms) by Class::Accessor::Grouped::__ANON__[/usr/share/perl5/Class/Accessor/Grouped.pm:942] at line 939, avg 491µs/call
my $cag_eval = sub {
753 #my ($src, $no_warnings, $err_msg) = @_;
754
7559271.25ms my $src = sprintf "{ %s warnings; use strict; no strict 'refs'; %s }",
756 $_[1] ? 'no' : 'use',
757 $_[0],
758 ;
759
760927131µs my (@rv, $err);
761 {
762927368µs local $@ if __CAG_ENV__::UNSTABLE_DOLLARAT;
763 wantarray
764927127ms ? @rv = eval $src
# spent 380ms executing statements in 927 string evals (merged)
# includes 69.8ms spent executing 11318 calls to 6389 subs defined therein.
765 : $rv[0] = eval $src
766 ;
7679271.11ms $err = $@ if $@ ne '';
768 }
769
770927355µs Carp::croak(join ': ', ($_[2] || 'String-eval failed'), "$err\n$src\n" )
771 if defined $err;
772
7739278.18ms wantarray ? @rv : $rv[0];
77412µs};
775
7761100nsmy ($accessor_maker_cache, $no_xsa_warned_classes);
777
778# can't use pkg_gen to track this stuff, as it doesn't
779# detect superclass mucking
780113µs12µsmy $original_simple_getter = __PACKAGE__->can ('get_simple');
# spent 2µs making 1 call to UNIVERSAL::can
78114µs11µsmy $original_simple_setter = __PACKAGE__->can ('set_simple');
# spent 1µs making 1 call to UNIVERSAL::can
782
7831100nsmy ($resolved_methods, $cag_produced_crefs);
784
785sub CLONE {
786 my @crefs = grep { defined $_ } values %{$cag_produced_crefs||{}};
787 $cag_produced_crefs = @crefs
788 ? { map { $_ => $_ } @crefs }
789 : undef
790 ;
791}
792
793# Note!!! Unusual signature
794
# spent 534ms (56.3+477) within Class::Accessor::Grouped::__ANON__[/usr/share/perl5/Class/Accessor/Grouped.pm:942] which was called 3944 times, avg 135µs/call: # 3944 times (56.3ms+477ms) by Class::Accessor::Grouped::make_group_accessor at line 530, avg 135µs/call
$gen_accessor = sub {
79539442.20ms my ($type, $class, $group, $field, $methname) = @_;
79639441.24ms $class = ref $class if length ref $class;
797
798 # When installing an XSA simple accessor, we need to make sure we are not
799 # short-circuiting a (compile or runtime) get_simple/set_simple override.
800 # What we do here is install a lazy first-access check, which will decide
801 # the ultimate coderef being placed in the accessor slot
802 #
803 # Also note that the *original* class will always retain this shim, as
804 # different branches inheriting from it may have different overrides.
805 # Thus the final method (properly labeled and all) is installed in the
806 # calling-package's namespace
807394423.0ms if ($USE_XS and $group eq 'simple') {
808 die sprintf( "Class::XSAccessor requested but not available:\n%s\n", __CAG_ENV__::NO_CXSA )
809 if __CAG_ENV__::NO_CXSA;
810
811
# spent 107µs (39+68) within DBIx::Class::Storage::DBI::_conn_pid which was called 3 times, avg 36µs/call: # once (37µs+68µs) by DBIx::Class::Storage::DBI::_populate_dbh at line 1048 of DBIx/Class/Storage/DBI.pm # once (2µs+0s) by DBIx::Class::Storage::DBI::_verify_pid at line 271 of DBIx/Class/Storage/DBI.pm # once (800ns+0s) by DBIx::Class::Storage::DBI::_populate_dbh at line 913 # spent 137µs (42+95) within DBIx::Class::ResultSource::_primaries which was called: # once (42µs+95µs) by DBIx::Class::ResultSource::set_primary_key at line 617 of DBIx/Class/ResultSource.pm # spent 152µs (46+106) within DBIx::Class::Storage::DBI::on_connect_call which was called: # once (46µs+106µs) by DBIx::Class::Storage::DBI::mysql::_run_connection_actions at line 1063 of DBIx/Class/Storage/DBI.pm # spent 190µs (48+141) within DBIx::Class::ResultSource::name which was called: # once (48µs+141µs) by DBIx::Class::ResultSourceProxy::Table::table at line 104 of DBIx/Class/ResultSourceProxy/Table.pm # spent 111µs (45+67) within DBIx::Class::ResultSet::result_source which was called 11 times, avg 10µs/call: # 2 times (38µs+67µs) by C4::Context::preference at line 783 of DBIx/Class/ResultSet.pm, avg 52µs/call # once (1µs+0s) by C4::Context::preference at line 842 of DBIx/Class/ResultSet.pm # once (1µs+0s) by DBIx::Class::ResultSet::single at line 1099 of DBIx/Class/ResultSet.pm # once (900ns+0s) by DBIx::Class::ResultSet::cursor at line 1026 of DBIx/Class/ResultSet.pm # once (800ns+0s) by DBIx::Class::ResultSet::_construct_results at line 1267 of DBIx/Class/ResultSet.pm # once (700ns+0s) by DBIx::Class::ResultSet::_count_rs at line 1662 of DBIx/Class/ResultSet.pm # once (500ns+0s) by C4::Context::preference at line 913 # once (500ns+0s) by DBIx::Class::ResultSetColumn::new at line 51 of DBIx/Class/ResultSetColumn.pm # once (500ns+0s) by DBIx::Class::ResultSet::_resolved_attrs at line 3516 of DBIx/Class/ResultSet.pm # once (400ns+0s) by DBIx::Class::ResultSet::search_rs at line 432 of DBIx/Class/ResultSet.pm # spent 93µs (31+62) within DBIx::Class::Storage::DBI::_sql_maker_opts which was called 4 times, avg 23µs/call: # once (30µs+62µs) by DBIx::Class::Storage::DBI::new at line 193 of DBIx/Class/Storage/DBI.pm # once (900ns+0s) by DBIx::Class::Storage::DBI::connect_info at line 660 of DBIx/Class/Storage/DBI.pm # once (500ns+0s) by DBIx::Class::Storage::DBI::new at line 913 # once (0s+0s) by DBIx::Class::Storage::DBI::sql_maker at line 982 of DBIx/Class/Storage/DBI.pm # spent 125µs (39+86) within DBIx::Class::ResultSource::_relationships which was called: # once (39µs+86µs) by DBIx::Class::ResultSource::add_relationship at line 1349 of DBIx/Class/ResultSource.pm # spent 103µs (31+72) within DBIx::Class::Storage::DBI::on_connect_do which was called 3 times, avg 34µs/call: # once (30µs+72µs) by DBIx::Class::Storage::DBI::connect_info at line 652 of DBIx/Class/Storage/DBI.pm # once (600ns+0s) by DBIx::Class::Storage::DBI::_parse_connect_do at line 779 of DBIx/Class/Storage/DBI.pm # once (600ns+0s) by DBIx::Class::Storage::DBI::connect_info at line 913 # spent 162µs (50+113) within DBIx::Class::ResultSet::_result_class which was called 5 times, avg 32µs/call: # 2 times (47µs+113µs) by DBIx::Class::ResultSet::result_class at line 1569 of DBIx/Class/ResultSet.pm, avg 80µs/call # once (1µs+0s) by DBIx::Class::ResultSet::_construct_results at line 1367 of DBIx/Class/ResultSet.pm # once (800ns+0s) by DBIx::Class::ResultSet::result_class at line 1573 of DBIx/Class/ResultSet.pm # once (500ns+0s) by DBIx::Class::ResultSet::result_class at line 913 # spent 149µs (42+107) within DBIx::Class::Storage::DBI::Cursor::storage which was called 2 times, avg 75µs/call: # once (42µs+107µs) by DBIx::Class::Storage::DBI::Cursor::next at line 125 of DBIx/Class/Storage/DBI/Cursor.pm # once (500ns+0s) by DBIx::Class::Storage::DBI::Cursor::next at line 913 # spent 166µs (53+113) within DBIx::Class::Storage::DBI::disable_sth_caching which was called: # once (53µs+113µs) by DBIx::Class::Storage::DBI::_prepare_sth at line 1846 of DBIx/Class/Storage/DBI.pm # spent 140µs (38+102) within DBIx::Class::Row::in_storage which was called: # once (38µs+102µs) by DBIx::Class::Row::inflate_result at line 1312 of DBIx/Class/Row.pm # spent 273µs (71+202) within DBIx::Class::SQLMaker::name_sep which was called: # once (71µs+202µs) by DBIx::Class::Storage::DBIHacks::__ANON__[/usr/share/perl5/DBIx/Class/Storage/DBIHacks.pm:869] at line 850 of DBIx/Class/Storage/DBIHacks.pm # spent 88µs (28+60) within DBIx::Class::Storage::DBI::_sql_maker which was called 5 times, avg 18µs/call: # once (26µs+60µs) by DBIx::Class::Storage::DBI::connect_info at line 659 of DBIx/Class/Storage/DBI.pm # once (1µs+0s) by DBIx::Class::Storage::DBI::sql_maker at line 979 of DBIx/Class/Storage/DBI.pm # once (400ns+0s) by DBIx::Class::Storage::DBI::connect_info at line 913 # once (0s+0s) by DBIx::Class::Storage::DBI::sql_maker at line 1021 of DBIx/Class/Storage/DBI.pm # once (0s+0s) by DBIx::Class::Storage::DBI::sql_maker at line 1030 of DBIx/Class/Storage/DBI.pm # spent 106µs (31+75) within DBIx::Class::Storage::DBI::_connect_info which was called 3 times, avg 35µs/call: # once (30µs+75µs) by DBIx::Class::Storage::DBI::connect_info at line 620 of DBIx/Class/Storage/DBI.pm # once (600ns+0s) by DBIx::Class::Storage::DBI::connect_info at line 673 of DBIx/Class/Storage/DBI.pm # once (500ns+0s) by DBIx::Class::Storage::DBI::connect_info at line 913 # spent 168µs (51+117) within DBIx::Class::ResultSource::source_name which was called: # once (51µs+117µs) by DBIx::Class::Schema::load_namespaces at line 279 of DBIx/Class/Schema.pm # spent 162µs (43+119) within DBIx::Class::Storage::schema which was called: # once (43µs+119µs) by DBIx::Class::Storage::set_schema at line 74 of DBIx/Class/Storage.pm # spent 90µs (30+60) within DBIx::Class::Storage::DBI::unsafe which was called 3 times, avg 30µs/call: # once (27µs+60µs) by DBIx::Class::Storage::DBI::connect_info at line 652 of DBIx/Class/Storage/DBI.pm # once (3µs+0s) by Try::Tiny::try at line 1501 of DBIx/Class/Storage/DBI.pm # once (400ns+0s) by DBIx::Class::Storage::DBI::connect_info at line 913 # spent 96µs (29+67) within DBIx::Class::ResultSource::_columns which was called: # once (29µs+67µs) by DBIx::Class::ResultSource::add_columns at line 332 of DBIx/Class/ResultSource.pm # spent 100µs (32+67) within DBIx::Class::ResultSource::_ordered_columns which was called: # once (32µs+67µs) by DBIx::Class::ResultSource::add_columns at line 329 of DBIx/Class/ResultSource.pm # spent 97µs (32+66) within DBIx::Class::Storage::transaction_depth which was called: # once (32µs+66µs) by DBIx::Class::Storage::DBI::dbh_do at line 837 of DBIx/Class/Storage/DBI.pm # spent 102µs (30+72) within DBIx::Class::ResultSource::_unique_constraints which was called: # once (30µs+72µs) by DBIx::Class::ResultSource::unique_constraints at line 872 of DBIx/Class/ResultSource.pm # spent 98µs (36+62) within DBIx::Class::Storage::DBI::_dbic_connect_attributes which was called 2 times, avg 49µs/call: # once (36µs+62µs) by DBIx::Class::Storage::DBI::connect_info at line 671 of DBIx/Class/Storage/DBI.pm # once (500ns+0s) by DBIx::Class::Storage::DBI::connect_info at line 913 # spent 92µs (33+60) within DBIx::Class::Storage::DBI::_dbh_details which was called 6 times, avg 15µs/call: # once (26µs+60µs) by DBIx::Class::Storage::DBI::new at line 194 of DBIx/Class/Storage/DBI.pm # once (2µs+0s) by DBIx::Class::Storage::DBI::_dbi_attrs_for_bind at line 1788 of DBIx/Class/Storage/DBI.pm # once (1µs+0s) by DBIx::Class::Storage::DBI::_server_info at line 1150 of DBIx/Class/Storage/DBI.pm # once (1µs+0s) by DBIx::Class::Storage::DBI::_server_info at line 1112 of DBIx/Class/Storage/DBI.pm # once (800ns+0s) by DBIx::Class::Storage::DBI::_populate_dbh at line 1041 of DBIx/Class/Storage/DBI.pm # once (400ns+0s) by DBIx::Class::Storage::DBI::new at line 913 # spent 97µs (34+63) within DBIx::Class::Storage::DBI::_driver_determined which was called 3 times, avg 32µs/call: # once (32µs+63µs) by DBIx::Class::Storage::DBI::_determine_driver at line 1248 of DBIx/Class/Storage/DBI.pm # once (2µs+0s) by DBIx::Class::Storage::DBI::_determine_driver at line 1284 of DBIx/Class/Storage/DBI.pm # once (500ns+0s) by DBIx::Class::Storage::DBI::_determine_driver at line 913 # spent 163µs (52+110) within DBIx::Class::Storage::DBI::_dbh_autocommit which was called 3 times, avg 54µs/call: # once (51µs+110µs) by DBIx::Class::Storage::DBI::_connect at line 1531 of DBIx/Class/Storage/DBI.pm # once (800ns+0s) by DBIx::Class::Storage::DBI::_populate_dbh at line 1054 of DBIx/Class/Storage/DBI.pm # once (600ns+0s) by DBIx::Class::Storage::DBI::_connect at line 913 # spent 146µs (44+102) within DBIx::Class::Storage::debug which was called: # once (44µs+102µs) by DBIx::Class::Storage::DBI::_query_start at line 1764 of DBIx/Class/Storage/DBI.pm # spent 101µs (38+62) within DBIx::Class::Storage::DBI::_dbh which was called 15 times, avg 7µs/call: # 3 times (29µs+62µs) by C4::Context::preference at line 960 of DBIx/Class/Storage/DBI.pm, avg 30µs/call # once (2µs+0s) by DBIx::Class::Storage::DBI::_get_dbh at line 969 of DBIx/Class/Storage/DBI.pm # once (1µs+0s) by DBIx::Class::Storage::DBI::_execute at line 1811 of DBIx/Class/Storage/DBI.pm # once (1µs+0s) by DBIx::Class::Storage::DBI::_populate_dbh at line 1058 of DBIx/Class/Storage/DBI.pm # once (1µs+0s) by DBIx::Class::Storage::DBI::_populate_dbh at line 1046 of DBIx/Class/Storage/DBI.pm # once (800ns+0s) by DBIx::Class::Storage::DBI::mysql::_run_connection_actions at line 94 of DBIx/Class/Storage/DBI/mysql.pm # once (700ns+0s) by DBIx::Class::Storage::DBI::_determine_driver at line 1254 of DBIx/Class/Storage/DBI.pm # once (500ns+0s) by DBIx::Class::Storage::DBI::_ping at line 941 of DBIx/Class/Storage/DBI.pm # once (500ns+0s) by DBIx::Class::Storage::DBI::connected at line 929 of DBIx/Class/Storage/DBI.pm # once (500ns+0s) by DBIx::Class::Storage::DBI::_seems_connected at line 937 of DBIx/Class/Storage/DBI.pm # once (500ns+0s) by DBIx::Class::Storage::DBI::_populate_dbh at line 1039 of DBIx/Class/Storage/DBI.pm # once (400ns+0s) by C4::Context::preference at line 913 # once (300ns+0s) by DBIx::Class::Storage::DBI::_determine_driver at line 1255 of DBIx/Class/Storage/DBI.pm
my $ret = sub {
8122831µs my $current_class = length (ref ($_[0] ) ) ? ref ($_[0]) : $_[0];
813
8142850µs my $resolved_implementation = $resolved_methods->{$current_class}{$methname} ||= do {
81528463µs56246µs if (
# spent 246µs making 56 calls to UNIVERSAL::can, avg 4µs/call
816 ($current_class->can('get_simple')||0) == $original_simple_getter
817 &&
818 ($current_class->can('set_simple')||0) == $original_simple_setter
819 ) {
820 # nothing has changed, might as well use the XS crefs
821 #
822 # note that by the time this code executes, we already have
823 # *objects* (since XSA works on 'simple' only by definition).
824 # If someone is mucking with the symbol table *after* there
825 # are some objects already - look! many, shiny pieces! :)
826 #
827 # The weird breeder thingy is because XSA does not have an
828 # interface returning *just* a coderef, without installing it
829 # anywhere :(
83028138µs282.02ms Class::XSAccessor->import(
# spent 2.02ms making 28 calls to Class::XSAccessor::import, avg 72µs/call
831 replace => 1,
832 class => '__CAG__XSA__BREEDER__',
833 $maker_templates->{$type}{cxsa_call} => {
834 $methname => $field,
835 },
836 );
83728137µs2841µs __CAG__XSA__BREEDER__->can($methname);
# spent 41µs making 28 calls to UNIVERSAL::can, avg 1µs/call
838 }
839 else {
840 if (! $xsa_autodetected and ! $no_xsa_warned_classes->{$current_class}++) {
841 # not using Carp since the line where this happens doesn't mean much
842 warn 'Explicitly requested use of Class::XSAccessor disabled for objects of class '
843 . "'$current_class' inheriting from '$class' due to an overriden get_simple and/or "
844 . "set_simple\n";
845 }
846
847 do {
848 # that's faster than local
849 $USE_XS = 0;
850 my $c = $gen_accessor->($type, $class, 'simple', $field, $methname);
851 $USE_XS = 1;
852 $c;
853 };
854 }
855 };
856
857 # if after this shim was created someone wrapped it with an 'around',
858 # we can not blindly reinstall the method slot - we will destroy the
859 # wrapper. Silently chain execution further...
86028153µs2845µs if ( ! $cag_produced_crefs->{ $current_class->can($methname) || 0 } ) {
# spent 45µs making 28 calls to UNIVERSAL::can, avg 2µs/call
861
862 # older perls segfault if the cref behind the goto throws
863 # http://rt.perl.org/rt3/Public/Bug/Display.html?id=35878
864 return $resolved_implementation->(@_) if __CAG_ENV__::BROKEN_GOTO;
865
866 goto $resolved_implementation;
867 }
868
869
870 if (__CAG_ENV__::TRACK_UNDEFER_FAIL) {
871 my $deferred_calls_seen = do {
8722127µs224µs
# spent 18µs (11+6) within Class::Accessor::Grouped::BEGIN@872 which was called: # once (11µs+6µs) by base::import at line 872
no strict 'refs';
# spent 18µs making 1 call to Class::Accessor::Grouped::BEGIN@872 # spent 6µs making 1 call to strict::unimport
873 \%{"${current_class}::__cag_deferred_xs_shim_invocations"}
874 };
875 my @cframe = caller(0);
876
877 if (my $already_seen = $deferred_calls_seen->{$cframe[3]}) {
878 Carp::carp (
879 "Deferred version of method $cframe[3] invoked more than once (originally "
880 . "invoked at $already_seen). This is a strong indication your code has "
881 . 'cached the original ->can derived method coderef, and is using it instead '
882 . 'of the proper method re-lookup, causing minor performance regressions'
883 );
884 }
885 else {
886 $deferred_calls_seen->{$cframe[3]} = "$cframe[1] line $cframe[2]";
887 }
888 }
889
890 # install the resolved implementation into the code slot so we do not
891 # come here anymore (hopefully)
892 # since XSAccessor was available - so is Sub::Name
893 {
8943043µs218µs
# spent 13µs (8+5) within Class::Accessor::Grouped::BEGIN@894 which was called: # once (8µs+5µs) by base::import at line 894
no strict 'refs';
# spent 13µs making 1 call to Class::Accessor::Grouped::BEGIN@894 # spent 5µs making 1 call to strict::unimport
8952258µs227µs
# spent 18µs (10+8) within Class::Accessor::Grouped::BEGIN@895 which was called: # once (10µs+8µs) by base::import at line 895
no warnings 'redefine';
# spent 18µs making 1 call to Class::Accessor::Grouped::BEGIN@895 # spent 8µs making 1 call to warnings::unimport
896
8972828µs my $fq_name = "${current_class}::${methname}";
89828239µs28105µs *$fq_name = Sub::Name::subname($fq_name, $resolved_implementation);
# spent 105µs making 28 calls to Sub::Name::subname, avg 4µs/call
899 }
900
901 # now things are installed - one ref less to carry
9022823µs delete $resolved_methods->{$current_class}{$methname};
903
904 # but need to record it in the expectation registry *in case* it
905 # was cached via ->can for some moronic reason
90628162µs2840µs Scalar::Util::weaken( $cag_produced_crefs->{$resolved_implementation} = $resolved_implementation );
# spent 40µs making 28 calls to Scalar::Util::weaken, avg 1µs/call
907
908
909 # older perls segfault if the cref behind the goto throws
910 # http://rt.perl.org/rt3/Public/Bug/Display.html?id=35878
911 return $resolved_implementation->(@_) if __CAG_ENV__::BROKEN_GOTO;
912
91328480µs2814µs goto $resolved_implementation;
# spent 800ns making 1 call to DBIx::Class::SQLMaker::MySQL::name_sep # spent 800ns making 1 call to DBIx::Class::Storage::DBI::_conn_pid # spent 600ns making 1 call to DBIx::Class::Storage::DBI::_dbh_autocommit # spent 600ns making 1 call to DBIx::Class::Storage::DBI::mysql::disable_sth_caching # spent 600ns making 1 call to DBIx::Class::Storage::DBI::on_connect_do # spent 600ns making 1 call to Koha::Schema::Result::Systempreference::in_storage # spent 500ns making 1 call to DBIx::Class::ResultSet::_result_class # spent 500ns making 1 call to DBIx::Class::ResultSet::result_source # spent 500ns making 1 call to DBIx::Class::ResultSource::Table::_primaries # spent 500ns making 1 call to DBIx::Class::ResultSource::Table::_relationships # spent 500ns making 1 call to DBIx::Class::ResultSource::Table::_unique_constraints # spent 500ns making 1 call to DBIx::Class::ResultSource::Table::name # spent 500ns making 1 call to DBIx::Class::Storage::DBI::Cursor::storage # spent 500ns making 1 call to DBIx::Class::Storage::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 500ns making 1 call to DBIx::Class::Storage::DBI::mysql::on_connect_call # spent 500ns making 1 call to DBIx::Class::Storage::DBI::schema # spent 400ns making 1 call to DBIx::Class::ResultSource::Table::_columns # spent 400ns making 1 call to DBIx::Class::ResultSource::Table::_ordered_columns # spent 400ns making 1 call to DBIx::Class::ResultSource::Table::source_name # spent 400ns making 1 call to DBIx::Class::Storage::DBI::_dbh # spent 400ns making 1 call to DBIx::Class::Storage::DBI::_dbh_details # spent 400ns making 1 call to DBIx::Class::Storage::DBI::_sql_maker # spent 400ns making 1 call to DBIx::Class::Storage::DBI::mysql::debug # spent 400ns making 1 call to DBIx::Class::Storage::DBI::mysql::transaction_depth # spent 400ns making 1 call to DBIx::Class::Storage::DBI::unsafe
91490276µs };
915
91690338µs9063µs Scalar::Util::weaken($cag_produced_crefs->{$ret} = $ret);
# spent 63µs making 90 calls to Scalar::Util::weaken, avg 696ns/call
917
9189034µs $ret; # returning shim
919 }
920
921 # no Sub::Name - just install the coderefs directly (compiling every time)
922 elsif (__CAG_ENV__::NO_SUBNAME) {
923 my $src = $accessor_maker_cache->{source}{$type}{$group}{$field} ||=
924 $maker_templates->{$type}{pp_generator}->($group, $field);
925
926 $cag_eval->(
927 "no warnings 'redefine'; sub ${class}::${methname} { $src }; 1",
928 );
929
930 undef; # so that no further attempt will be made to install anything
931 }
932
933 # a coderef generator with a variable pad (returns a fresh cref on every invocation)
934 else {
93538549.85ms385413.4ms ($accessor_maker_cache->{pp}{$type}{$group}{$field} ||= do {
# spent 13.4ms making 3854 calls to Class::Accessor::Grouped::__ANON__[(eval 1000)[Class/Accessor/Grouped.pm:764]:5], avg 3µs/call
9369272.56ms9278.86ms my $src = $accessor_maker_cache->{source}{$type}{$group}{$field} ||=
# spent 8.86ms making 927 calls to Class::Accessor::Grouped::__ANON__[Class/Accessor/Grouped.pm:708], avg 10µs/call
937 $maker_templates->{$type}{pp_generator}->($group, $field);
938
9399271.91ms927455ms $cag_eval->( "sub { my \$dummy; sub { \$dummy if 0; $src } }" );
# spent 455ms making 927 calls to Class::Accessor::Grouped::__ANON__[Class/Accessor/Grouped.pm:774], avg 491µs/call
940 })->()
941 }
94212µs};
943
94419µs1;
 
# spent 5.47ms within Class::Accessor::Grouped::CORE:match which was called 3945 times, avg 1µs/call: # 1972 times (4.47ms+0s) by Class::Accessor::Grouped::_mk_group_accessors at line 97, avg 2µs/call # 1972 times (997µs+0s) by Class::Accessor::Grouped::_mk_group_accessors at line 137, avg 506ns/call # once (2µs+0s) by base::import at line 19
sub Class::Accessor::Grouped::CORE:match; # opcode
# spent 9µs within DBIx::Class::Storage::DBI::CORE:match which was called 2 times, avg 4µs/call: # once (5µs+0s) by DBIx::Class::Storage::DBI::_server_info at line 1130 of DBIx/Class/Storage/DBI.pm # once (4µs+0s) by DBIx::Class::Storage::DBI::_dbh_get_info at line 1163 of DBIx/Class/Storage/DBI.pm
sub DBIx::Class::Storage::DBI::CORE:match; # opcode
# spent 500ns within DBIx::Class::Storage::DBI::schema which was called: # once (500ns+0s) by DBIx::Class::Storage::set_schema at line 913
sub DBIx::Class::Storage::DBI::schema; # xsub
# spent 1µs within __CAG_ENV__::__ANON__ which was called 2 times, avg 600ns/call: # once (600ns+0s) by Class::Accessor::Grouped::BEGIN@31 at line 48 # once (600ns+0s) by Class::Accessor::Grouped::BEGIN@31 at line 54
sub __CAG_ENV__::__ANON__; # xsub