← Index
NYTProf Performance Profile   « block view • line view • sub view »
For 01.HTTP.t
  Run on Tue May 4 15:25:55 2010
Reported on Tue May 4 15:26:20 2010

File /usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Class/MOP/Method/Constructor.pm
Statements Executed 4171
Statement Execution Time 7.83ms
Subroutines — ordered by exclusive time
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
267114.47ms8.22msClass::MOP::Method::Constructor::::_generate_slot_initializerClass::MOP::Method::Constructor::_generate_slot_initializer
31111.53ms22.6msClass::MOP::Method::Constructor::::_generate_constructor_method_inlineClass::MOP::Method::Constructor::_generate_constructor_method_inline
38142638µs4.51msClass::MOP::Method::Constructor::::_meta_instanceClass::MOP::Method::Constructor::_meta_instance
3111506µs23.9msClass::MOP::Method::Constructor::::newClass::MOP::Method::Constructor::new
3111476µs476µsClass::MOP::Method::Constructor::::_newClass::MOP::Method::Constructor::_new
3111221µs22.9msClass::MOP::Method::Constructor::::_initialize_bodyClass::MOP::Method::Constructor::_initialize_body
4262221µs1.95msClass::MOP::Method::Constructor::::_attributesClass::MOP::Method::Constructor::_attributes
12442114µs114µsClass::MOP::Method::Constructor::::associated_metaclassClass::MOP::Method::Constructor::associated_metaclass
322243µs43µsClass::MOP::Method::Constructor::::optionsClass::MOP::Method::Constructor::options
11121µs25µsClass::MOP::Method::Constructor::::BEGIN@4Class::MOP::Method::Constructor::BEGIN@4
11111µs59µsClass::MOP::Method::Constructor::::BEGIN@7Class::MOP::Method::Constructor::BEGIN@7
11110µs24µsClass::MOP::Method::Constructor::::BEGIN@5Class::MOP::Method::Constructor::BEGIN@5
1119µs54µsClass::MOP::Method::Constructor::::BEGIN@8Class::MOP::Method::Constructor::BEGIN@8
1119µs1.06msClass::MOP::Method::Constructor::::BEGIN@14Class::MOP::Method::Constructor::BEGIN@14
0000s0sClass::MOP::Method::Constructor::::__ANON__[:97]Class::MOP::Method::Constructor::__ANON__[:97]
0000s0sClass::MOP::Method::Constructor::::_generate_constructor_methodClass::MOP::Method::Constructor::_generate_constructor_method
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1
2package Class::MOP::Method::Constructor;
3
4330µs229µs
# spent 25µs (21+4) within Class::MOP::Method::Constructor::BEGIN@4 which was called # once (21µs+4µs) by Class::MOP::Class::BEGIN@10 at line 4
use strict;
# spent 25µs making 1 call to Class::MOP::Method::Constructor::BEGIN@4 # spent 4µs making 1 call to strict::import
5341µs238µs
# spent 24µs (10+14) within Class::MOP::Method::Constructor::BEGIN@5 which was called # once (10µs+14µs) by Class::MOP::Class::BEGIN@10 at line 5
use warnings;
# spent 24µs making 1 call to Class::MOP::Method::Constructor::BEGIN@5 # spent 14µs making 1 call to warnings::import
6
7336µs2107µs
# spent 59µs (11+48) within Class::MOP::Method::Constructor::BEGIN@7 which was called # once (11µs+48µs) by Class::MOP::Class::BEGIN@10 at line 7
use Carp 'confess';
# spent 59µs making 1 call to Class::MOP::Method::Constructor::BEGIN@7 # spent 48µs making 1 call to Exporter::import
8361µs298µs
# spent 54µs (9+44) within Class::MOP::Method::Constructor::BEGIN@8 which was called # once (9µs+44µs) by Class::MOP::Class::BEGIN@10 at line 8
use Scalar::Util 'blessed', 'weaken', 'looks_like_number';
# spent 54µs making 1 call to Class::MOP::Method::Constructor::BEGIN@8 # spent 44µs making 1 call to Exporter::import
9
101900nsour $VERSION = '0.98';
11119µs$VERSION = eval $VERSION;
121500nsour $AUTHORITY = 'cpan:STEVAN';
13
143919µs22.12ms
# spent 1.06ms (9µs+1.06) within Class::MOP::Method::Constructor::BEGIN@14 which was called # once (9µs+1.06ms) by Class::MOP::Class::BEGIN@10 at line 14
use base 'Class::MOP::Method::Inlined';
# spent 1.06ms making 1 call to Class::MOP::Method::Constructor::BEGIN@14 # spent 1.05ms making 1 call to base::import
15
16
# spent 23.9ms (506µs+23.4) within Class::MOP::Method::Constructor::new which was called 31 times, avg 772µs/call: # 31 times (506µs+23.4ms) by Class::MOP::Class::_inline_constructor at line 1055 of Class/MOP/Class.pm, avg 772µs/call
sub new {
173111µs my $class = shift;
183165µs my %options = @_;
19
2031179µs6249µs (blessed $options{metaclass} && $options{metaclass}->isa('Class::MOP::Class'))
# spent 27µs making 31 calls to UNIVERSAL::isa, avg 868ns/call # spent 22µs making 31 calls to Scalar::Util::blessed, avg 703ns/call
21 || confess "You must pass a metaclass instance if you want to inline"
22 if $options{is_inline};
23
243111µs ($options{package_name} && $options{name})
25 || confess "You must supply the package_name and name parameters $Class::MOP::Method::UPGRADE_ERROR_TEXT";
26
273144µs31476µs my $self = $class->_new(\%options);
# spent 476µs making 31 calls to Class::MOP::Method::Constructor::_new, avg 15µs/call
28
29 # we don't want this creating
30 # a cycle in the code, if not
31 # needed
323198µs3136µs weaken($self->{'associated_metaclass'});
# spent 36µs making 31 calls to Scalar::Util::weaken, avg 1µs/call
33
343136µs3122.9ms $self->_initialize_body;
# spent 22.9ms making 31 calls to Class::MOP::Method::Constructor::_initialize_body, avg 738µs/call
35
363183µs return $self;
37}
38
39
# spent 476µs within Class::MOP::Method::Constructor::_new which was called 31 times, avg 15µs/call: # 31 times (476µs+0s) by Class::MOP::Method::Constructor::new at line 27, avg 15µs/call
sub _new {
40317µs my $class = shift;
41
423110µs return Class::MOP::Class->initialize($class)->new_object(@_)
43 if $class ne __PACKAGE__;
44
453116µs my $params = @_ == 1 ? $_[0] : {@_};
46
4731467µs return bless {
48 # inherited from Class::MOP::Method
49 body => $params->{body},
50 # associated_metaclass => $params->{associated_metaclass}, # overriden
51 package_name => $params->{package_name},
52 name => $params->{name},
53 original_method => $params->{original_method},
54
55 # inherited from Class::MOP::Generated
56 is_inline => $params->{is_inline} || 0,
57 definition_context => $params->{definition_context},
58
59 # inherited from Class::MOP::Inlined
60 _expected_method_class => $params->{_expected_method_class},
61
62 # defined in this subclass
63 options => $params->{options} || {},
64 associated_metaclass => $params->{metaclass},
65 }, $class;
66}
67
68## accessors
69
703274µs
# spent 43µs within Class::MOP::Method::Constructor::options which was called 32 times, avg 1µs/call: # 31 times (40µs+0s) by Class::MOP::Method::Constructor::_generate_constructor_method_inline at line 119, avg 1µs/call # once (2µs+0s) by Moose::Meta::Method::Constructor::_initialize_body at line 75 of Moose/Meta/Method/Constructor.pm
sub options { (shift)->{'options'} }
71124236µs
# spent 114µs within Class::MOP::Method::Constructor::associated_metaclass which was called 124 times, avg 918ns/call: # 31 times (34µs+0s) by Class::MOP::Method::Inlined::can_be_inlined at line 34 of Class/MOP/Method/Inlined.pm, avg 1µs/call # 31 times (30µs+0s) by Class::MOP::Method::Constructor::_generate_constructor_method_inline at line 109, avg 965ns/call # 31 times (27µs+0s) by Class::MOP::Method::Constructor::_attributes at line 82, avg 861ns/call # 31 times (23µs+0s) by Class::MOP::Method::Constructor::_meta_instance at line 77, avg 739ns/call
sub associated_metaclass { (shift)->{'associated_metaclass'} }
72
73## cached values ...
74
75
# spent 4.51ms (638µs+3.87) within Class::MOP::Method::Constructor::_meta_instance which was called 381 times, avg 12µs/call: # 343 times (444µs+0s) by Class::MOP::Method::Constructor::_generate_slot_initializer at line 159, avg 1µs/call # 31 times (174µs+3.87ms) by Class::MOP::Method::Constructor::_generate_constructor_method_inline at line 113, avg 130µs/call # 6 times (8µs+0s) by Moose::Meta::Method::Constructor::_generate_slot_assignment at line 272 of Moose/Meta/Method/Constructor.pm, avg 1µs/call # once (12µs+2µs) by Moose::Meta::Method::Constructor::_generate_instance at line 121 of Moose/Meta/Method/Constructor.pm
sub _meta_instance {
7638158µs my $self = shift;
77381774µs643.87ms $self->{'meta_instance'} ||= $self->associated_metaclass->get_meta_instance;
# spent 3.84ms making 32 calls to Class::MOP::Class::get_meta_instance, avg 120µs/call # spent 23µs making 31 calls to Class::MOP::Method::Constructor::associated_metaclass, avg 739ns/call # spent 1µs making 1 call to Class::MOP::Method::associated_metaclass
78}
79
80
# spent 1.95ms (221µs+1.73) within Class::MOP::Method::Constructor::_attributes which was called 42 times, avg 47µs/call: # 31 times (200µs+1.70ms) by Class::MOP::Method::Constructor::_generate_constructor_method_inline at line 116, avg 61µs/call # 4 times (5µs+0s) by Moose::Meta::Method::Constructor::_generate_slot_initializer at line 194 of Moose/Meta/Method/Constructor.pm, avg 1µs/call # 4 times (5µs+0s) by Moose::Meta::Method::Constructor::_generate_triggers at line 163 of Moose/Meta/Method/Constructor.pm, avg 1µs/call # once (9µs+33µs) by Moose::Meta::Method::Constructor::_generate_slot_initializers at line 129 of Moose/Meta/Method/Constructor.pm # once (1µs+0s) by Moose::Meta::Method::Constructor::_generate_triggers at line 162 of Moose/Meta/Method/Constructor.pm # once (1µs+0s) by Moose::Meta::Method::Constructor::_initialize_body at line 86 of Moose/Meta/Method/Constructor.pm
sub _attributes {
81429µs my $self = shift;
8242170µs641.73ms $self->{'attributes'} ||= [ $self->associated_metaclass->get_all_attributes ]
# spent 1.71ms making 32 calls to Class::MOP::Class::get_all_attributes, avg 53µs/call # spent 27µs making 31 calls to Class::MOP::Method::Constructor::associated_metaclass, avg 861ns/call # spent 800ns making 1 call to Class::MOP::Method::associated_metaclass
83}
84
85## method
86
87
# spent 22.9ms (221µs+22.6) within Class::MOP::Method::Constructor::_initialize_body which was called 31 times, avg 738µs/call: # 31 times (221µs+22.6ms) by Class::MOP::Method::Constructor::new at line 34, avg 738µs/call
sub _initialize_body {
88317µs my $self = shift;
89318µs my $method_name = '_generate_constructor_method';
90
913136µs3138µs $method_name .= '_inline' if $self->is_inline;
# spent 38µs making 31 calls to Class::MOP::Method::Generated::is_inline, avg 1µs/call
92
9331119µs3122.6ms $self->{'body'} = $self->$method_name;
# spent 22.6ms making 31 calls to Class::MOP::Method::Constructor::_generate_constructor_method_inline, avg 729µs/call
94}
95
96sub _generate_constructor_method {
97 return sub { Class::MOP::Class->initialize(shift)->new_object(@_) }
98}
99
100
# spent 22.6ms (1.53+21.1) within Class::MOP::Method::Constructor::_generate_constructor_method_inline which was called 31 times, avg 729µs/call: # 31 times (1.53ms+21.1ms) by Class::MOP::Method::Constructor::_initialize_body at line 93, avg 729µs/call
sub _generate_constructor_method_inline {
101318µs my $self = shift;
102
103317µs my $close_over = {};
104
105314µs my $source = 'sub {';
106313µs $source .= "\n" . 'my $class = shift;';
107
108314µs $source .= "\n" . 'return Class::MOP::Class->initialize($class)->new_object(@_)';
10931102µs6246µs $source .= "\n" . ' if $class ne \'' . $self->associated_metaclass->name . '\';';
# spent 30µs making 31 calls to Class::MOP::Method::Constructor::associated_metaclass, avg 965ns/call # spent 16µs making 31 calls to Class::MOP::Package::name, avg 529ns/call
110
111315µs $source .= "\n" . 'my $params = @_ == 1 ? $_[0] : {@_};';
112
1133181µs624.10ms $source .= "\n" . 'my $instance = ' . $self->_meta_instance->inline_create_instance('$class');
# spent 4.04ms making 31 calls to Class::MOP::Method::Constructor::_meta_instance, avg 130µs/call # spent 63µs making 31 calls to Class::MOP::Instance::inline_create_instance, avg 2µs/call
114267252µs2678.22ms $source .= ";\n" . (join ";\n" => map {
# spent 8.22ms making 267 calls to Class::MOP::Method::Constructor::_generate_slot_initializer, avg 31µs/call
115 $self->_generate_slot_initializer($_, $close_over)
11631313µs311.90ms } @{ $self->_attributes });
# spent 1.90ms making 31 calls to Class::MOP::Method::Constructor::_attributes, avg 61µs/call
117316µs $source .= ";\n" . 'return $instance';
118314µs $source .= ";\n" . '}';
1193144µs3140µs warn $source if $self->options->{debug};
# spent 40µs making 31 calls to Class::MOP::Method::Constructor::options, avg 1µs/call
120
1213157µs316.77ms my ( $code, $e ) = $self->_eval_closure(
# spent 6.77ms making 31 calls to Class::MOP::Method::Generated::_eval_closure, avg 218µs/call
122 $close_over,
123 $source
124 );
125315µs confess "Could not eval the constructor :\n\n$source\n\nbecause :\n\n$e" if $e;
126
1273173µs return $code;
128}
129
130
# spent 8.22ms (4.47+3.75) within Class::MOP::Method::Constructor::_generate_slot_initializer which was called 267 times, avg 31µs/call: # 267 times (4.47ms+3.75ms) by Class::MOP::Method::Constructor::_generate_constructor_method_inline at line 114, avg 31µs/call
sub _generate_slot_initializer {
13126757µs my $self = shift;
13226731µs my $attr = shift;
13326732µs my $close = shift;
134
1352678µs my $default;
136267434µs447547µs if ($attr->has_default) {
# spent 345µs making 267 calls to Class::MOP::Mixin::AttributeCore::has_default, avg 1µs/call # spent 202µs making 180 calls to Class::MOP::Mixin::AttributeCore::has_builder, avg 1µs/call
137 # NOTE:
138 # default values can either be CODE refs
139 # in which case we need to call them. Or
140 # they can be scalars (strings/numbers)
141 # in which case we can just deal with them
142 # in the code we eval.
1438789µs87205µs if ($attr->is_default_a_coderef) {
# spent 205µs making 87 calls to Class::MOP::Mixin::AttributeCore::is_default_a_coderef, avg 2µs/call
1445845µs my $idx = @{$close->{'@defaults'}||=[]};
1455881µs58101µs push(@{$close->{'@defaults'}}, $attr->default);
# spent 101µs making 58 calls to Class::MOP::Mixin::AttributeCore::default, avg 2µs/call
1465841µs $default = '$defaults[' . $idx . ']->($instance)';
147 }
148 else {
1492934µs2961µs $default = $attr->default;
# spent 61µs making 29 calls to Class::MOP::Mixin::AttributeCore::default, avg 2µs/call
150 # make sure to quote strings ...
15129103µs2934µs unless (looks_like_number($default)) {
# spent 34µs making 29 calls to Scalar::Util::looks_like_number, avg 1µs/call
152 $default = "'$default'";
153 }
154 }
155 } elsif( $attr->has_builder ) {
156 $default = '$instance->'.$attr->builder;
157 }
158
1592672.27ms12962.80ms if ( defined(my $init_arg = $attr->init_arg) ) {
# spent 1.87ms making 343 calls to Class::MOP::Instance::inline_set_slot_value, avg 5µs/call # spent 444µs making 343 calls to Class::MOP::Method::Constructor::_meta_instance, avg 1µs/call # spent 318µs making 267 calls to Class::MOP::Mixin::AttributeCore::init_arg, avg 1µs/call # spent 169µs making 343 calls to Class::MOP::Mixin::AttributeCore::name, avg 491ns/call
160 return (
161 'if(exists $params->{\'' . $init_arg . '\'}){' . "\n" .
162 $self->_meta_instance->inline_set_slot_value(
163 '$instance',
164 $attr->name,
165 '$params->{\'' . $init_arg . '\'}' ) . "\n" .
166 '} ' . (!defined $default ? '' : 'else {' . "\n" .
167 $self->_meta_instance->inline_set_slot_value(
168 '$instance',
169 $attr->name,
170 $default ) . "\n" .
171 '}')
172 );
173 } elsif ( defined $default ) {
174 return (
175 $self->_meta_instance->inline_set_slot_value(
176 '$instance',
177 $attr->name,
178 $default ) . "\n"
179 );
18012µs } else { return '' }
181}
182
18315µs1;
184
185__END__
186
187=pod
188
189=head1 NAME
190
191Class::MOP::Method::Constructor - Method Meta Object for constructors
192
193=head1 SYNOPSIS
194
195 use Class::MOP::Method::Constructor;
196
197 my $constructor = Class::MOP::Method::Constructor->new(
198 metaclass => $metaclass,
199 options => {
200 debug => 1, # this is all for now
201 },
202 );
203
204 # calling the constructor ...
205 $constructor->body->execute($metaclass->name, %params);
206
207=head1 DESCRIPTION
208
209This is a subclass of C<Class::MOP::Method> which generates
210constructor methods.
211
212=head1 METHODS
213
214=over 4
215
216=item B<< Class::MOP::Method::Constructor->new(%options) >>
217
218This creates a new constructor object. It accepts a hash reference of
219options.
220
221=over 8
222
223=item * metaclass
224
225This should be a L<Class::MOP::Class> object. It is required.
226
227=item * name
228
229The method name (without a package name). This is required.
230
231=item * package_name
232
233The package name for the method. This is required.
234
235=item * is_inline
236
237This indicates whether or not the constructor should be inlined. This
238defaults to false.
239
240=back
241
242=item B<< $metamethod->is_inline >>
243
244Returns a boolean indicating whether or not the constructor is
245inlined.
246
247=item B<< $metamethod->associated_metaclass >>
248
249This returns the L<Class::MOP::Class> object for the method.
250
251=back
252
253=head1 AUTHORS
254
255Stevan Little E<lt>stevan@iinteractive.comE<gt>
256
257=head1 COPYRIGHT AND LICENSE
258
259Copyright 2006-2010 by Infinity Interactive, Inc.
260
261L<http://www.iinteractive.com>
262
263This library is free software; you can redistribute it and/or modify
264it under the same terms as Perl itself.
265
266=cut
267