← Index
NYTProf Performance Profile   « block view • line view • sub view »
For xt/tapper-mcp-scheduler-with-db-longrun.t
  Run on Tue May 22 17:18:39 2012
Reported on Tue May 22 17:22:35 2012

Filename/2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/x86_64-linux/Moose/Meta/TypeConstraint/Union.pm
StatementsExecuted 26 statements in 1.08ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
111383µs1.07msMoose::Meta::TypeConstraint::Union::::BEGIN@14Moose::Meta::TypeConstraint::Union::BEGIN@14
1119µs33µsMoose::Meta::TypeConstraint::Union::::BEGIN@16Moose::Meta::TypeConstraint::Union::BEGIN@16
1118µs8µsMoose::Meta::TypeConstraint::Union::::BEGIN@3Moose::Meta::TypeConstraint::Union::BEGIN@3
1118µs632µsMoose::Meta::TypeConstraint::Union::::BEGIN@12Moose::Meta::TypeConstraint::Union::BEGIN@12
1118µs15µsMoose::Meta::TypeConstraint::Union::::BEGIN@11Moose::Meta::TypeConstraint::Union::BEGIN@11
1117µs26µsMoose::Meta::TypeConstraint::Union::::BEGIN@17Moose::Meta::TypeConstraint::Union::BEGIN@17
1117µs9µsMoose::Meta::TypeConstraint::Union::::BEGIN@10Moose::Meta::TypeConstraint::Union::BEGIN@10
1116µs56µsMoose::Meta::TypeConstraint::Union::::BEGIN@19Moose::Meta::TypeConstraint::Union::BEGIN@19
0000s0sMoose::Meta::TypeConstraint::Union::::__ANON__[:143]Moose::Meta::TypeConstraint::Union::__ANON__[:143]
0000s0sMoose::Meta::TypeConstraint::Union::::__ANON__[:164]Moose::Meta::TypeConstraint::Union::__ANON__[:164]
0000s0sMoose::Meta::TypeConstraint::Union::::__ANON__[:170]Moose::Meta::TypeConstraint::Union::__ANON__[:170]
0000s0sMoose::Meta::TypeConstraint::Union::::__ANON__[:176]Moose::Meta::TypeConstraint::Union::__ANON__[:176]
0000s0sMoose::Meta::TypeConstraint::Union::::__ANON__[:23]Moose::Meta::TypeConstraint::Union::__ANON__[:23]
0000s0sMoose::Meta::TypeConstraint::Union::::__ANON__[:38]Moose::Meta::TypeConstraint::Union::__ANON__[:38]
0000s0sMoose::Meta::TypeConstraint::Union::::__ANON__[:78]Moose::Meta::TypeConstraint::Union::__ANON__[:78]
0000s0sMoose::Meta::TypeConstraint::Union::::_actually_compile_type_constraintMoose::Meta::TypeConstraint::Union::_actually_compile_type_constraint
0000s0sMoose::Meta::TypeConstraint::Union::::_inline_checkMoose::Meta::TypeConstraint::Union::_inline_check
0000s0sMoose::Meta::TypeConstraint::Union::::can_be_inlinedMoose::Meta::TypeConstraint::Union::can_be_inlined
0000s0sMoose::Meta::TypeConstraint::Union::::coercionMoose::Meta::TypeConstraint::Union::coercion
0000s0sMoose::Meta::TypeConstraint::Union::::create_child_typeMoose::Meta::TypeConstraint::Union::create_child_type
0000s0sMoose::Meta::TypeConstraint::Union::::equalsMoose::Meta::TypeConstraint::Union::equals
0000s0sMoose::Meta::TypeConstraint::Union::::find_type_forMoose::Meta::TypeConstraint::Union::find_type_for
0000s0sMoose::Meta::TypeConstraint::Union::::has_coercionMoose::Meta::TypeConstraint::Union::has_coercion
0000s0sMoose::Meta::TypeConstraint::Union::::inline_environmentMoose::Meta::TypeConstraint::Union::inline_environment
0000s0sMoose::Meta::TypeConstraint::Union::::is_a_type_ofMoose::Meta::TypeConstraint::Union::is_a_type_of
0000s0sMoose::Meta::TypeConstraint::Union::::is_subtype_ofMoose::Meta::TypeConstraint::Union::is_subtype_of
0000s0sMoose::Meta::TypeConstraint::Union::::newMoose::Meta::TypeConstraint::Union::new
0000s0sMoose::Meta::TypeConstraint::Union::::parentMoose::Meta::TypeConstraint::Union::parent
0000s0sMoose::Meta::TypeConstraint::Union::::validateMoose::Meta::TypeConstraint::Union::validate
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1
2package Moose::Meta::TypeConstraint::Union;
3
# spent 8µs within Moose::Meta::TypeConstraint::Union::BEGIN@3 which was called: # once (8µs+0s) by Moose::Util::TypeConstraints::BEGIN@33 at line 5
BEGIN {
418µs $Moose::Meta::TypeConstraint::Union::AUTHORITY = 'cpan:STEVAN';
5123µs18µs}
# spent 8µs making 1 call to Moose::Meta::TypeConstraint::Union::BEGIN@3
6{
721µs $Moose::Meta::TypeConstraint::Union::VERSION = '2.0602';
8}
9
10320µs211µs
# spent 9µs (7+2) within Moose::Meta::TypeConstraint::Union::BEGIN@10 which was called: # once (7µs+2µs) by Moose::Util::TypeConstraints::BEGIN@33 at line 10
use strict;
# spent 9µs making 1 call to Moose::Meta::TypeConstraint::Union::BEGIN@10 # spent 2µs making 1 call to strict::import
11316µs223µs
# spent 15µs (8+7) within Moose::Meta::TypeConstraint::Union::BEGIN@11 which was called: # once (8µs+7µs) by Moose::Util::TypeConstraints::BEGIN@33 at line 11
use warnings;
# spent 15µs making 1 call to Moose::Meta::TypeConstraint::Union::BEGIN@11 # spent 8µs making 1 call to warnings::import
12329µs21.26ms
# spent 632µs (8+624) within Moose::Meta::TypeConstraint::Union::BEGIN@12 which was called: # once (8µs+624µs) by Moose::Util::TypeConstraints::BEGIN@33 at line 12
use metaclass;
# spent 632µs making 1 call to Moose::Meta::TypeConstraint::Union::BEGIN@12 # spent 624µs making 1 call to metaclass::import
13
143123µs11.07ms
# spent 1.07ms (383µs+684µs) within Moose::Meta::TypeConstraint::Union::BEGIN@14 which was called: # once (383µs+684µs) by Moose::Util::TypeConstraints::BEGIN@33 at line 14
use Moose::Meta::TypeCoercion::Union;
# spent 1.07ms making 1 call to Moose::Meta::TypeConstraint::Union::BEGIN@14
15
16320µs258µs
# spent 33µs (9+25) within Moose::Meta::TypeConstraint::Union::BEGIN@16 which was called: # once (9µs+25µs) by Moose::Util::TypeConstraints::BEGIN@33 at line 16
use List::MoreUtils qw(all);
# spent 33µs making 1 call to Moose::Meta::TypeConstraint::Union::BEGIN@16 # spent 25µs making 1 call to Exporter::import
17320µs244µs
# spent 26µs (7+19) within Moose::Meta::TypeConstraint::Union::BEGIN@17 which was called: # once (7µs+19µs) by Moose::Util::TypeConstraints::BEGIN@33 at line 17
use List::Util qw(first);
# spent 26µs making 1 call to Moose::Meta::TypeConstraint::Union::BEGIN@17 # spent 19µs making 1 call to Exporter::import
18
193809µs2107µs
# spent 56µs (6+51) within Moose::Meta::TypeConstraint::Union::BEGIN@19 which was called: # once (6µs+51µs) by Moose::Util::TypeConstraints::BEGIN@33 at line 19
use base 'Moose::Meta::TypeConstraint';
# spent 56µs making 1 call to Moose::Meta::TypeConstraint::Union::BEGIN@19 # spent 51µs making 1 call to base::import
20
21__PACKAGE__->meta->add_attribute('type_constraints' => (
22 accessor => 'type_constraints',
23 default => sub { [] },
2418µs3520µs Class::MOP::_definition_context(),
# spent 485µs making 1 call to Class::MOP::Mixin::HasAttributes::add_attribute # spent 25µs making 1 call to Moose::Meta::TypeConstraint::Union::meta # spent 10µs making 1 call to Class::MOP::_definition_context
25));
26
27sub new {
28 my ($class, %options) = @_;
29
30 my $name = join '|' => sort { $a cmp $b }
31 map { $_->name } @{ $options{type_constraints} };
32
33 my $self = $class->SUPER::new(
34 name => $name,
35 %options,
36 );
37
38 $self->_set_constraint(sub { $self->check($_[0]) });
39
40 return $self;
41}
42
43# XXX - this is a rather gross implementation of laziness for the benefit of
44# MX::Types. If we try to call ->has_coercion on the objects during object
45# construction, this does not work when defining a recursive constraint with
46# MX::Types.
47sub coercion {
48 my $self = shift;
49
50 return $self->{coercion} if exists $self->{coercion};
51
52 # Using any instead of grep here causes a weird error with some corner
53 # cases when MX::Types is in use. See RT #61001.
54 if ( grep { $_->has_coercion } @{ $self->type_constraints } ) {
55 return $self->{coercion} = Moose::Meta::TypeCoercion::Union->new(
56 type_constraint => $self );
57 }
58 else {
59 return $self->{coercion} = undef;
60 }
61}
62
63sub has_coercion {
64 return defined $_[0]->coercion;
65}
66
67sub _actually_compile_type_constraint {
68 my $self = shift;
69
70 my @constraints = @{ $self->type_constraints };
71
72 return sub {
73 my $value = shift;
74 foreach my $type (@constraints) {
75 return 1 if $type->check($value);
76 }
77 return undef;
78 };
79}
80
81sub can_be_inlined {
82 my $self = shift;
83
84 # This was originally done with all() from List::MoreUtils, but that
85 # caused some sort of bizarro parsing failure under 5.10.
86 for my $tc ( @{ $self->type_constraints } ) {
87 return 0 unless $tc->can_be_inlined;
88 }
89
90 return 1;
91}
92
93sub _inline_check {
94 my $self = shift;
95 my $val = shift;
96
97 return '('
98 . (
99 join ' || ', map { '(' . $_->_inline_check($val) . ')' }
100 @{ $self->type_constraints }
101 )
102 . ')';
103}
104
105sub inline_environment {
106 my $self = shift;
107
108 return { map { %{ $_->inline_environment } }
109 @{ $self->type_constraints } };
110}
111
112sub equals {
113 my ( $self, $type_or_name ) = @_;
114
115 my $other = Moose::Util::TypeConstraints::find_type_constraint($type_or_name);
116
117 return unless $other->isa(__PACKAGE__);
118
119 my @self_constraints = @{ $self->type_constraints };
120 my @other_constraints = @{ $other->type_constraints };
121
122 return unless @self_constraints == @other_constraints;
123
124 # FIXME presort type constraints for efficiency?
125 constraint: foreach my $constraint ( @self_constraints ) {
126 for ( my $i = 0; $i < @other_constraints; $i++ ) {
127 if ( $constraint->equals($other_constraints[$i]) ) {
128 splice @other_constraints, $i, 1;
129 next constraint;
130 }
131 }
132 }
133
134 return @other_constraints == 0;
135}
136
137sub parent {
138 my $self = shift;
139
140 my ($first, @rest) = @{ $self->type_constraints };
141
142 for my $parent ( $first->_collect_all_parents ) {
143 return $parent if all { $_->is_a_type_of($parent) } @rest;
144 }
145
146 return;
147}
148
149sub validate {
150 my ($self, $value) = @_;
151 my $message;
152 foreach my $type (@{$self->type_constraints}) {
153 my $err = $type->validate($value);
154 return unless defined $err;
155 $message .= ($message ? ' and ' : '') . $err
156 if defined $err;
157 }
158 return ($message . ' in (' . $self->name . ')') ;
159}
160
161sub find_type_for {
162 my ($self, $value) = @_;
163
164 return first { $_->check($value) } @{ $self->type_constraints };
165}
166
167sub is_a_type_of {
168 my ($self, $type_name) = @_;
169
170 return all { $_->is_a_type_of($type_name) } @{ $self->type_constraints };
171}
172
173sub is_subtype_of {
174 my ($self, $type_name) = @_;
175
176 return all { $_->is_subtype_of($type_name) } @{ $self->type_constraints };
177}
178
179sub create_child_type {
180 my ( $self, %opts ) = @_;
181
182 my $constraint
183 = Moose::Meta::TypeConstraint->new( %opts, parent => $self );
184
185 # if we have a type constraint union, and no
186 # type check, this means we are just aliasing
187 # the union constraint, which means we need to
188 # handle this differently.
189 # - SL
190 if ( not( defined $opts{constraint} )
191 && $self->has_coercion ) {
192 $constraint->coercion(
193 Moose::Meta::TypeCoercion::Union->new(
194 type_constraint => $self,
195 )
196 );
197 }
198
199 return $constraint;
200}
201
20217µs1;
203
204# ABSTRACT: A union of Moose type constraints
205
- -
208=pod
209
210=head1 NAME
211
212Moose::Meta::TypeConstraint::Union - A union of Moose type constraints
213
214=head1 VERSION
215
216version 2.0602
217
218=head1 DESCRIPTION
219
220This metaclass represents a union of type constraints. A union takes
221multiple type constraints, and is true if any one of its member
222constraints is true.
223
224=head1 INHERITANCE
225
226C<Moose::Meta::TypeConstraint::Union> is a subclass of
227L<Moose::Meta::TypeConstraint>.
228
229=over 4
230
231=item B<< Moose::Meta::TypeConstraint::Union->new(%options) >>
232
233This creates a new class type constraint based on the given
234C<%options>.
235
236It takes the same options as its parent. It also requires an
237additional option, C<type_constraints>. This is an array reference
238containing the L<Moose::Meta::TypeConstraint> objects that are the
239members of the union type. The C<name> option defaults to the names
240all of these member types sorted and then joined by a pipe (|).
241
242The constructor sets the implementation of the constraint so that is
243simply calls C<check> on the newly created object.
244
245Finally, the constructor also makes sure that the object's C<coercion>
246attribute is a L<Moose::Meta::TypeCoercion::Union> object.
247
248=item B<< $constraint->type_constraints >>
249
250This returns the array reference of C<type_constraints> provided to
251the constructor.
252
253=item B<< $constraint->parent >>
254
255This returns the nearest common ancestor of all the components of the union.
256
257=item B<< $constraint->check($value) >>
258
259=item B<< $constraint->validate($value) >>
260
261These two methods simply call the relevant method on each of the
262member type constraints in the union. If any type accepts the value,
263the value is valid.
264
265With C<validate> the error message returned includes all of the error
266messages returned by the member type constraints.
267
268=item B<< $constraint->equals($type_name_or_object) >>
269
270A type is considered equal if it is also a union type, and the two
271unions have the same member types.
272
273=item B<< $constraint->find_type_for($value) >>
274
275This returns the first member type constraint for which C<check($value)> is
276true, allowing you to determine which of the Union's member type constraints
277a given value matches.
278
279=item B<< $constraint->is_a_type_of($type_name_or_object) >>
280
281This returns true if all of the member type constraints return true
282for the C<is_a_type_of> method.
283
284=item B<< $constraint->is_subtype_of >>
285
286This returns true if all of the member type constraints return true
287for the C<is_a_subtype_of> method.
288
289=item B<< $constraint->create_child_type(%options) >>
290
291This returns a new L<Moose::Meta::TypeConstraint> object with the type
292as its parent.
293
294=back
295
296=head1 BUGS
297
298See L<Moose/BUGS> for details on reporting bugs.
299
300=head1 AUTHOR
301
302Moose is maintained by the Moose Cabal, along with the help of many contributors. See L<Moose/CABAL> and L<Moose/CONTRIBUTORS> for details.
303
304=head1 COPYRIGHT AND LICENSE
305
306This software is copyright (c) 2012 by Infinity Interactive, Inc..
307
308This is free software; you can redistribute it and/or modify it under
309the same terms as the Perl 5 programming language system itself.
310
311=cut
312
313
314__END__