line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package GraphQL::MaybeTypeCheck; |
2
|
|
|
|
|
|
|
|
3
|
22
|
|
|
22
|
|
578
|
use 5.014; |
|
22
|
|
|
|
|
82
|
|
4
|
22
|
|
|
22
|
|
116
|
use strict; |
|
22
|
|
|
|
|
46
|
|
|
22
|
|
|
|
|
489
|
|
5
|
22
|
|
|
22
|
|
103
|
use warnings; |
|
22
|
|
|
|
|
41
|
|
|
22
|
|
|
|
|
652
|
|
6
|
|
|
|
|
|
|
|
7
|
22
|
|
|
22
|
|
12253
|
use Attribute::Handlers; |
|
22
|
|
|
|
|
78148
|
|
|
22
|
|
|
|
|
127
|
|
8
|
22
|
|
|
22
|
|
11951
|
use Devel::StrictMode; |
|
22
|
|
|
|
|
8564
|
|
|
22
|
|
|
|
|
1236
|
|
9
|
22
|
|
|
22
|
|
8752
|
use Import::Into; |
|
22
|
|
|
|
|
12788
|
|
|
22
|
|
|
|
|
2170
|
|
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
=head1 NAME |
12
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
GraphQL::MaybeTypeCheck - Conditional type-checking at runtime |
14
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
=head1 SYNOPSIS |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
use GraphQL::MaybeTypeCheck; |
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
method foo( |
20
|
|
|
|
|
|
|
$arg1 Str, |
21
|
|
|
|
|
|
|
$arg2 Int |
22
|
|
|
|
|
|
|
) :ReturnType(Map[Str, Int]) { |
23
|
|
|
|
|
|
|
# ... |
24
|
|
|
|
|
|
|
} |
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
=head1 DESCRIPTION |
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
This module B<optionally> enables type-checking in the caller as implemented by |
29
|
|
|
|
|
|
|
L<Function::Parameters> and L<Return::Type> depending on whether L<Devel::StrictMode> |
30
|
|
|
|
|
|
|
is activated. |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
=head3 C<Devel::StrictMode> ON |
33
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
When L<Devel::StrictMode> is active, this module will import L<Function::Parameters> |
35
|
|
|
|
|
|
|
into the caller with its default configuration. As of writing, this includes |
36
|
|
|
|
|
|
|
checking both argument count and type. |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
When in strict mode this also C<require>s L<Return::Type> which registers the |
39
|
|
|
|
|
|
|
C<ReturnType> attribute. |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
=head3 C<Devel::StrictMode> OFF |
42
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
When strict mode is inactive this module still imports C<Function::Parameters> |
44
|
|
|
|
|
|
|
into the caller however it sets C<fun> and C<method> to L<lax mode|Function::Parameters/function_lax> and disables |
45
|
|
|
|
|
|
|
argument type checking. |
46
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
This also installs a no-op C<ReturnType> attribute so the existing syntax isn't |
48
|
|
|
|
|
|
|
broken. |
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
=cut |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
sub ReturnType : ATTR(CODE) { |
53
|
864
|
|
|
864
|
0
|
3840736
|
my ($package, $symbol, $referent, $attr, $data) = @_; |
54
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
# If strict mode is enabled, wrap the sub so the return type is checked |
56
|
864
|
|
|
|
|
1788
|
if (STRICT) { |
57
|
864
|
50
|
|
|
|
4450
|
my %args = (@$data % 2) ? (scalar => @$data) : @$data; |
58
|
864
|
|
|
|
|
4272
|
Return::Type->wrap_sub($referent, %args); |
59
|
|
|
|
|
|
|
} |
60
|
22
|
|
|
22
|
|
157
|
} |
|
22
|
|
|
|
|
47
|
|
|
22
|
|
|
|
|
124
|
|
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
sub import { |
63
|
620
|
100
|
|
620
|
|
74923
|
return unless $_[0] eq __PACKAGE__; |
64
|
369
|
|
|
|
|
1877
|
my $caller = caller; |
65
|
|
|
|
|
|
|
{ |
66
|
22
|
|
|
22
|
|
7245
|
no strict 'refs'; |
|
22
|
|
|
|
|
50
|
|
|
22
|
|
|
|
|
2919
|
|
|
369
|
|
|
|
|
8108
|
|
67
|
369
|
|
|
|
|
721
|
push @{"${caller}::ISA"}, __PACKAGE__; |
|
369
|
|
|
|
|
6283
|
|
68
|
|
|
|
|
|
|
} |
69
|
369
|
|
|
|
|
1150
|
if (STRICT) { |
70
|
369
|
|
|
|
|
3537
|
Function::Parameters->import::into($caller, ':strict'); |
71
|
369
|
|
|
|
|
359973
|
require Return::Type; |
72
|
|
|
|
|
|
|
} else { |
73
|
|
|
|
|
|
|
Function::Parameters->import::into($caller, { |
74
|
|
|
|
|
|
|
fun => {defaults => 'function_lax', check_argument_types => 0}, |
75
|
|
|
|
|
|
|
method => {defaults => 'method_lax', check_argument_types => 0}, |
76
|
|
|
|
|
|
|
}); |
77
|
|
|
|
|
|
|
} |
78
|
|
|
|
|
|
|
} |
79
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
1; |