Filename | /Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Type/Tiny/Class.pm |
Statements | Executed 791 statements in 2.95ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
1 | 1 | 1 | 1.00ms | 1.08ms | BEGIN@19 | Type::Tiny::Class::
84 | 1 | 1 | 241µs | 583µs | parent | Type::Tiny::Class::
58 | 1 | 1 | 206µs | 206µs | __ANON__[:89] | Type::Tiny::Class::
10 | 2 | 2 | 166µs | 732µs | new | Type::Tiny::Class::
58 | 1 | 1 | 137µs | 197µs | inlined | Type::Tiny::Class::
5 | 1 | 1 | 97µs | 284µs | _build_parent | Type::Tiny::Class::
161 | 3 | 1 | 71µs | 71µs | _is_null_constraint | Type::Tiny::Class::
96 | 1 | 1 | 56µs | 56µs | has_inlined | Type::Tiny::Class::
7 | 1 | 1 | 54µs | 60µs | _build_inlined | Type::Tiny::Class::
1 | 1 | 1 | 34µs | 34µs | BEGIN@3 | Type::Tiny::Class::
1 | 1 | 1 | 15µs | 22µs | BEGIN@18 | Type::Tiny::Class::
12 | 2 | 1 | 12µs | 12µs | class | Type::Tiny::Class::
1 | 1 | 1 | 10µs | 13µs | BEGIN@185 | Type::Tiny::Class::
1 | 1 | 1 | 8µs | 45µs | BEGIN@14 | Type::Tiny::Class::
1 | 1 | 1 | 8µs | 11µs | BEGIN@4 | Type::Tiny::Class::
1 | 1 | 1 | 7µs | 41µs | BEGIN@5 | Type::Tiny::Class::
1 | 1 | 1 | 6µs | 23µs | BEGIN@93 | Type::Tiny::Class::
1 | 1 | 1 | 5µs | 11µs | BEGIN@164 | Type::Tiny::Class::
1 | 1 | 1 | 5µs | 12µs | BEGIN@164.74 | Type::Tiny::Class::
1 | 1 | 1 | 4µs | 4µs | BEGIN@7 | Type::Tiny::Class::
0 | 0 | 0 | 0s | 0s | __ANON__[:105] | Type::Tiny::Class::
0 | 0 | 0 | 0s | 0s | __ANON__[:201] | Type::Tiny::Class::
0 | 0 | 0 | 0s | 0s | __ANON__[:70] | Type::Tiny::Class::
0 | 0 | 0 | 0s | 0s | __ANON__[:99] | Type::Tiny::Class::
0 | 0 | 0 | 0s | 0s | _build_constraint | Type::Tiny::Class::
0 | 0 | 0 | 0s | 0s | _build_default_message | Type::Tiny::Class::
0 | 0 | 0 | 0s | 0s | _croak | Type::Tiny::Class::
0 | 0 | 0 | 0s | 0s | _exporter_fail | Type::Tiny::Class::
0 | 0 | 0 | 0s | 0s | _instantiate_moose_type | Type::Tiny::Class::
0 | 0 | 0 | 0s | 0s | _short_name | Type::Tiny::Class::
0 | 0 | 0 | 0s | 0s | plus_constructors | Type::Tiny::Class::
0 | 0 | 0 | 0s | 0s | validate_explain | Type::Tiny::Class::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package Type::Tiny::Class; | ||||
2 | |||||
3 | 2 | 64µs | 1 | 34µs | # spent 34µs within Type::Tiny::Class::BEGIN@3 which was called:
# once (34µs+0s) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 3 # spent 34µs making 1 call to Type::Tiny::Class::BEGIN@3 |
4 | 2 | 25µs | 2 | 14µs | # spent 11µs (8+3) within Type::Tiny::Class::BEGIN@4 which was called:
# once (8µs+3µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 4 # spent 11µs making 1 call to Type::Tiny::Class::BEGIN@4
# spent 3µs making 1 call to strict::import |
5 | 2 | 44µs | 2 | 75µs | # spent 41µs (7+34) within Type::Tiny::Class::BEGIN@5 which was called:
# once (7µs+34µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 5 # spent 41µs making 1 call to Type::Tiny::Class::BEGIN@5
# spent 34µs making 1 call to warnings::import |
6 | |||||
7 | # spent 4µs within Type::Tiny::Class::BEGIN@7 which was called:
# once (4µs+0s) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 10 | ||||
8 | 1 | 0s | $Type::Tiny::Class::AUTHORITY = 'cpan:TOBYINK'; | ||
9 | 1 | 4µs | $Type::Tiny::Class::VERSION = '2.000001'; | ||
10 | 1 | 40µs | 1 | 4µs | } # spent 4µs making 1 call to Type::Tiny::Class::BEGIN@7 |
11 | |||||
12 | 1 | 0s | $Type::Tiny::Class::VERSION =~ tr/_//d; | ||
13 | |||||
14 | 2 | 65µs | 2 | 82µs | # spent 45µs (8+37) within Type::Tiny::Class::BEGIN@14 which was called:
# once (8µs+37µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 14 # spent 45µs making 1 call to Type::Tiny::Class::BEGIN@14
# spent 37µs making 1 call to Exporter::import |
15 | |||||
16 | sub _croak ($;@) { require Error::TypeTiny; goto \&Error::TypeTiny::croak } | ||||
17 | |||||
18 | 3 | 38µs | 2 | 29µs | # spent 22µs (15+7) within Type::Tiny::Class::BEGIN@18 which was called:
# once (15µs+7µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 18 # spent 22µs making 1 call to Type::Tiny::Class::BEGIN@18
# spent 7µs making 1 call to UNIVERSAL::VERSION |
19 | 2 | 871µs | 1 | 1.08ms | # spent 1.08ms (1.00+79µs) within Type::Tiny::Class::BEGIN@19 which was called:
# once (1.00ms+79µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 19 # spent 1.08ms making 1 call to Type::Tiny::Class::BEGIN@19 |
20 | 1 | 7µs | our @ISA = qw( Type::Tiny::ConstrainedObject Exporter::Tiny ); | ||
21 | |||||
22 | sub _short_name { 'Class' } | ||||
23 | |||||
24 | sub _exporter_fail { | ||||
25 | my ( $class, $name, $opts, $globals ) = @_; | ||||
26 | my $caller = $globals->{into}; | ||||
27 | |||||
28 | $opts->{name} = $name unless exists $opts->{name}; $opts->{name} =~ s/:://g; | ||||
29 | $opts->{class} = $name unless exists $opts->{class}; | ||||
30 | my $type = $class->new($opts); | ||||
31 | |||||
32 | $INC{'Type/Registry.pm'} | ||||
33 | ? 'Type::Registry'->for_class( $caller )->add_type( $type ) | ||||
34 | : ( $Type::Registry::DELAYED{$caller}{$type->name} = $type ) | ||||
35 | unless( ref($caller) or $caller eq '-lexical' or $globals->{'lexical'} ); | ||||
36 | return map +( $_->{name} => $_->{code} ), @{ $type->exportables }; | ||||
37 | } | ||||
38 | |||||
39 | # spent 732µs (166+566) within Type::Tiny::Class::new which was called 10 times, avg 73µs/call:
# 7 times (137µs+423µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 970 of Types/Standard.pm, avg 80µs/call
# 3 times (29µs+143µs) by Type::Tiny::Class::_build_parent at line 171, avg 57µs/call | ||||
40 | 10 | 2µs | my $proto = shift; | ||
41 | 10 | 26µs | 10 | 8µs | return $proto->class->new( @_ ) if blessed $proto; # DWIM # spent 8µs making 10 calls to Scalar::Util::blessed, avg 800ns/call |
42 | |||||
43 | 10 | 54µs | my %opts = ( @_ == 1 ) ? %{ $_[0] } : @_; | ||
44 | 10 | 3µs | _croak "Need to supply class name" unless exists $opts{class}; | ||
45 | |||||
46 | 10 | 25µs | 10 | 30µs | if ( Type::Tiny::_USE_XS ) { # spent 30µs making 10 calls to Type::Tiny::__ANON__[Type/Tiny.pm:55], avg 3µs/call |
47 | my $xsub = | ||||
48 | Type::Tiny::XS::get_coderef_for( "InstanceOf[" . $opts{class} . "]" ); | ||||
49 | $opts{compiled_type_constraint} = $xsub if $xsub; | ||||
50 | } | ||||
51 | elsif ( Type::Tiny::_USE_MOUSE ) { | ||||
52 | require Mouse::Util::TypeConstraints; | ||||
53 | my $maker = "Mouse::Util::TypeConstraints"->can( "generate_isa_predicate_for" ); | ||||
54 | $opts{compiled_type_constraint} = $maker->( $opts{class} ) if $maker; | ||||
55 | } | ||||
56 | |||||
57 | 10 | 46µs | 10 | 528µs | return $proto->SUPER::new( %opts ); # spent 528µs making 10 calls to Type::Tiny::ConstrainedObject::new, avg 53µs/call |
58 | } #/ sub new | ||||
59 | |||||
60 | 12 | 22µs | sub class { $_[0]{class} } | ||
61 | 58 | 164µs | 7 | 60µs | # spent 197µs (137+60) within Type::Tiny::Class::inlined which was called 58 times, avg 3µs/call:
# 58 times (137µs+60µs) by Type::Tiny::inline_check at line 895 of Type/Tiny.pm, avg 3µs/call # spent 60µs making 7 calls to Type::Tiny::Class::_build_inlined, avg 9µs/call |
62 | |||||
63 | 96 | 115µs | # spent 56µs within Type::Tiny::Class::has_inlined which was called 96 times, avg 583ns/call:
# 96 times (56µs+0s) by Type::Tiny::can_be_inlined at line 881 of Type/Tiny.pm, avg 583ns/call | ||
64 | |||||
65 | 161 | 181µs | # spent 71µs within Type::Tiny::Class::_is_null_constraint which was called 161 times, avg 441ns/call:
# 96 times (55µs+0s) by Type::Tiny::can_be_inlined at line 877 of Type/Tiny.pm, avg 573ns/call
# 58 times (12µs+0s) by Type::Tiny::inline_check at line 889 of Type/Tiny.pm, avg 207ns/call
# 7 times (4µs+0s) by Type::Tiny::_build_compiled_check at line 532 of Type/Tiny.pm, avg 571ns/call | ||
66 | |||||
67 | sub _build_constraint { | ||||
68 | my $self = shift; | ||||
69 | my $class = $self->class; | ||||
70 | return sub { blessed( $_ ) and $_->isa( $class ) }; | ||||
71 | } | ||||
72 | |||||
73 | # spent 60µs (54+6) within Type::Tiny::Class::_build_inlined which was called 7 times, avg 9µs/call:
# 7 times (54µs+6µs) by Type::Tiny::Class::inlined at line 61, avg 9µs/call | ||||
74 | 7 | 3µs | my $self = shift; | ||
75 | 7 | 14µs | 7 | 6µs | my $class = $self->class; # spent 6µs making 7 calls to Type::Tiny::Class::class, avg 857ns/call |
76 | |||||
77 | 7 | 1µs | my $xsub; | ||
78 | $xsub = Type::Tiny::XS::get_subname_for( "InstanceOf[$class]" ) | ||||
79 | if Type::Tiny::_USE_XS; | ||||
80 | |||||
81 | # spent 206µs within Type::Tiny::Class::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Type/Tiny/Class.pm:89] which was called 58 times, avg 4µs/call:
# 58 times (206µs+0s) by Type::Tiny::inline_check at line 895 of Type/Tiny.pm, avg 4µs/call | ||||
82 | 58 | 53µs | my $var = $_[1]; | ||
83 | return | ||||
84 | 58 | 25µs | qq{do { use Scalar::Util (); Scalar::Util::blessed($var) and $var->isa(q[$class]) }} | ||
85 | if $Type::Tiny::AvoidCallbacks; | ||||
86 | 58 | 11µs | return "$xsub\($var\)" | ||
87 | if $xsub; | ||||
88 | 58 | 133µs | qq{Scalar::Util::blessed($var) and $var->isa(q[$class])}; | ||
89 | 7 | 37µs | }; | ||
90 | } #/ sub _build_inlined | ||||
91 | |||||
92 | sub _build_default_message { | ||||
93 | 2 | 241µs | 2 | 40µs | # spent 23µs (6+17) within Type::Tiny::Class::BEGIN@93 which was called:
# once (6µs+17µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 93 # spent 23µs making 1 call to Type::Tiny::Class::BEGIN@93
# spent 17µs making 1 call to warnings::unimport |
94 | my $self = shift; | ||||
95 | my $c = $self->class; | ||||
96 | return sub { | ||||
97 | sprintf '%s did not pass type constraint (not isa %s)', | ||||
98 | Type::Tiny::_dd( $_[0] ), $c; | ||||
99 | } | ||||
100 | if $self->is_anon; | ||||
101 | my $name = "$self"; | ||||
102 | return sub { | ||||
103 | sprintf '%s did not pass type constraint "%s" (not isa %s)', | ||||
104 | Type::Tiny::_dd( $_[0] ), $name, $c; | ||||
105 | }; | ||||
106 | } #/ sub _build_default_message | ||||
107 | |||||
108 | sub _instantiate_moose_type { | ||||
109 | my $self = shift; | ||||
110 | my %opts = @_; | ||||
111 | delete $opts{parent}; | ||||
112 | delete $opts{constraint}; | ||||
113 | delete $opts{inlined}; | ||||
114 | require Moose::Meta::TypeConstraint::Class; | ||||
115 | return "Moose::Meta::TypeConstraint::Class" | ||||
116 | ->new( %opts, class => $self->class ); | ||||
117 | } #/ sub _instantiate_moose_type | ||||
118 | |||||
119 | sub plus_constructors { | ||||
120 | my $self = shift; | ||||
121 | |||||
122 | unless ( @_ ) { | ||||
123 | require Types::Standard; | ||||
124 | push @_, Types::Standard::HashRef(), "new"; | ||||
125 | } | ||||
126 | |||||
127 | require B; | ||||
128 | require Types::TypeTiny; | ||||
129 | |||||
130 | my $class = B::perlstring( $self->class ); | ||||
131 | |||||
132 | my @r; | ||||
133 | while ( @_ ) { | ||||
134 | my $source = shift; | ||||
135 | Types::TypeTiny::is_TypeTiny( $source ) | ||||
136 | or _croak "Expected type constraint; got $source"; | ||||
137 | |||||
138 | my $constructor = shift; | ||||
139 | Types::TypeTiny::is_StringLike( $constructor ) | ||||
140 | or _croak "Expected string; got $constructor"; | ||||
141 | |||||
142 | push @r, $source, sprintf( '%s->%s($_)', $class, $constructor ); | ||||
143 | } #/ while ( @_ ) | ||||
144 | |||||
145 | return $self->plus_coercions( \@r ); | ||||
146 | } #/ sub plus_constructors | ||||
147 | |||||
148 | # spent 583µs (241+342) within Type::Tiny::Class::parent which was called 84 times, avg 7µs/call:
# 84 times (241µs+342µs) by Type::Tiny::is_strictly_subtype_of at line 698 of Type/Tiny.pm, avg 7µs/call | ||||
149 | 84 | 258µs | 84 | 342µs | $_[0]{parent} ||= $_[0]->_build_parent; # spent 284µs making 5 calls to Type::Tiny::Class::_build_parent, avg 57µs/call
# spent 58µs making 79 calls to Type::Tiny::__ANON__[Type/Tiny.pm:101], avg 734ns/call |
150 | } | ||||
151 | |||||
152 | # spent 284µs (97+187) within Type::Tiny::Class::_build_parent which was called 5 times, avg 57µs/call:
# 5 times (97µs+187µs) by Type::Tiny::Class::parent at line 149, avg 57µs/call | ||||
153 | 5 | 0s | my $self = shift; | ||
154 | 5 | 8µs | 5 | 6µs | my $class = $self->class; # spent 6µs making 5 calls to Type::Tiny::Class::class, avg 1µs/call |
155 | |||||
156 | # Some classes (I'm looking at you, Math::BigFloat) include a class in | ||||
157 | # their @ISA to inherit methods, but then override isa() to return false, | ||||
158 | # so that they don't appear to be a subclass. | ||||
159 | # | ||||
160 | # In these cases, we don't want to list the parent class as a parent | ||||
161 | # type constraint. | ||||
162 | # | ||||
163 | my @isa = grep $class->isa( $_ ), | ||||
164 | 14 | 152µs | 7 | 39µs | # spent 11µs (5+6) within Type::Tiny::Class::BEGIN@164 which was called:
# once (5µs+6µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 164
# spent 12µs (5+7) within Type::Tiny::Class::BEGIN@164.74 which was called:
# once (5µs+7µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 164 # spent 12µs making 1 call to Type::Tiny::Class::BEGIN@164.74
# spent 11µs making 1 call to Type::Tiny::Class::BEGIN@164
# spent 7µs making 1 call to warnings::unimport
# spent 6µs making 1 call to strict::unimport
# spent 3µs making 3 calls to UNIVERSAL::isa, avg 1µs/call |
165 | |||||
166 | 5 | 4µs | if ( @isa == 0 ) { | ||
167 | 2 | 2µs | require Types::Standard; | ||
168 | 2 | 8µs | 2 | 6µs | return Types::Standard::Object(); # spent 6µs making 2 calls to Types::Standard::Object, avg 3µs/call |
169 | } | ||||
170 | |||||
171 | 3 | 17µs | 3 | 172µs | if ( @isa == 1 ) { # spent 172µs making 3 calls to Type::Tiny::Class::new, avg 57µs/call |
172 | return ref( $self )->new( class => $isa[0] ); | ||||
173 | } | ||||
174 | |||||
175 | require Type::Tiny::Intersection; | ||||
176 | "Type::Tiny::Intersection"->new( | ||||
177 | type_constraints => [ map ref( $self )->new( class => $_ ), @isa ], | ||||
178 | ); | ||||
179 | } #/ sub _build_parent | ||||
180 | |||||
181 | *__get_linear_isa_dfs = | ||||
182 | 1 | 1µs | eval { require mro } | ||
183 | ? \&mro::get_linear_isa | ||||
184 | : sub { | ||||
185 | 2 | 184µs | 2 | 16µs | # spent 13µs (10+3) within Type::Tiny::Class::BEGIN@185 which was called:
# once (10µs+3µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 185 # spent 13µs making 1 call to Type::Tiny::Class::BEGIN@185
# spent 3µs making 1 call to strict::unimport |
186 | |||||
187 | my $classname = shift; | ||||
188 | my @lin = ( $classname ); | ||||
189 | my %stored; | ||||
190 | |||||
191 | foreach my $parent ( @{"$classname\::ISA"} ) { | ||||
192 | my $plin = __get_linear_isa_dfs( $parent ); | ||||
193 | foreach ( @$plin ) { | ||||
194 | next if exists $stored{$_}; | ||||
195 | push( @lin, $_ ); | ||||
196 | $stored{$_} = 1; | ||||
197 | } | ||||
198 | } | ||||
199 | |||||
200 | return \@lin; | ||||
201 | 1 | 1µs | }; | ||
202 | |||||
203 | sub validate_explain { | ||||
204 | my $self = shift; | ||||
205 | my ( $value, $varname ) = @_; | ||||
206 | $varname = '$_' unless defined $varname; | ||||
207 | |||||
208 | return undef if $self->check( $value ); | ||||
209 | return ["Not a blessed reference"] unless blessed( $value ); | ||||
210 | |||||
211 | my @isa = @{ __get_linear_isa_dfs( ref $value ) }; | ||||
212 | |||||
213 | my $display_var = $varname eq q{$_} ? '' : sprintf( ' (in %s)', $varname ); | ||||
214 | |||||
215 | require Type::Utils; | ||||
216 | return [ | ||||
217 | sprintf( '"%s" requires that the reference isa %s', $self, $self->class ), | ||||
218 | sprintf( | ||||
219 | 'The reference%s isa %s', $display_var, Type::Utils::english_list( @isa ) | ||||
220 | ), | ||||
221 | ]; | ||||
222 | } #/ sub validate_explain | ||||
223 | |||||
224 | 1 | 4µs | 1; | ||
225 | |||||
226 | __END__ |