← Index
NYTProf Performance Profile   « block view • line view • sub view »
For bin/pan_genome_post_analysis
  Run on Fri Mar 27 11:43:32 2015
Reported on Fri Mar 27 11:46:02 2015

Filename/Users/ap13/perl5/lib/perl5/darwin-2level/Moose/Meta/Attribute.pm
StatementsExecuted 36886 statements in 82.4ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
1902221.9ms67.0msMoose::Meta::Attribute::::new Moose::Meta::Attribute::new
207118.15ms16.9msMoose::Meta::Attribute::::_eval_environment Moose::Meta::Attribute::_eval_environment
369216.53ms35.8msMoose::Meta::Attribute::::_inline_check_constraint Moose::Meta::Attribute::_inline_check_constraint
318436.21ms60.6msMoose::Meta::Attribute::::_inline_set_value Moose::Meta::Attribute::_inline_set_value
190115.96ms27.2msMoose::Meta::Attribute::::_process_options Moose::Meta::Attribute::_process_options
1115.73ms77.3msMoose::Meta::Attribute::::BEGIN@16 Moose::Meta::Attribute::BEGIN@16
207414.32ms258msMoose::Meta::Attribute::::_process_accessors Moose::Meta::Attribute::_process_accessors
189222.68ms69.5msMoose::Meta::Attribute::::interpolate_class_and_new Moose::Meta::Attribute::interpolate_class_and_new
1112.07ms2.88msMoose::Meta::Attribute::::BEGIN@6 Moose::Meta::Attribute::BEGIN@6
190112.01ms17.4msMoose::Meta::Attribute::::_process_isa_option Moose::Meta::Attribute::_process_isa_option
191211.90ms41.8msMoose::Meta::Attribute::::_inline_get_value Moose::Meta::Attribute::_inline_get_value
318111.89ms34.4msMoose::Meta::Attribute::::_inline_tc_code Moose::Meta::Attribute::_inline_tc_code
191211.74ms284msMoose::Meta::Attribute::::install_accessors Moose::Meta::Attribute::install_accessors
382211.62ms2.32msMoose::Meta::Attribute::::_inline_weaken_value Moose::Meta::Attribute::_inline_weaken_value
64111.48ms2.14msMoose::Meta::Attribute::::_inline_generate_default Moose::Meta::Attribute::_inline_generate_default
64111.44ms11.4msMoose::Meta::Attribute::::_inline_init_from_default Moose::Meta::Attribute::_inline_init_from_default
369211.32ms1.83msMoose::Meta::Attribute::::_inline_check_coercion Moose::Meta::Attribute::_inline_check_coercion
191111.23ms14.5msMoose::Meta::Attribute::::_inline_check_lazy Moose::Meta::Attribute::_inline_check_lazy
421311.17ms1.17msMoose::Meta::Attribute::::_inline_throw_exception Moose::Meta::Attribute::_inline_throw_exception
318111.03ms1.56msMoose::Meta::Attribute::::_writer_value_needs_copy Moose::Meta::Attribute::_writer_value_needs_copy
18911938µs938µsMoose::Meta::Attribute::::interpolate_class Moose::Meta::Attribute::interpolate_class
19011918µs918µsMoose::Meta::Attribute::::_process_is_option Moose::Meta::Attribute::_process_is_option
19111864µs1.29msMoose::Meta::Attribute::::_auto_deref Moose::Meta::Attribute::_auto_deref
19111827µs2.12msMoose::Meta::Attribute::::_inline_return_auto_deref Moose::Meta::Attribute::_inline_return_auto_deref
18911825µs974µsMoose::Meta::Attribute::::_check_associated_methods Moose::Meta::Attribute::_check_associated_methods
111732µs1.07msMoose::Meta::Attribute::::BEGIN@13 Moose::Meta::Attribute::BEGIN@13
111597µs856µsMoose::Meta::Attribute::::BEGIN@14 Moose::Meta::Attribute::BEGIN@14
6411514µs1.86msMoose::Meta::Attribute::::_inline_init_slot Moose::Meta::Attribute::_inline_init_slot
19011474µs474µsMoose::Meta::Attribute::::_process_does_option Moose::Meta::Attribute::_process_does_option
19011452µs462µsMoose::Meta::Attribute::::_process_lazy_build_option Moose::Meta::Attribute::_process_lazy_build_option
19011420µs420µsMoose::Meta::Attribute::::_process_lazy_option Moose::Meta::Attribute::_process_lazy_option
19011415µs415µsMoose::Meta::Attribute::::_process_required_option Moose::Meta::Attribute::_process_required_option
19011413µs413µsMoose::Meta::Attribute::::_process_coerce_option Moose::Meta::Attribute::_process_coerce_option
19011396µs396µsMoose::Meta::Attribute::::_process_trigger_option Moose::Meta::Attribute::_process_trigger_option
19011386µs386µsMoose::Meta::Attribute::::_process_auto_deref_option Moose::Meta::Attribute::_process_auto_deref_option
20711311µs311µsMoose::Meta::Attribute::::accessor_metaclass Moose::Meta::Attribute::accessor_metaclass
5211283µs427µsMoose::Meta::Attribute::::_inline_get_old_value_for_trigger Moose::Meta::Attribute::_inline_get_old_value_for_trigger
5211282µs496µsMoose::Meta::Attribute::::_inline_check_required Moose::Meta::Attribute::_inline_check_required
5211262µs375µsMoose::Meta::Attribute::::_inline_trigger Moose::Meta::Attribute::_inline_trigger
1901197µs97µsMoose::Meta::Attribute::::CORE:sort Moose::Meta::Attribute::CORE:sort (opcode)
11121µs68µsMoose::Meta::Attribute::::BEGIN@8 Moose::Meta::Attribute::BEGIN@8
21121µs255µsMoose::Meta::Attribute::::remove_accessors Moose::Meta::Attribute::remove_accessors
11113µs26µsMoose::Meta::TypeCoercion::::BEGIN@1 Moose::Meta::TypeCoercion::BEGIN@1
11111µs46µsMoose::Meta::Attribute::::BEGIN@21 Moose::Meta::Attribute::BEGIN@21
11111µs50µsMoose::Meta::Attribute::::BEGIN@7 Moose::Meta::Attribute::BEGIN@7
11110µs6.36msMoose::Meta::Attribute::::BEGIN@19 Moose::Meta::Attribute::BEGIN@19
81110µs10µsMoose::Meta::Attribute::::CORE:match Moose::Meta::Attribute::CORE:match (opcode)
11110µs18µsMoose::Meta::Attribute::::BEGIN@12 Moose::Meta::Attribute::BEGIN@12
11110µs42µsMoose::Meta::Attribute::::BEGIN@9 Moose::Meta::Attribute::BEGIN@9
1119µs146µsMoose::Meta::Attribute::::BEGIN@15 Moose::Meta::Attribute::BEGIN@15
1119µs9µsMoose::Meta::Attribute::::BEGIN@17 Moose::Meta::Attribute::BEGIN@17
1118µs12µsMoose::Meta::TypeCoercion::::BEGIN@2 Moose::Meta::TypeCoercion::BEGIN@2
1115µs5µsMoose::Meta::Attribute::::BEGIN@10 Moose::Meta::Attribute::BEGIN@10
0000s0sMoose::Meta::Attribute::Custom::Moose::::register_implementationMoose::Meta::Attribute::Custom::Moose::register_implementation
0000s0sMoose::Meta::Attribute::::__ANON__[:1115] Moose::Meta::Attribute::__ANON__[:1115]
0000s0sMoose::Meta::Attribute::::__ANON__[:139] Moose::Meta::Attribute::__ANON__[:139]
0000s0sMoose::Meta::Attribute::::__ANON__[:312] Moose::Meta::Attribute::__ANON__[:312]
0000s0sMoose::Meta::Attribute::::__ANON__[:39] Moose::Meta::Attribute::__ANON__[:39]
0000s0sMoose::Meta::Attribute::::__ANON__[:542] Moose::Meta::Attribute::__ANON__[:542]
0000s0sMoose::Meta::Attribute::::_call_builder Moose::Meta::Attribute::_call_builder
0000s0sMoose::Meta::Attribute::::_canonicalize_handles Moose::Meta::Attribute::_canonicalize_handles
0000s0sMoose::Meta::Attribute::::_coerce_and_verify Moose::Meta::Attribute::_coerce_and_verify
0000s0sMoose::Meta::Attribute::::_find_delegate_metaclass Moose::Meta::Attribute::_find_delegate_metaclass
0000s0sMoose::Meta::Attribute::::_get_delegate_method_list Moose::Meta::Attribute::_get_delegate_method_list
0000s0sMoose::Meta::Attribute::::_inline_copy_value Moose::Meta::Attribute::_inline_copy_value
0000s0sMoose::Meta::Attribute::::_make_delegation_method Moose::Meta::Attribute::_make_delegation_method
0000s0sMoose::Meta::Attribute::::_make_initializer_writer_callback Moose::Meta::Attribute::_make_initializer_writer_callback
0000s0sMoose::Meta::Attribute::::_weaken_value Moose::Meta::Attribute::_weaken_value
0000s0sMoose::Meta::Attribute::::clone Moose::Meta::Attribute::clone
0000s0sMoose::Meta::Attribute::::clone_and_inherit_options Moose::Meta::Attribute::clone_and_inherit_options
0000s0sMoose::Meta::Attribute::::delegation_metaclass Moose::Meta::Attribute::delegation_metaclass
0000s0sMoose::Meta::Attribute::::does Moose::Meta::Attribute::does
0000s0sMoose::Meta::Attribute::::get_value Moose::Meta::Attribute::get_value
0000s0sMoose::Meta::Attribute::::illegal_options_for_inheritance Moose::Meta::Attribute::illegal_options_for_inheritance
0000s0sMoose::Meta::Attribute::::initialize_instance_slot Moose::Meta::Attribute::initialize_instance_slot
0000s0sMoose::Meta::Attribute::::install_delegation Moose::Meta::Attribute::install_delegation
0000s0sMoose::Meta::Attribute::::remove_delegation Moose::Meta::Attribute::remove_delegation
0000s0sMoose::Meta::Attribute::::set_value Moose::Meta::Attribute::set_value
0000s0sMoose::Meta::Attribute::::verify_against_type_constraint Moose::Meta::Attribute::verify_against_type_constraint
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1228µs239µs
# spent 26µs (13+13) within Moose::Meta::TypeCoercion::BEGIN@1 which was called: # once (13µs+13µs) by Moose::Meta::TypeCoercion::BEGIN@8 at line 1
use strict;
# spent 26µs making 1 call to Moose::Meta::TypeCoercion::BEGIN@1 # spent 13µs making 1 call to strict::import
2241µs217µs
# spent 12µs (8+4) within Moose::Meta::TypeCoercion::BEGIN@2 which was called: # once (8µs+4µs) by Moose::Meta::TypeCoercion::BEGIN@8 at line 2
use warnings;
# spent 12µs making 1 call to Moose::Meta::TypeCoercion::BEGIN@2 # spent 4µs making 1 call to warnings::import
3package Moose::Meta::Attribute;
412µsour $VERSION = '2.1403';
5
62144µs12.88ms
# spent 2.88ms (2.07+812µs) within Moose::Meta::Attribute::BEGIN@6 which was called: # once (2.07ms+812µs) by Moose::Meta::TypeCoercion::BEGIN@8 at line 6
use B ();
# spent 2.88ms making 1 call to Moose::Meta::Attribute::BEGIN@6
7242µs289µs
# spent 50µs (11+39) within Moose::Meta::Attribute::BEGIN@7 which was called: # once (11µs+39µs) by Moose::Meta::TypeCoercion::BEGIN@8 at line 7
use Scalar::Util 'blessed';
# spent 50µs making 1 call to Moose::Meta::Attribute::BEGIN@7 # spent 39µs making 1 call to Exporter::import
8348µs392µs
# spent 68µs (21+46) within Moose::Meta::Attribute::BEGIN@8 which was called: # once (21µs+46µs) by Moose::Meta::TypeCoercion::BEGIN@8 at line 8
use List::Util 1.33 'any';
# spent 68µs making 1 call to Moose::Meta::Attribute::BEGIN@8 # spent 13µs making 1 call to UNIVERSAL::VERSION # spent 11µs making 1 call to List::Util::import
9224µs274µs
# spent 42µs (10+32) within Moose::Meta::Attribute::BEGIN@9 which was called: # once (10µs+32µs) by Moose::Meta::TypeCoercion::BEGIN@8 at line 9
use Try::Tiny;
# spent 42µs making 1 call to Moose::Meta::Attribute::BEGIN@9 # spent 32µs making 1 call to Exporter::import
10228µs15µs
# spent 5µs within Moose::Meta::Attribute::BEGIN@10 which was called: # once (5µs+0s) by Moose::Meta::TypeCoercion::BEGIN@8 at line 10
use overload ();
# spent 5µs making 1 call to Moose::Meta::Attribute::BEGIN@10
11
12222µs227µs
# spent 18µs (10+8) within Moose::Meta::Attribute::BEGIN@12 which was called: # once (10µs+8µs) by Moose::Meta::TypeCoercion::BEGIN@8 at line 12
use Moose::Deprecated;
132128µs11.07ms
# spent 1.07ms (732µs+341µs) within Moose::Meta::Attribute::BEGIN@13 which was called: # once (732µs+341µs) by Moose::Meta::TypeCoercion::BEGIN@8 at line 13
use Moose::Meta::Method::Accessor;
# spent 1.07ms making 1 call to Moose::Meta::Attribute::BEGIN@13
142113µs1856µs
# spent 856µs (597+259) within Moose::Meta::Attribute::BEGIN@14 which was called: # once (597µs+259µs) by Moose::Meta::TypeCoercion::BEGIN@8 at line 14
use Moose::Meta::Method::Delegation;
# spent 856µs making 1 call to Moose::Meta::Attribute::BEGIN@14
15227µs2283µs
# spent 146µs (9+137) within Moose::Meta::Attribute::BEGIN@15 which was called: # once (9µs+137µs) by Moose::Meta::TypeCoercion::BEGIN@8 at line 15
use Moose::Util 'throw_exception';
# spent 146µs making 1 call to Moose::Meta::Attribute::BEGIN@15 # spent 137µs making 1 call to Sub::Exporter::__ANON__[Sub/Exporter.pm:337]
162126µs177.3ms
# spent 77.3ms (5.73+71.5) within Moose::Meta::Attribute::BEGIN@16 which was called: # once (5.73ms+71.5ms) by Moose::Meta::TypeCoercion::BEGIN@8 at line 16
use Moose::Util::TypeConstraints ();
# spent 77.3ms making 1 call to Moose::Meta::Attribute::BEGIN@16
17227µs19µs
# spent 9µs within Moose::Meta::Attribute::BEGIN@17 which was called: # once (9µs+0s) by Moose::Meta::TypeCoercion::BEGIN@8 at line 17
use Class::MOP::MiniTrait;
# spent 9µs making 1 call to Moose::Meta::Attribute::BEGIN@17
18
19254µs212.7ms
# spent 6.36ms (10µs+6.35) within Moose::Meta::Attribute::BEGIN@19 which was called: # once (10µs+6.35ms) by Moose::Meta::TypeCoercion::BEGIN@8 at line 19
use parent 'Class::MOP::Attribute', 'Moose::Meta::Mixin::AttributeCore';
# spent 6.36ms making 1 call to Moose::Meta::Attribute::BEGIN@19 # spent 6.35ms making 1 call to parent::import
20
2125.66ms281µs
# spent 46µs (11+35) within Moose::Meta::Attribute::BEGIN@21 which was called: # once (11µs+35µs) by Moose::Meta::TypeCoercion::BEGIN@8 at line 21
use Carp 'confess';
# spent 46µs making 1 call to Moose::Meta::Attribute::BEGIN@21 # spent 35µs making 1 call to Exporter::import
22
2317µs11.81msClass::MOP::MiniTrait::apply(__PACKAGE__, 'Moose::Meta::Object::Trait');
# spent 1.81ms making 1 call to Class::MOP::MiniTrait::apply
24
25111µs3656µs__PACKAGE__->meta->add_attribute('traits' => (
# spent 632µs making 1 call to Class::MOP::Mixin::HasAttributes::add_attribute # spent 12µs making 1 call to Class::MOP::Object::meta # spent 11µs making 1 call to Class::MOP::_definition_context
26 reader => 'applied_traits',
27 predicate => 'has_applied_traits',
28 Class::MOP::_definition_context(),
29));
30
31# we need to have a ->does method in here to
32# more easily support traits, and the introspection
33# of those traits. We extend the does check to look
34# for metatrait aliases.
35sub does {
36 my ($self, $role_name) = @_;
37 my $name = try {
38 Moose::Util::resolve_metatrait_alias(Attribute => $role_name)
39 };
40 return 0 if !defined($name); # failed to load class
41 return $self->Moose::Object::does($name);
42}
43
44
# spent 1.17ms within Moose::Meta::Attribute::_inline_throw_exception which was called 421 times, avg 3µs/call: # 354 times (934µs+0s) by Moose::Meta::Attribute::_inline_check_constraint at line 686, avg 3µs/call # 64 times (227µs+0s) by Moose::Meta::Attribute::_inline_generate_default at line 919, avg 4µs/call # 3 times (10µs+0s) by Moose::Meta::Attribute::_inline_check_required at line 634, avg 4µs/call
sub _inline_throw_exception {
45421306µs my ( $self, $exception_type, $throw_args ) = @_;
464211.16ms return 'die Module::Runtime::use_module("Moose::Exception::' . $exception_type . '")->new(' . ($throw_args || '') . ')';
47}
48
49
# spent 67.0ms (21.9+45.1) within Moose::Meta::Attribute::new which was called 190 times, avg 353µs/call: # 189 times (21.8ms+44.1ms) by Moose::Meta::Attribute::interpolate_class_and_new at line 99, avg 349µs/call # once (147µs+907µs) by Moose::BEGIN@26 at line 19 of Moose/Meta/TypeCoercion.pm
sub new {
50190379µs my ($class, $name, %options) = @_;
51190529µs19027.2ms $class->_process_options($name, \%options) unless $options{__hack_no_process_options}; # used from clone()... YECHKKK FIXME ICKY YUCK GROSS
# spent 27.2ms making 190 calls to Moose::Meta::Attribute::_process_options, avg 143µs/call
52
53190100µs delete $options{__hack_no_process_options};
54
55 my %attrs =
56 ( map { $_ => 1 }
57532012.5ms53203.00ms grep { defined }
# spent 3.00ms making 5320 calls to Class::MOP::Mixin::AttributeCore::init_arg, avg 565ns/call
581906.79ms3805.19ms map { $_->init_arg() }
# spent 2.61ms making 190 calls to Class::MOP::Object::meta, avg 14µs/call # spent 2.49ms making 189 calls to Class::MOP::Class::Immutable::Class::MOP::Class::get_all_attributes, avg 13µs/call # spent 99µs making 1 call to Class::MOP::Class::get_all_attributes
59 $class->meta()->get_all_attributes()
60 );
61
621901.14ms19097µs my @bad = sort grep { ! $attrs{$_} } keys %options;
# spent 97µs making 190 calls to Moose::Meta::Attribute::CORE:sort, avg 512ns/call
63
6419067µs if (@bad)
65 {
66 my $s = @bad > 1 ? 's' : '';
67 my $list = join "', '", @bad;
68
69 my $package = $options{definition_context}{package};
70 my $context = $options{definition_context}{context}
71 || 'attribute constructor';
72 my $type = $options{definition_context}{type} || 'class';
73
74 my $location = '';
75 if (defined($package)) {
76 $location = " in ";
77 $location .= "$type " if $type;
78 $location .= $package;
79 }
80
81 Carp::cluck "Found unknown argument$s '$list' in the $context for '$name'$location";
82 }
83
841901.98ms1909.56ms return $class->SUPER::new($name, %options);
# spent 9.56ms making 190 calls to Class::MOP::Attribute::new, avg 50µs/call
85}
86
87
# spent 69.5ms (2.68+66.9) within Moose::Meta::Attribute::interpolate_class_and_new which was called 189 times, avg 368µs/call: # 172 times (2.40ms+60.4ms) by Moose::Meta::Class::_process_new_attribute at line 712 of Moose/Meta/Class.pm, avg 365µs/call # 17 times (271µs+6.48ms) by Moose::Meta::Role::Attribute::attribute_for_class at line 90 of Moose/Meta/Role/Attribute.pm, avg 397µs/call
sub interpolate_class_and_new {
88189100µs my $class = shift;
8918948µs my $name = shift;
90
91189121µs throw_exception( MustPassEvenNumberOfAttributeOptions => attribute_name => $name,
92 options => \@_
93 )
94 if @_ % 2 == 1;
95
96189374µs my %args = @_;
97
98189627µs189938µs my ( $new_class, @traits ) = $class->interpolate_class(\%args);
# spent 938µs making 189 calls to Moose::Meta::Attribute::interpolate_class, avg 5µs/call
991891.16ms18965.9ms $new_class->new($name, %args, ( scalar(@traits) ? ( traits => \@traits ) : () ) );
# spent 65.9ms making 189 calls to Moose::Meta::Attribute::new, avg 349µs/call
100}
101
102
# spent 938µs within Moose::Meta::Attribute::interpolate_class which was called 189 times, avg 5µs/call: # 189 times (938µs+0s) by Moose::Meta::Attribute::interpolate_class_and_new at line 98, avg 5µs/call
sub interpolate_class {
103189109µs my ($class, $options) = @_;
104
10518970µs $class = ref($class) || $class;
106
107189131µs if ( my $metaclass_name = delete $options->{metaclass} ) {
108 my $new_class = Moose::Util::resolve_metaclass_alias( Attribute => $metaclass_name );
109
110 if ( $class ne $new_class ) {
111 if ( $new_class->can("interpolate_class") ) {
112 return $new_class->interpolate_class($options);
113 } else {
114 $class = $new_class;
115 }
116 }
117 }
118
11918927µs my @traits;
120
12118997µs if (my $traits = $options->{traits}) {
122 my $i = 0;
123 my $has_foreign_options = 0;
124
125 while ($i < @$traits) {
126 my $trait = $traits->[$i++];
127 next if ref($trait); # options to a trait we discarded
128
129 $trait = Moose::Util::resolve_metatrait_alias(Attribute => $trait)
130 || $trait;
131
132 next if $class->does($trait);
133
134 push @traits, $trait;
135
136 # are there options?
137 if ($traits->[$i] && ref($traits->[$i])) {
138 $has_foreign_options = 1
139 if any { $_ ne '-alias' && $_ ne '-excludes' } keys %{ $traits->[$i] };
140
141 push @traits, $traits->[$i++];
142 }
143 }
144
145 if (@traits) {
146 my %options = (
147 superclasses => [ $class ],
148 roles => [ @traits ],
149 );
150
151 if ($has_foreign_options) {
152 $options{weaken} = 0;
153 }
154 else {
155 $options{cache} = 1;
156 }
157
158 my $anon_class = Moose::Meta::Class->create_anon_class(%options);
159 $class = $anon_class->name;
160 }
161 }
162
163189604µs return ( wantarray ? ( $class, @traits ) : $class );
164}
165
166# ...
167
168# method-generating options shouldn't be overridden
169sub illegal_options_for_inheritance {
170 qw(reader writer accessor clearer predicate)
171}
172
173# NOTE/TODO
174# This method *must* be able to handle
175# Class::MOP::Attribute instances as
176# well. Yes, I know that is wrong, but
177# apparently we didn't realize it was
178# doing that and now we have some code
179# which is dependent on it. The real
180# solution of course is to push this
181# feature back up into Class::MOP::Attribute
182# but I not right now, I am too lazy.
183# However if you are reading this and
184# looking for something to do,.. please
185# be my guest.
186# - stevan
187sub clone_and_inherit_options {
188 my ($self, %options) = @_;
189
190 # NOTE:
191 # we may want to extends a Class::MOP::Attribute
192 # in which case we need to be able to use the
193 # core set of legal options that have always
194 # been here. But we allows Moose::Meta::Attribute
195 # instances to changes them.
196 # - SL
197 my @illegal_options = $self->can('illegal_options_for_inheritance')
198 ? $self->illegal_options_for_inheritance
199 : ();
200
201 my @found_illegal_options = grep { exists $options{$_} && exists $self->{$_} ? $_ : undef } @illegal_options;
202 (scalar @found_illegal_options == 0)
203 || throw_exception( IllegalInheritedOptions => illegal_options => \@found_illegal_options,
204 params => \%options
205 );
206
207 $self->_process_isa_option( $self->name, \%options );
208 $self->_process_does_option( $self->name, \%options );
209
210 # NOTE:
211 # this doesn't apply to Class::MOP::Attributes,
212 # so we can ignore it for them.
213 # - SL
214 if ($self->can('interpolate_class')) {
215 ( $options{metaclass}, my @traits ) = $self->interpolate_class(\%options);
216
217 my %seen;
218 my @all_traits = grep { $seen{$_}++ } @{ $self->applied_traits || [] }, @traits;
219 $options{traits} = \@all_traits if @all_traits;
220 }
221
222 # This method can be called on a CMOP::Attribute object, so we need to
223 # make sure we can call this method.
224 $self->_process_lazy_build_option( $self->name, \%options )
225 if $self->can('_process_lazy_build_option');
226
227 $self->clone(%options);
228}
229
230sub clone {
231 my ( $self, %params ) = @_;
232
233 my $class = delete $params{metaclass} || ref $self;
234
235 my ( @init, @non_init );
236
237 foreach my $attr ( grep { $_->has_value($self) } Class::MOP::class_of($self)->get_all_attributes ) {
238 push @{ $attr->has_init_arg ? \@init : \@non_init }, $attr;
239 }
240
241 my %new_params = ( ( map { $_->init_arg => $_->get_value($self) } @init ), %params );
242
243 my $name = delete $new_params{name};
244
245 my $clone = $class->new($name, %new_params, __hack_no_process_options => 1 );
246
247 foreach my $attr ( @non_init ) {
248 $attr->set_value($clone, $attr->get_value($self));
249 }
250
251 return $clone;
252}
253
254
# spent 27.2ms (5.96+21.2) within Moose::Meta::Attribute::_process_options which was called 190 times, avg 143µs/call: # 190 times (5.96ms+21.2ms) by Moose::Meta::Attribute::new at line 51, avg 143µs/call
sub _process_options {
255190121µs my ( $class, $name, $options ) = @_;
256
257190418µs190918µs $class->_process_is_option( $name, $options );
# spent 918µs making 190 calls to Moose::Meta::Attribute::_process_is_option, avg 5µs/call
258190568µs19017.4ms $class->_process_isa_option( $name, $options );
# spent 17.4ms making 190 calls to Moose::Meta::Attribute::_process_isa_option, avg 91µs/call
259190495µs190474µs $class->_process_does_option( $name, $options );
# spent 474µs making 190 calls to Moose::Meta::Attribute::_process_does_option, avg 2µs/call
260190418µs190413µs $class->_process_coerce_option( $name, $options );
# spent 413µs making 190 calls to Moose::Meta::Attribute::_process_coerce_option, avg 2µs/call
261190359µs190396µs $class->_process_trigger_option( $name, $options );
# spent 396µs making 190 calls to Moose::Meta::Attribute::_process_trigger_option, avg 2µs/call
262190389µs190386µs $class->_process_auto_deref_option( $name, $options );
# spent 386µs making 190 calls to Moose::Meta::Attribute::_process_auto_deref_option, avg 2µs/call
263190413µs190462µs $class->_process_lazy_build_option( $name, $options );
# spent 462µs making 190 calls to Moose::Meta::Attribute::_process_lazy_build_option, avg 2µs/call
264190389µs190420µs $class->_process_lazy_option( $name, $options );
# spent 420µs making 190 calls to Moose::Meta::Attribute::_process_lazy_option, avg 2µs/call
265190754µs190415µs $class->_process_required_option( $name, $options );
# spent 415µs making 190 calls to Moose::Meta::Attribute::_process_required_option, avg 2µs/call
266}
267
268
# spent 918µs within Moose::Meta::Attribute::_process_is_option which was called 190 times, avg 5µs/call: # 190 times (918µs+0s) by Moose::Meta::Attribute::_process_options at line 257, avg 5µs/call
sub _process_is_option {
269190151µs my ( $class, $name, $options ) = @_;
270
27119072µs return unless $options->{is};
272
273 ### -------------------------
274 ## is => ro, writer => _foo # turns into (reader => foo, writer => _foo) as before
275 ## is => rw, writer => _foo # turns into (reader => foo, writer => _foo)
276 ## is => rw, accessor => _foo # turns into (accessor => _foo)
277 ## is => ro, accessor => _foo # error, accesor is rw
278 ### -------------------------
279
280189568µs if ( $options->{is} eq 'ro' ) {
28113946µs throw_exception("AccessorMustReadWrite" => attribute_name => $name,
282 params => $options,
283 )
284 if exists $options->{accessor};
285139123µs $options->{reader} ||= $name;
286 }
287 elsif ( $options->{is} eq 'rw' ) {
288 if ( $options->{writer} ) {
289 $options->{reader} ||= $name;
290 }
291 else {
2925043µs $options->{accessor} ||= $name;
293 }
294 }
295 elsif ( $options->{is} eq 'bare' ) {
296 return;
297 # do nothing, but don't complain (later) about missing methods
298 }
299 else {
300 throw_exception( InvalidValueForIs => attribute_name => $name,
301 params => $options,
302 );
303 }
304}
305
306
# spent 17.4ms (2.01+15.3) within Moose::Meta::Attribute::_process_isa_option which was called 190 times, avg 91µs/call: # 190 times (2.01ms+15.3ms) by Moose::Meta::Attribute::_process_options at line 258, avg 91µs/call
sub _process_isa_option {
307190109µs my ( $class, $name, $options ) = @_;
308
309190106µs return unless exists $options->{isa};
310
31117653µs if ( exists $options->{does} ) {
312 if ( try { $options->{isa}->can('does') } ) {
313 ( $options->{isa}->does( $options->{does} ) )
314 || throw_exception( IsaDoesNotDoTheRole => attribute_name => $name,
315 params => $options,
316 );
317 }
318 else {
319 throw_exception( IsaLacksDoesMethod => attribute_name => $name,
320 params => $options,
321 );
322 }
323 }
324
325 # allow for anon-subtypes here ...
326 #
327 # Checking for Specio explicitly is completely revolting. At some point
328 # this needs to be refactored so that Moose core defines a standard type
329 # API that all types must implement. Unfortunately, the current core API
330 # is _not_ the right API, so we probably need to A) come up with the new
331 # API (Specio is a good start); B) refactor the core types to implement
332 # that API; C) do duck type checking on type objects.
3331761.19ms352190µs if ( blessed( $options->{isa} )
# spent 190µs making 352 calls to Scalar::Util::blessed, avg 541ns/call
334 && $options->{isa}->isa('Moose::Meta::TypeConstraint') ) {
335 $options->{type_constraint} = $options->{isa};
336 }
337 elsif (
338 blessed( $options->{isa} )
339 && $options->{isa}->can('does')
340 && $options->{isa}->does('Specio::Constraint::Role::Interface')
341 ) {
342 $options->{type_constraint} = $options->{isa};
343 }
344 else {
345176693µs17615.2ms $options->{type_constraint}
# spent 15.2ms making 176 calls to Moose::Util::TypeConstraints::find_or_create_isa_type_constraint, avg 86µs/call
346 = Moose::Util::TypeConstraints::find_or_create_isa_type_constraint(
347 $options->{isa},
348 { package_defined_in => $options->{definition_context}->{package} }
349 );
350 }
351}
352
353
# spent 474µs within Moose::Meta::Attribute::_process_does_option which was called 190 times, avg 2µs/call: # 190 times (474µs+0s) by Moose::Meta::Attribute::_process_options at line 259, avg 2µs/call
sub _process_does_option {
354190142µs my ( $class, $name, $options ) = @_;
355
356190467µs return unless exists $options->{does} && ! exists $options->{isa};
357
358 # allow for anon-subtypes here ...
359 if ( blessed( $options->{does} )
360 && $options->{does}->isa('Moose::Meta::TypeConstraint') ) {
361 $options->{type_constraint} = $options->{does};
362 }
363 else {
364 $options->{type_constraint}
365 = Moose::Util::TypeConstraints::find_or_create_does_type_constraint(
366 $options->{does},
367 { package_defined_in => $options->{definition_context}->{package} }
368 );
369 }
370}
371
372
# spent 413µs within Moose::Meta::Attribute::_process_coerce_option which was called 190 times, avg 2µs/call: # 190 times (413µs+0s) by Moose::Meta::Attribute::_process_options at line 260, avg 2µs/call
sub _process_coerce_option {
373190119µs my ( $class, $name, $options ) = @_;
374
375190391µs return unless $options->{coerce};
376
377 ( exists $options->{type_constraint} )
378 || throw_exception( CoercionNeedsTypeConstraint => attribute_name => $name,
379 params => $options,
380 );
381
382 throw_exception( CannotCoerceAWeakRef => attribute_name => $name,
383 params => $options,
384 )
385 if $options->{weak_ref};
386
387 unless ( $options->{type_constraint}->has_coercion ) {
388 my $type = $options->{type_constraint}->name;
389
390 throw_exception( CannotCoerceAttributeWhichHasNoCoercion => attribute_name => $name,
391 type_name => $type,
392 params => $options
393 );
394 }
395}
396
397
# spent 396µs within Moose::Meta::Attribute::_process_trigger_option which was called 190 times, avg 2µs/call: # 190 times (396µs+0s) by Moose::Meta::Attribute::_process_options at line 261, avg 2µs/call
sub _process_trigger_option {
398190139µs my ( $class, $name, $options ) = @_;
399
400190386µs return unless exists $options->{trigger};
401
402 ( 'CODE' eq ref $options->{trigger} )
403 || throw_exception( TriggerMustBeACodeRef => attribute_name => $name,
404 params => $options,
405 );
406}
407
408
# spent 386µs within Moose::Meta::Attribute::_process_auto_deref_option which was called 190 times, avg 2µs/call: # 190 times (386µs+0s) by Moose::Meta::Attribute::_process_options at line 262, avg 2µs/call
sub _process_auto_deref_option {
409190108µs my ( $class, $name, $options ) = @_;
410
411190359µs return unless $options->{auto_deref};
412
413 ( exists $options->{type_constraint} )
414 || throw_exception( CannotAutoDerefWithoutIsa => attribute_name => $name,
415 params => $options,
416 );
417
418 ( $options->{type_constraint}->is_a_type_of('ArrayRef')
419 || $options->{type_constraint}->is_a_type_of('HashRef') )
420 || throw_exception( AutoDeRefNeedsArrayRefOrHashRef => attribute_name => $name,
421 params => $options,
422 );
423}
424
425
# spent 462µs (452+10) within Moose::Meta::Attribute::_process_lazy_build_option which was called 190 times, avg 2µs/call: # 190 times (452µs+10µs) by Moose::Meta::Attribute::_process_options at line 263, avg 2µs/call
sub _process_lazy_build_option {
426190118µs my ( $class, $name, $options ) = @_;
427
428190396µs return unless $options->{lazy_build};
429
43083µs throw_exception( CannotUseLazyBuildAndDefaultSimultaneously => attribute_name => $name,
431 params => $options,
432 )
433 if exists $options->{default};
434
43585µs $options->{lazy} = 1;
43689µs $options->{builder} ||= "_build_${name}";
437
438853µs810µs if ( $name =~ /^_/ ) {
# spent 10µs making 8 calls to Moose::Meta::Attribute::CORE:match, avg 1µs/call
43987µs $options->{clearer} ||= "_clear${name}";
44086µs $options->{predicate} ||= "_has${name}";
441 }
442 else {
443 $options->{clearer} ||= "clear_${name}";
444 $options->{predicate} ||= "has_${name}";
445 }
446}
447
448
# spent 420µs within Moose::Meta::Attribute::_process_lazy_option which was called 190 times, avg 2µs/call: # 190 times (420µs+0s) by Moose::Meta::Attribute::_process_options at line 264, avg 2µs/call
sub _process_lazy_option {
449190126µs my ( $class, $name, $options ) = @_;
450
451190273µs return unless $options->{lazy};
452
45364145µs ( exists $options->{default} || defined $options->{builder} )
454 || throw_exception( LazyAttributeNeedsADefault => params => $options,
455 attribute_name => $name,
456 );
457}
458
459
# spent 415µs within Moose::Meta::Attribute::_process_required_option which was called 190 times, avg 2µs/call: # 190 times (415µs+0s) by Moose::Meta::Attribute::_process_options at line 265, avg 2µs/call
sub _process_required_option {
460190119µs my ( $class, $name, $options ) = @_;
461
462190403µs if (
463 $options->{required}
464 && !(
465 ( !exists $options->{init_arg} || defined $options->{init_arg} )
466 || exists $options->{default}
467 || defined $options->{builder}
468 )
469 ) {
470 throw_exception( RequiredAttributeNeedsADefault => params => $options,
471 attribute_name => $name,
472 );
473 }
474}
475
476sub initialize_instance_slot {
477 my ($self, $meta_instance, $instance, $params) = @_;
478 my $init_arg = $self->init_arg();
479 # try to fetch the init arg from the %params ...
480
481 my $val;
482 my $value_is_set;
483 if ( defined($init_arg) and exists $params->{$init_arg}) {
484 $val = $params->{$init_arg};
485 $value_is_set = 1;
486 }
487 else {
488 # skip it if it's lazy
489 return if $self->is_lazy;
490 # and die if it's required and doesn't have a default value
491 my $class_name = blessed( $instance );
492 throw_exception(AttributeIsRequired => attribute_name => $self->name,
493 class_name => $class_name,
494 params => $params,
495 )
496 if $self->is_required && !$self->has_default && !$self->has_builder;
497
498 # if nothing was in the %params, we can use the
499 # attribute's default value (if it has one)
500 if ($self->has_default) {
501 $val = $self->default($instance);
502 $value_is_set = 1;
503 }
504 elsif ($self->has_builder) {
505 $val = $self->_call_builder($instance);
506 $value_is_set = 1;
507 }
508 }
509
510 return unless $value_is_set;
511
512 $val = $self->_coerce_and_verify( $val, $instance );
513
514 $self->set_initial_value($instance, $val);
515
516 if ( ref $val && $self->is_weak_ref ) {
517 $self->_weaken_value($instance);
518 }
519}
520
521sub _call_builder {
522 my ( $self, $instance ) = @_;
523
524 my $builder = $self->builder();
525
526 return $instance->$builder()
527 if $instance->can( $self->builder );
528
529 throw_exception( BuilderDoesNotExist => instance => $instance,
530 attribute => $self,
531 );
532}
533
534## Slot management
535
536sub _make_initializer_writer_callback {
537 my $self = shift;
538 my ($meta_instance, $instance, $slot_name) = @_;
539 my $old_callback = $self->SUPER::_make_initializer_writer_callback(@_);
540 return sub {
541 $old_callback->($self->_coerce_and_verify($_[0], $instance));
542 };
543}
544
545sub set_value {
546 my ($self, $instance, @args) = @_;
547 my $value = $args[0];
548
549 my $attr_name = quotemeta($self->name);
550
551 my $class_name = blessed( $instance );
552 if ($self->is_required and not @args) {
553 throw_exception( AttributeIsRequired => attribute_name => $self->name,
554 class_name => $class_name,
555 );
556 }
557
558 $value = $self->_coerce_and_verify( $value, $instance );
559
560 my @old;
561 if ( $self->has_trigger && $self->has_value($instance) ) {
562 @old = $self->get_value($instance, 'for trigger');
563 }
564
565 $self->SUPER::set_value($instance, $value);
566
567 if ( ref $value && $self->is_weak_ref ) {
568 $self->_weaken_value($instance);
569 }
570
571 if ($self->has_trigger) {
572 $self->trigger->($instance, $value, @old);
573 }
574}
575
576
# spent 60.6ms (6.21+54.4) within Moose::Meta::Attribute::_inline_set_value which was called 318 times, avg 191µs/call: # 187 times (3.21ms+25.1ms) by Moose::Meta::Class::_inline_init_attr_from_constructor at line 398 of Moose/Meta/Class.pm, avg 151µs/call # 79 times (1.31ms+11.0ms) by Moose::Meta::Class::_inline_init_attr_from_default at line 425 of Moose/Meta/Class.pm, avg 155µs/call # 50 times (1.61ms+17.7ms) by Class::MOP::Method::Accessor::try {...} at line 113 of Class/MOP/Method/Accessor.pm, avg 386µs/call # 2 times (74µs+658µs) by Class::MOP::Class::_inline_init_attr_from_constructor at line 631 of Class/MOP/Class.pm, avg 366µs/call
sub _inline_set_value {
57731890µs my $self = shift;
578318226µs my ($instance, $value, $tc, $coercion, $message, $for_constructor) = @_;
579
58031844µs my $old = '@old';
58131828µs my $copy = '$val';
58231838µs $tc ||= '$type_constraint';
58331821µs $coercion ||= '$type_coercion';
58431816µs $message ||= '$type_message';
585
58631836µs my @code;
587318346µs3181.56ms if ($self->_writer_value_needs_copy) {
# spent 1.56ms making 318 calls to Moose::Meta::Attribute::_writer_value_needs_copy, avg 5µs/call
588 push @code, $self->_inline_copy_value($value, $copy);
589 $value = $copy;
590 }
591
592 # constructors already handle required checks
593318139µs52496µs push @code, $self->_inline_check_required
# spent 496µs making 52 calls to Moose::Meta::Attribute::_inline_check_required, avg 10µs/call
594 unless $for_constructor;
595
596318815µs31834.4ms push @code, $self->_inline_tc_code($value, $tc, $coercion, $message);
# spent 34.4ms making 318 calls to Moose::Meta::Attribute::_inline_tc_code, avg 108µs/call
597
598 # constructors do triggers all at once at the end
599318169µs52427µs push @code, $self->_inline_get_old_value_for_trigger($instance, $old)
# spent 427µs making 52 calls to Moose::Meta::Attribute::_inline_get_old_value_for_trigger, avg 8µs/call
600 unless $for_constructor;
601
6023181.78ms63617.1ms push @code, (
# spent 15.3ms making 318 calls to Class::MOP::Attribute::_inline_set_value, avg 48µs/call # spent 1.88ms making 318 calls to Moose::Meta::Attribute::_inline_weaken_value, avg 6µs/call
603 $self->SUPER::_inline_set_value($instance, $value),
604 $self->_inline_weaken_value($instance, $value),
605 );
606
607 # constructors do triggers all at once at the end
608318131µs52375µs push @code, $self->_inline_trigger($instance, $value, $old)
# spent 375µs making 52 calls to Moose::Meta::Attribute::_inline_trigger, avg 7µs/call
609 unless $for_constructor;
610
6113181.22ms return @code;
612}
613
614
# spent 1.56ms (1.03+529µs) within Moose::Meta::Attribute::_writer_value_needs_copy which was called 318 times, avg 5µs/call: # 318 times (1.03ms+529µs) by Moose::Meta::Attribute::_inline_set_value at line 587, avg 5µs/call
sub _writer_value_needs_copy {
61531852µs my $self = shift;
616318817µs318529µs return $self->should_coerce;
# spent 529µs making 318 calls to Moose::Meta::Mixin::AttributeCore::should_coerce, avg 2µs/call
617}
618
619sub _inline_copy_value {
620 my $self = shift;
621 my ($value, $copy) = @_;
622
623 return 'my ' . $copy . ' = ' . $value . ';'
624}
625
626
# spent 496µs (282+214) within Moose::Meta::Attribute::_inline_check_required which was called 52 times, avg 10µs/call: # 52 times (282µs+214µs) by Moose::Meta::Attribute::_inline_set_value at line 593, avg 10µs/call
sub _inline_check_required {
6275218µs my $self = shift;
628
62952199µs52202µs return unless $self->is_required;
# spent 202µs making 52 calls to Moose::Meta::Mixin::AttributeCore::is_required, avg 4µs/call
630
631311µs32µs my $attr_name = quotemeta($self->name);
# spent 2µs making 3 calls to Class::MOP::Mixin::AttributeCore::name, avg 500ns/call
632
633 return (
634317µs310µs 'if (@_ < 2) {',
# spent 10µs making 3 calls to Moose::Meta::Attribute::_inline_throw_exception, avg 4µs/call
635 $self->_inline_throw_exception( AttributeIsRequired =>
636 'attribute_name => "'.$attr_name.'",'.
637 'class_name => $class_name'
638 ) . ';',
639 '}',
640 );
641}
642
643
# spent 34.4ms (1.89+32.5) within Moose::Meta::Attribute::_inline_tc_code which was called 318 times, avg 108µs/call: # 318 times (1.89ms+32.5ms) by Moose::Meta::Attribute::_inline_set_value at line 596, avg 108µs/call
sub _inline_tc_code {
64431875µs my $self = shift;
645318203µs my ($value, $tc, $coercion, $message, $is_lazy) = @_;
646 return (
6473181.11ms63632.5ms $self->_inline_check_coercion(
# spent 31.0ms making 318 calls to Moose::Meta::Attribute::_inline_check_constraint, avg 98µs/call # spent 1.48ms making 318 calls to Moose::Meta::Attribute::_inline_check_coercion, avg 5µs/call
648 $value, $tc, $coercion, $is_lazy,
649 ),
650 $self->_inline_check_constraint(
651 $value, $tc, $message, $is_lazy,
652 ),
653 );
654}
655
656
# spent 1.83ms (1.32+507µs) within Moose::Meta::Attribute::_inline_check_coercion which was called 369 times, avg 5µs/call: # 318 times (1.08ms+402µs) by Moose::Meta::Attribute::_inline_tc_code at line 647, avg 5µs/call # 51 times (240µs+104µs) by Moose::Meta::Attribute::_inline_init_from_default at line 891, avg 7µs/call
sub _inline_check_coercion {
65736963µs my $self = shift;
658369156µs my ($value, $tc, $coercion) = @_;
659
660369953µs369507µs return unless $self->should_coerce && $self->type_constraint->has_coercion;
# spent 507µs making 369 calls to Moose::Meta::Mixin::AttributeCore::should_coerce, avg 1µs/call
661
662 if ( $self->type_constraint->can_be_inlined ) {
663 return (
664 'if (! (' . $self->type_constraint->_inline_check($value) . ')) {',
665 $value . ' = ' . $coercion . '->(' . $value . ');',
666 '}',
667 );
668 }
669 else {
670 return (
671 'if (!' . $tc . '->(' . $value . ')) {',
672 $value . ' = ' . $coercion . '->(' . $value . ');',
673 '}',
674 );
675 }
676}
677
678
# spent 35.8ms (6.53+29.3) within Moose::Meta::Attribute::_inline_check_constraint which was called 369 times, avg 97µs/call: # 318 times (5.52ms+25.5ms) by Moose::Meta::Attribute::_inline_tc_code at line 647, avg 98µs/call # 51 times (1.01ms+3.82ms) by Moose::Meta::Attribute::_inline_init_from_default at line 891, avg 95µs/call
sub _inline_check_constraint {
67936996µs my $self = shift;
680369182µs my ($value, $tc, $message) = @_;
681
682369443µs369586µs return unless $self->has_type_constraint;
# spent 586µs making 369 calls to Moose::Meta::Mixin::AttributeCore::has_type_constraint, avg 2µs/call
683
684354880µs354198µs my $attr_name = quotemeta($self->name);
# spent 198µs making 354 calls to Class::MOP::Mixin::AttributeCore::name, avg 558ns/call
685
6863543.24ms177028.5ms if ( $self->type_constraint->can_be_inlined ) {
# spent 21.7ms making 350 calls to Moose::Meta::TypeConstraint::_inline_check, avg 62µs/call # spent 4.38ms making 350 calls to Moose::Meta::TypeConstraint::can_be_inlined, avg 13µs/call # spent 939µs making 708 calls to Moose::Meta::Mixin::AttributeCore::type_constraint, avg 1µs/call # spent 934µs making 354 calls to Moose::Meta::Attribute::_inline_throw_exception, avg 3µs/call # spent 436µs making 4 calls to Moose::Meta::TypeConstraint::Parameterized::_inline_check, avg 109µs/call # spent 157µs making 4 calls to Moose::Meta::TypeConstraint::Parameterized::can_be_inlined, avg 39µs/call
687 return (
688 'if (! (' . $self->type_constraint->_inline_check($value) . ')) {',
689 'my $msg = do { local $_ = ' . $value . '; '
690 . $message . '->(' . $value . ');'
691 . '};'.
692 $self->_inline_throw_exception( ValidationFailedForInlineTypeConstraint =>
693 'type_constraint_message => $msg , '.
694 'class_name => $class_name, '.
695 'attribute_name => "'.$attr_name.'",'.
696 'value => '.$value
697 ).';',
698 '}',
699 );
700 }
701 else {
702 return (
703 'if (!' . $tc . '->(' . $value . ')) {',
704 'my $msg = do { local $_ = ' . $value . '; '
705 . $message . '->(' . $value . ');'
706 . '};'.
707 $self->_inline_throw_exception( ValidationFailedForInlineTypeConstraint =>
708 'type_constraint_message => $msg , '.
709 'class_name => $class_name, '.
710 'attribute_name => "'.$attr_name.'",'.
711 'value => '.$value
712 ).';',
713 '}',
714 );
715 }
716}
717
718
# spent 427µs (283+144) within Moose::Meta::Attribute::_inline_get_old_value_for_trigger which was called 52 times, avg 8µs/call: # 52 times (283µs+144µs) by Moose::Meta::Attribute::_inline_set_value at line 599, avg 8µs/call
sub _inline_get_old_value_for_trigger {
7195225µs my $self = shift;
7205236µs my ($instance, $old) = @_;
721
72252159µs52144µs return unless $self->has_trigger;
# spent 144µs making 52 calls to Moose::Meta::Mixin::AttributeCore::has_trigger, avg 3µs/call
723
724 return (
725 'my ' . $old . ' = ' . $self->_inline_instance_has($instance),
726 '? ' . $self->_inline_instance_get($instance),
727 ': ();',
728 );
729}
730
731
# spent 2.32ms (1.62+707µs) within Moose::Meta::Attribute::_inline_weaken_value which was called 382 times, avg 6µs/call: # 318 times (1.30ms+578µs) by Moose::Meta::Attribute::_inline_set_value at line 602, avg 6µs/call # 64 times (315µs+128µs) by Moose::Meta::Attribute::_inline_init_from_default at line 891, avg 7µs/call
sub _inline_weaken_value {
732382109µs my $self = shift;
733382184µs my ($instance, $value) = @_;
734
7353821.05ms382679µs return unless $self->is_weak_ref;
# spent 679µs making 382 calls to Moose::Meta::Mixin::AttributeCore::is_weak_ref, avg 2µs/call
736
73729µs49µs my $mi = $self->associated_class->get_meta_instance;
# spent 6µs making 1 call to Class::MOP::Class::Immutable::Class::MOP::Class::get_meta_instance # spent 1µs making 1 call to Class::MOP::Class::get_meta_instance # spent 1µs making 2 calls to Class::MOP::Attribute::associated_class, avg 600ns/call
738 return (
739216µs419µs $mi->inline_weaken_slot_value($instance, $self->name),
# spent 18µs making 2 calls to Class::MOP::Instance::inline_weaken_slot_value, avg 9µs/call # spent 1µs making 2 calls to Class::MOP::Mixin::AttributeCore::name, avg 500ns/call
740 'if ref ' . $value . ';',
741 );
742}
743
744
# spent 375µs (262+113) within Moose::Meta::Attribute::_inline_trigger which was called 52 times, avg 7µs/call: # 52 times (262µs+113µs) by Moose::Meta::Attribute::_inline_set_value at line 608, avg 7µs/call
sub _inline_trigger {
7455219µs my $self = shift;
7465242µs my ($instance, $value, $old) = @_;
747
74852148µs52113µs return unless $self->has_trigger;
# spent 113µs making 52 calls to Moose::Meta::Mixin::AttributeCore::has_trigger, avg 2µs/call
749
750 return '$trigger->(' . $instance . ', ' . $value . ', ' . $old . ');';
751}
752
753
# spent 16.9ms (8.15+8.79) within Moose::Meta::Attribute::_eval_environment which was called 207 times, avg 82µs/call: # 207 times (8.15ms+8.79ms) by Moose::Meta::Method::Accessor::_eval_environment at line 46 of Moose/Meta/Method/Accessor.pm, avg 82µs/call
sub _eval_environment {
75420769µs my $self = shift;
755
756207103µs my $env = { };
757
758207326µs207436µs $env->{'$trigger'} = \($self->trigger)
# spent 436µs making 207 calls to Moose::Meta::Mixin::AttributeCore::has_trigger, avg 2µs/call
759 if $self->has_trigger;
760207542µs288569µs $env->{'$attr_default'} = \($self->default)
# spent 328µs making 207 calls to Class::MOP::Mixin::AttributeCore::has_default, avg 2µs/call # spent 241µs making 81 calls to Class::MOP::Mixin::AttributeCore::default, avg 3µs/call
761 if $self->has_default;
762
763207483µs207357µs if ($self->has_type_constraint) {
# spent 357µs making 207 calls to Moose::Meta::Mixin::AttributeCore::has_type_constraint, avg 2µs/call
764186278µs186318µs my $tc_obj = $self->type_constraint;
# spent 318µs making 186 calls to Moose::Meta::Mixin::AttributeCore::type_constraint, avg 2µs/call
765
766186301µs1862.73ms $env->{'$type_constraint'} = \(
# spent 2.54ms making 182 calls to Moose::Meta::TypeConstraint::can_be_inlined, avg 14µs/call # spent 190µs making 4 calls to Moose::Meta::TypeConstraint::Parameterized::can_be_inlined, avg 48µs/call
767 $tc_obj->_compiled_type_constraint
768 ) unless $tc_obj->can_be_inlined;
769 # these two could probably get inlined versions too
770186368µs186374µs $env->{'$type_coercion'} = \(
# spent 374µs making 186 calls to Moose::Meta::TypeConstraint::has_coercion, avg 2µs/call
771 $tc_obj->coercion->_compiled_type_coercion
772 ) if $tc_obj->has_coercion;
773186800µs372724µs $env->{'$type_message'} = \(
# spent 406µs making 186 calls to Moose::Meta::TypeConstraint::_default_message, avg 2µs/call # spent 318µs making 186 calls to Moose::Meta::TypeConstraint::has_message, avg 2µs/call
774 $tc_obj->has_message ? $tc_obj->message : $tc_obj->_default_message
775 );
776
777186794µs1862.55ms $env = { %$env, %{ $tc_obj->inline_environment } };
# spent 2.35ms making 182 calls to Moose::Meta::TypeConstraint::inline_environment, avg 13µs/call # spent 204µs making 4 calls to Moose::Meta::TypeConstraint::Parameterized::inline_environment, avg 51µs/call
778 }
779
7802071.18ms414292µs $env->{'$class_name'} = \($self->associated_class->name);
# spent 157µs making 207 calls to Class::MOP::Attribute::associated_class, avg 757ns/call # spent 135µs making 207 calls to Class::MOP::Package::name, avg 653ns/call
781
782 # XXX ugh, fix these
783207258µs207306µs $env->{'$attr'} = \$self
# spent 306µs making 207 calls to Class::MOP::Mixin::AttributeCore::has_initializer, avg 1µs/call
784 if $self->has_initializer && $self->is_lazy;
785 # pretty sure this is only going to be closed over if you use a custom
786 # error class at this point, but we should still get rid of this
787 # at some point
788207603µs207125µs $env->{'$meta'} = \($self->associated_class);
# spent 125µs making 207 calls to Class::MOP::Attribute::associated_class, avg 604ns/call
789
790207504µs return $env;
791}
792
793sub _weaken_value {
794 my ( $self, $instance ) = @_;
795
796 my $meta_instance = Class::MOP::Class->initialize( blessed($instance) )
797 ->get_meta_instance;
798
799 $meta_instance->weaken_slot_value( $instance, $self->name );
800}
801
802sub get_value {
803 my ($self, $instance, $for_trigger) = @_;
804
805 if ($self->is_lazy) {
806 unless ($self->has_value($instance)) {
807 my $value;
808 if ($self->has_default) {
809 $value = $self->default($instance);
810 } elsif ( $self->has_builder ) {
811 $value = $self->_call_builder($instance);
812 }
813
814 $value = $self->_coerce_and_verify( $value, $instance );
815
816 $self->set_initial_value($instance, $value);
817
818 if ( ref $value && $self->is_weak_ref ) {
819 $self->_weaken_value($instance);
820 }
821 }
822 }
823
824 if ( $self->should_auto_deref && ! $for_trigger ) {
825
826 my $type_constraint = $self->type_constraint;
827
828 if ($type_constraint->is_a_type_of('ArrayRef')) {
829 my $rv = $self->SUPER::get_value($instance);
830 return unless defined $rv;
831 return wantarray ? @{ $rv } : $rv;
832 }
833 elsif ($type_constraint->is_a_type_of('HashRef')) {
834 my $rv = $self->SUPER::get_value($instance);
835 return unless defined $rv;
836 return wantarray ? %{ $rv } : $rv;
837 }
838 else {
839 throw_exception( CannotAutoDereferenceTypeConstraint => type_name => $type_constraint->name,
840 instance => $instance,
841 attribute => $self
842 );
843 }
844
845 }
846 else {
847
848 return $self->SUPER::get_value($instance);
849 }
850}
851
852
# spent 41.8ms (1.90+39.9) within Moose::Meta::Attribute::_inline_get_value which was called 191 times, avg 219µs/call: # 141 times (1.41ms+36.5ms) by Class::MOP::Method::Accessor::try {...} at line 151 of Class/MOP/Method/Accessor.pm, avg 269µs/call # 50 times (492µs+3.46ms) by Class::MOP::Method::Accessor::try {...} at line 113 of Class/MOP/Method/Accessor.pm, avg 79µs/call
sub _inline_get_value {
85319177µs my $self = shift;
85419195µs my ($instance, $tc, $coercion, $message) = @_;
855
856191384µs19123.3ms my $slot_access = $self->_inline_instance_get($instance);
# spent 23.3ms making 191 calls to Class::MOP::Attribute::_inline_instance_get, avg 122µs/call
85719147µs $tc ||= '$type_constraint';
85819126µs $coercion ||= '$type_coercion';
85919129µs $message ||= '$type_message';
860
861 return (
862191861µs38216.6ms $self->_inline_check_lazy($instance, $tc, $coercion, $message),
# spent 14.5ms making 191 calls to Moose::Meta::Attribute::_inline_check_lazy, avg 76µs/call # spent 2.12ms making 191 calls to Moose::Meta::Attribute::_inline_return_auto_deref, avg 11µs/call
863 $self->_inline_return_auto_deref($slot_access),
864 );
865}
866
867
# spent 14.5ms (1.23+13.3) within Moose::Meta::Attribute::_inline_check_lazy which was called 191 times, avg 76µs/call: # 191 times (1.23ms+13.3ms) by Moose::Meta::Attribute::_inline_get_value at line 862, avg 76µs/call
sub _inline_check_lazy {
86819146µs my $self = shift;
869191113µs my ($instance, $tc, $coercion, $message) = @_;
870
871191566µs191573µs return unless $self->is_lazy;
# spent 573µs making 191 calls to Moose::Meta::Mixin::AttributeCore::is_lazy, avg 3µs/call
872
87364139µs641.28ms my $slot_exists = $self->_inline_instance_has($instance);
# spent 1.28ms making 64 calls to Class::MOP::Attribute::_inline_instance_has, avg 20µs/call
874
875 return (
87664261µs6411.4ms 'if (!' . $slot_exists . ') {',
# spent 11.4ms making 64 calls to Moose::Meta::Attribute::_inline_init_from_default, avg 178µs/call
877 $self->_inline_init_from_default($instance, '$default', $tc, $coercion, $message, 'lazy'),
878 '}',
879 );
880}
881
882
# spent 11.4ms (1.44+9.97) within Moose::Meta::Attribute::_inline_init_from_default which was called 64 times, avg 178µs/call: # 64 times (1.44ms+9.97ms) by Moose::Meta::Attribute::_inline_check_lazy at line 876, avg 178µs/call
sub _inline_init_from_default {
8836418µs my $self = shift;
8846457µs my ($instance, $default, $tc, $coercion, $message, $for_lazy) = @_;
885
88664194µs128231µs if (!($self->has_default || $self->has_builder)) {
# spent 131µs making 64 calls to Class::MOP::Mixin::AttributeCore::has_builder, avg 2µs/call # spent 100µs making 64 calls to Class::MOP::Mixin::AttributeCore::has_default, avg 2µs/call
887 throw_exception( LazyAttributeNeedsADefault => attribute => $self );
888 }
889
890 return (
89164678µs3589.74ms $self->_inline_generate_default($instance, $default),
# spent 4.83ms making 51 calls to Moose::Meta::Attribute::_inline_check_constraint, avg 95µs/call # spent 2.14ms making 64 calls to Moose::Meta::Attribute::_inline_generate_default, avg 33µs/call # spent 1.86ms making 64 calls to Moose::Meta::Attribute::_inline_init_slot, avg 29µs/call # spent 443µs making 64 calls to Moose::Meta::Attribute::_inline_weaken_value, avg 7µs/call # spent 345µs making 51 calls to Moose::Meta::Attribute::_inline_check_coercion, avg 7µs/call # spent 119µs making 64 calls to Moose::Meta::Mixin::AttributeCore::has_type_constraint, avg 2µs/call
892 # intentionally not using _inline_tc_code, since that can be overridden
893 # to do things like possibly only do member tc checks, which isn't
894 # appropriate for checking the result of a default
895 $self->has_type_constraint
896 ? ($self->_inline_check_coercion($default, $tc, $coercion, $for_lazy),
897 $self->_inline_check_constraint($default, $tc, $message, $for_lazy))
898 : (),
899 $self->_inline_init_slot($instance, $default),
900 $self->_inline_weaken_value($instance, $default),
901 );
902}
903
904
# spent 2.14ms (1.48+657µs) within Moose::Meta::Attribute::_inline_generate_default which was called 64 times, avg 33µs/call: # 64 times (1.48ms+657µs) by Moose::Meta::Attribute::_inline_init_from_default at line 891, avg 33µs/call
sub _inline_generate_default {
9056421µs my $self = shift;
9066445µs my ($instance, $default) = @_;
907
90864159µs128135µs if ($self->has_default) {
# spent 72µs making 64 calls to Class::MOP::Mixin::AttributeCore::has_builder, avg 1µs/call # spent 64µs making 64 calls to Class::MOP::Mixin::AttributeCore::has_default, avg 998ns/call
909 my $source = 'my ' . $default . ' = $attr_default';
910 $source .= '->(' . $instance . ')'
911 if $self->is_default_a_coderef;
912 return $source . ';';
913 }
914 elsif ($self->has_builder) {
91564518µs128225µs my $builder = B::perlstring($self->builder);
# spent 171µs making 64 calls to B::perlstring, avg 3µs/call # spent 55µs making 64 calls to Class::MOP::Mixin::AttributeCore::builder, avg 856ns/call
91664171µs6434µs my $builder_str = quotemeta($self->builder);
# spent 34µs making 64 calls to Class::MOP::Mixin::AttributeCore::builder, avg 528ns/call
91764159µs6436µs my $attr_name_str = quotemeta($self->name);
# spent 36µs making 64 calls to Class::MOP::Mixin::AttributeCore::name, avg 561ns/call
918 return (
91964486µs64227µs 'my ' . $default . ';',
# spent 227µs making 64 calls to Moose::Meta::Attribute::_inline_throw_exception, avg 4µs/call
920 'if (my $builder = ' . $instance . '->can(' . $builder . ')) {',
921 $default . ' = ' . $instance . '->$builder;',
922 '}',
923 'else {',
924 'my $class = ref(' . $instance . ') || ' . $instance . ';',
925 $self->_inline_throw_exception(
926 BuilderMethodNotSupportedForInlineAttribute =>
927 'class_name => $class,'.
928 'attribute_name => "'.$attr_name_str.'",'.
929 'instance => '.$instance.','.
930 'builder => "'.$builder_str.'"'
931 ) . ';',
932 '}',
933 );
934 }
935 else {
936 confess(
937 "Can't generate a default for " . $self->name
938 . " since no default or builder was specified"
939 );
940 }
941}
942
943
# spent 1.86ms (514µs+1.35) within Moose::Meta::Attribute::_inline_init_slot which was called 64 times, avg 29µs/call: # 64 times (514µs+1.35ms) by Moose::Meta::Attribute::_inline_init_from_default at line 891, avg 29µs/call
sub _inline_init_slot {
9446435µs my $self = shift;
9456438µs my ($inv, $value) = @_;
946
9476490µs6490µs if ($self->has_initializer) {
# spent 90µs making 64 calls to Class::MOP::Mixin::AttributeCore::has_initializer, avg 1µs/call
948 return '$attr->set_initial_value(' . $inv . ', ' . $value . ');';
949 }
950 else {
95164257µs641.26ms return $self->_inline_instance_set($inv, $value) . ';';
# spent 1.26ms making 64 calls to Class::MOP::Attribute::_inline_instance_set, avg 20µs/call
952 }
953}
954
955
# spent 2.12ms (827µs+1.29) within Moose::Meta::Attribute::_inline_return_auto_deref which was called 191 times, avg 11µs/call: # 191 times (827µs+1.29ms) by Moose::Meta::Attribute::_inline_get_value at line 862, avg 11µs/call
sub _inline_return_auto_deref {
95619158µs my $self = shift;
957
958191661µs1911.29ms return 'return ' . $self->_auto_deref(@_) . ';';
# spent 1.29ms making 191 calls to Moose::Meta::Attribute::_auto_deref, avg 7µs/call
959}
960
961
# spent 1.29ms (864µs+431µs) within Moose::Meta::Attribute::_auto_deref which was called 191 times, avg 7µs/call: # 191 times (864µs+431µs) by Moose::Meta::Attribute::_inline_return_auto_deref at line 958, avg 7µs/call
sub _auto_deref {
96219129µs my $self = shift;
96319167µs my ($ref_value) = @_;
964
965191668µs191431µs return $ref_value unless $self->should_auto_deref;
# spent 431µs making 191 calls to Moose::Meta::Mixin::AttributeCore::should_auto_deref, avg 2µs/call
966
967 my $type_constraint = $self->type_constraint;
968
969 my $sigil;
970 if ($type_constraint->is_a_type_of('ArrayRef')) {
971 $sigil = '@';
972 }
973 elsif ($type_constraint->is_a_type_of('HashRef')) {
974 $sigil = '%';
975 }
976 else {
977 confess(
978 'Can not auto de-reference the type constraint \''
979 . $type_constraint->name
980 . '\''
981 );
982 }
983
984 return 'wantarray '
985 . '? ' . $sigil . '{ (' . $ref_value . ') || return } '
986 . ': (' . $ref_value . ')';
987}
988
989## installing accessors
990
991207529µs
# spent 311µs within Moose::Meta::Attribute::accessor_metaclass which was called 207 times, avg 2µs/call: # 207 times (311µs+0s) by Class::MOP::Attribute::try {...} at line 407 of Class/MOP/Attribute.pm, avg 2µs/call
sub accessor_metaclass { 'Moose::Meta::Method::Accessor' }
992
993
# spent 284ms (1.74+282) within Moose::Meta::Attribute::install_accessors which was called 191 times, avg 1.49ms/call: # 190 times (1.73ms+281ms) by Class::MOP::Class::try {...} at line 899 of Class/MOP/Class.pm, avg 1.49ms/call # once (12µs+1.23ms) by Class::MOP::Class::_inline_accessors at line 1425 of Class/MOP/Class.pm
sub install_accessors {
99419164µs my $self = shift;
995191711µs191282ms $self->SUPER::install_accessors(@_);
# spent 282ms making 191 calls to Class::MOP::Attribute::install_accessors, avg 1.48ms/call
996191365µs191434µs $self->install_delegation if $self->has_handles;
# spent 434µs making 191 calls to Moose::Meta::Mixin::AttributeCore::has_handles, avg 2µs/call
997191352µs return;
998}
999
1000
# spent 974µs (825+149) within Moose::Meta::Attribute::_check_associated_methods which was called 189 times, avg 5µs/call: # 189 times (825µs+149µs) by Moose::Meta::Class::add_attribute at line 576 of Moose/Meta/Class.pm, avg 5µs/call
sub _check_associated_methods {
100118979µs my $self = shift;
1002189993µs189149µs unless (
# spent 149µs making 189 calls to Class::MOP::Attribute::associated_methods, avg 789ns/call
1003 @{ $self->associated_methods }
1004 || ($self->_is_metadata || '') eq 'bare'
1005 ) {
1006 Carp::cluck(
1007 'Attribute (' . $self->name . ') of class '
1008 . $self->associated_class->name
1009 . ' has no associated methods'
1010 . ' (did you mean to provide an "is" argument?)'
1011 . "\n"
1012 )
1013 }
1014}
1015
1016
# spent 258ms (4.32+254) within Moose::Meta::Attribute::_process_accessors which was called 207 times, avg 1.25ms/call: # 141 times (2.95ms+170ms) by Class::MOP::Attribute::install_accessors at line 450 of Class/MOP/Attribute.pm, avg 1.22ms/call # 50 times (1.06ms+72.6ms) by Class::MOP::Attribute::install_accessors at line 446 of Class/MOP/Attribute.pm, avg 1.47ms/call # 8 times (158µs+5.86ms) by Class::MOP::Attribute::install_accessors at line 462 of Class/MOP/Attribute.pm, avg 752µs/call # 8 times (148µs+5.73ms) by Class::MOP::Attribute::install_accessors at line 458 of Class/MOP/Attribute.pm, avg 735µs/call
sub _process_accessors {
101720757µs my $self = shift;
1018207141µs my ($type, $accessor, $generate_as_inline_methods) = @_;
1019
102020781µs $accessor = ( keys %$accessor )[0] if ( ref($accessor) || '' ) eq 'HASH';
1021207808µs4147.46ms my $method = $self->associated_class->get_method($accessor);
# spent 7.35ms making 207 calls to Class::MOP::Mixin::HasMethods::get_method, avg 36µs/call # spent 107µs making 207 calls to Class::MOP::Attribute::associated_class, avg 517ns/call
1022
102320735µs43µs if ( $method
# spent 1µs making 1 call to Class::MOP::Method::Accessor::associated_attribute # spent 900ns making 2 calls to Class::MOP::Mixin::AttributeCore::name, avg 450ns/call # spent 900ns making 1 call to UNIVERSAL::isa
1024 && $method->isa('Class::MOP::Method::Accessor')
1025 && $method->associated_attribute->name ne $self->name ) {
1026
1027 my $other_attr_name = $method->associated_attribute->name;
1028 my $name = $self->name;
1029
1030 Carp::cluck(
1031 "You are overwriting an accessor ($accessor) for the $other_attr_name attribute"
1032 . " with a new accessor method for the $name attribute" );
1033 }
1034
103520745µs22µs if (
# spent 900ns making 1 call to Class::MOP::Method::is_stub # spent 600ns making 1 call to UNIVERSAL::isa
1036 $method
1037 && !$method->is_stub
1038 && !$method->isa('Class::MOP::Method::Accessor')
1039 && ( !$self->definition_context
1040 || $method->package_name eq $self->definition_context->{package} )
1041 ) {
1042
1043 Carp::cluck(
1044 "You are overwriting a locally defined method ($accessor) with "
1045 . "an accessor" );
1046 }
1047
10482071.66ms8266.25ms if ( !$self->associated_class->has_method($accessor)
# spent 4.00ms making 207 calls to Class::MOP::Mixin::HasMethods::has_method, avg 19µs/call # spent 1.99ms making 206 calls to Class::MOP::Package::has_package_symbol, avg 10µs/call # spent 255µs making 413 calls to Class::MOP::Attribute::associated_class, avg 617ns/call
1049 && $self->associated_class->has_package_symbol( '&' . $accessor ) ) {
1050
1051 Carp::cluck(
1052 "You are overwriting a locally defined function ($accessor) with "
1053 . "an accessor" );
1054 }
1055
10562071.25ms207240ms $self->SUPER::_process_accessors(@_);
# spent 240ms making 207 calls to Class::MOP::Attribute::_process_accessors, avg 1.16ms/call
1057}
1058
1059
# spent 255µs (21+234) within Moose::Meta::Attribute::remove_accessors which was called 2 times, avg 128µs/call: # 2 times (21µs+234µs) by Class::MOP::Class::remove_attribute at line 915 of Class/MOP/Class.pm, avg 128µs/call
sub remove_accessors {
10602500ns my $self = shift;
106129µs2231µs $self->SUPER::remove_accessors(@_);
# spent 231µs making 2 calls to Class::MOP::Attribute::remove_accessors, avg 116µs/call
106222µs23µs $self->remove_delegation if $self->has_handles;
# spent 3µs making 2 calls to Moose::Meta::Mixin::AttributeCore::has_handles, avg 1µs/call
106325µs return;
1064}
1065
1066sub install_delegation {
1067 my $self = shift;
1068
1069 # NOTE:
1070 # Here we canonicalize the 'handles' option
1071 # this will sort out any details and always
1072 # return an hash of methods which we want
1073 # to delagate to, see that method for details
1074 my %handles = $self->_canonicalize_handles;
1075
1076 # install the delegation ...
1077 my $associated_class = $self->associated_class;
1078 my $class_name = $associated_class->name;
1079
1080 foreach my $handle ( sort keys %handles ) {
1081 my $method_to_call = $handles{$handle};
1082 my $name = "${class_name}::${handle}";
1083
1084 if ( my $method = $associated_class->get_method($handle) ) {
1085 throw_exception(
1086 CannotDelegateLocalMethodIsPresent => attribute => $self,
1087 method => $method,
1088 ) unless $method->is_stub;
1089 }
1090
1091 # NOTE:
1092 # handles is not allowed to delegate
1093 # any of these methods, as they will
1094 # override the ones in your class, which
1095 # is almost certainly not what you want.
1096
1097 # FIXME warn when $handle was explicitly specified, but not if the source is a regex or something
1098 #cluck("Not delegating method '$handle' because it is a core method") and
1099 next
1100 if $class_name->isa("Moose::Object")
1101 and $handle =~ /^BUILD|DEMOLISH$/ || Moose::Object->can($handle);
1102
1103 my $method = $self->_make_delegation_method($handle, $method_to_call);
1104
1105 $self->associated_class->add_method($method->name, $method);
1106 $self->associate_method($method);
1107 }
1108}
1109
1110sub remove_delegation {
1111 my $self = shift;
1112 my %handles = $self->_canonicalize_handles;
1113 my $associated_class = $self->associated_class;
1114 foreach my $handle (keys %handles) {
1115 next unless any { $handle eq $_ }
1116 map { $_->name }
1117 @{ $self->associated_methods };
1118 $self->associated_class->remove_method($handle);
1119 }
1120}
1121
1122# private methods to help delegation ...
1123
1124sub _canonicalize_handles {
1125 my $self = shift;
1126 my $handles = $self->handles;
1127 if (my $handle_type = ref($handles)) {
1128 if ($handle_type eq 'HASH') {
1129 return %{$handles};
1130 }
1131 elsif ($handle_type eq 'ARRAY') {
1132 return map { $_ => $_ } @{$handles};
1133 }
1134 elsif ($handle_type eq 'Regexp') {
1135 ($self->has_type_constraint)
1136 || throw_exception( CannotDelegateWithoutIsa => attribute => $self );
1137 return map { ($_ => $_) }
1138 grep { /$handles/ } $self->_get_delegate_method_list;
1139 }
1140 elsif ($handle_type eq 'CODE') {
1141 return $handles->($self, $self->_find_delegate_metaclass);
1142 }
1143 elsif (blessed($handles) && $handles->isa('Moose::Meta::TypeConstraint::DuckType')) {
1144 return map { $_ => $_ } @{ $handles->methods };
1145 }
1146 elsif (blessed($handles) && $handles->isa('Moose::Meta::TypeConstraint::Role')) {
1147 $handles = $handles->role;
1148 }
1149 else {
1150 throw_exception( UnableToCanonicalizeHandles => attribute => $self,
1151 handles => $handles
1152 );
1153 }
1154 }
1155
1156 Moose::Util::_load_user_class($handles);
1157 my $role_meta = Class::MOP::class_of($handles);
1158
1159 (blessed $role_meta && $role_meta->isa('Moose::Meta::Role'))
1160 || throw_exception( UnableToCanonicalizeNonRolePackage => attribute => $self,
1161 handles => $handles
1162 );
1163
1164 return map { $_ => $_ }
1165 map { $_->name }
1166 grep { !$_->isa('Class::MOP::Method::Meta') } (
1167 $role_meta->_get_local_methods,
1168 $role_meta->get_required_method_list,
1169 );
1170}
1171
1172sub _get_delegate_method_list {
1173 my $self = shift;
1174 my $meta = $self->_find_delegate_metaclass;
1175 if ($meta->isa('Class::MOP::Class')) {
1176 return map { $_->name } # NOTE: !never! delegate &meta
1177 grep { $_->package_name ne 'Moose::Object' && !$_->isa('Class::MOP::Method::Meta') }
1178 $meta->get_all_methods;
1179 }
1180 elsif ($meta->isa('Moose::Meta::Role')) {
1181 return $meta->get_method_list;
1182 }
1183 else {
1184 throw_exception( UnableToRecognizeDelegateMetaclass => attribute => $self,
1185 delegate_metaclass => $meta
1186 );
1187 }
1188}
1189
1190sub _find_delegate_metaclass {
1191 my $self = shift;
1192 my $class = $self->_isa_metadata;
1193 my $role = $self->_does_metadata;
1194
1195 if ( $class ) {
1196 # make sure isa is actually a class
1197 unless ( $self->type_constraint->isa("Moose::Meta::TypeConstraint::Class") ) {
1198 throw_exception( DelegationToATypeWhichIsNotAClass => attribute => $self );
1199 }
1200
1201 # make sure the class is loaded
1202 unless ( Moose::Util::_is_package_loaded($class) ) {
1203 throw_exception( DelegationToAClassWhichIsNotLoaded => attribute => $self,
1204 class_name => $class
1205 );
1206 }
1207 # we might be dealing with a non-Moose class,
1208 # and need to make our own metaclass. if there's
1209 # already a metaclass, it will be returned
1210 return Class::MOP::Class->initialize($class);
1211 }
1212 elsif ( $role ) {
1213 unless ( Moose::Util::_is_package_loaded($role) ) {
1214 throw_exception( DelegationToARoleWhichIsNotLoaded => attribute => $self,
1215 role_name => $role
1216 );
1217 }
1218
1219 return Class::MOP::class_of($role);
1220 }
1221 else {
1222 throw_exception( CannotFindDelegateMetaclass => attribute => $self );
1223 }
1224}
1225
1226sub delegation_metaclass { 'Moose::Meta::Method::Delegation' }
1227
1228sub _make_delegation_method {
1229 my ( $self, $handle_name, $method_to_call ) = @_;
1230
1231 my @curried_arguments;
1232
1233 ($method_to_call, @curried_arguments) = @$method_to_call
1234 if 'ARRAY' eq ref($method_to_call);
1235
1236 return $self->delegation_metaclass->new(
1237 name => $handle_name,
1238 package_name => $self->associated_class->name,
1239 attribute => $self,
1240 delegate_to_method => $method_to_call,
1241 curried_arguments => \@curried_arguments,
1242 );
1243}
1244
1245sub _coerce_and_verify {
1246 my $self = shift;
1247 my $val = shift;
1248 my $instance = shift;
1249
1250 return $val unless $self->has_type_constraint;
1251
1252 $val = $self->type_constraint->coerce($val)
1253 if $self->should_coerce && $self->type_constraint->has_coercion;
1254
1255 $self->verify_against_type_constraint($val, instance => $instance);
1256
1257 return $val;
1258}
1259
1260sub verify_against_type_constraint {
1261 my $self = shift;
1262 my $val = shift;
1263
1264 return 1 if !$self->has_type_constraint;
1265
1266 my $type_constraint = $self->type_constraint;
1267
1268 $type_constraint->check($val)
1269 || throw_exception( ValidationFailedForTypeConstraint => type => $type_constraint,
1270 value => $val,
1271 attribute => $self,
1272 );
1273}
1274
1275package Moose::Meta::Attribute::Custom::Moose;
12761600nsour $VERSION = '2.1403';
1277
1278sub register_implementation { 'Moose::Meta::Attribute' }
1279115µs1;
1280
1281# ABSTRACT: The Moose attribute metaclass
1282
1283__END__
 
# spent 10µs within Moose::Meta::Attribute::CORE:match which was called 8 times, avg 1µs/call: # 8 times (10µs+0s) by Moose::Meta::Attribute::_process_lazy_build_option at line 438, avg 1µs/call
sub Moose::Meta::Attribute::CORE:match; # opcode
# spent 97µs within Moose::Meta::Attribute::CORE:sort which was called 190 times, avg 512ns/call: # 190 times (97µs+0s) by Moose::Meta::Attribute::new at line 62, avg 512ns/call
sub Moose::Meta::Attribute::CORE:sort; # opcode