2 use warnings FATAL => 'all';
6 eval { require Moo; 1 }
8 : (skip_all => "Moo required for testing parameter introspection")
11 use Function::Parameters;
13 sub Inf () { 0 + 'Inf' }
15 fun foo($pr1, $pr2, $po1 = 1, $po2 = 2, :$no1 = 3, :$no2 = 4, %r) {}
18 my $info = Function::Parameters::info \&foo;
19 is $info->keyword, 'fun';
20 is $info->invocant, undef;
21 is_deeply [$info->positional_required], [qw($pr1 $pr2)];
22 is scalar $info->positional_required, 2;
23 is_deeply [$info->positional_optional], [qw($po1 $po2)];
24 is scalar $info->positional_optional, 2;
25 is_deeply [$info->named_required], [];
26 is scalar $info->named_required, 0;
27 is_deeply [$info->named_optional], [qw($no1 $no2)];
28 is scalar $info->named_optional, 2;
29 is $info->slurpy, '%r';
30 is $info->args_min, 2;
31 is $info->args_max, Inf;
35 my $info = Function::Parameters::info fun ($pr1, :$nr1, :$nr2) {};
36 is $info->keyword, 'fun';
37 is $info->invocant, undef;
38 is_deeply [$info->positional_required], [qw($pr1)];
39 is scalar $info->positional_required, 1;
40 is_deeply [$info->positional_optional], [];
41 is scalar $info->positional_optional, 0;
42 is_deeply [$info->named_required], [qw($nr1 $nr2)];
43 is scalar $info->named_required, 2;
44 is_deeply [$info->named_optional], [];
45 is scalar $info->named_optional, 0;
46 is $info->slurpy, undef;
47 is $info->args_min, 5;
48 is $info->args_max, Inf;
53 is Function::Parameters::info(\&bar), undef;
55 is Function::Parameters::info(sub {}), undef;
57 method baz($class: $po1 = 1, $po2 = 2, $po3 = 3, :$no1 = 4, @rem) {}
60 my $info = Function::Parameters::info \&baz;
61 is $info->keyword, 'method';
62 is $info->invocant, '$class';
63 is_deeply [$info->positional_required], [];
64 is scalar $info->positional_required, 0;
65 is_deeply [$info->positional_optional], [qw($po1 $po2 $po3)];
66 is scalar $info->positional_optional, 3;
67 is_deeply [$info->named_required], [];
68 is scalar $info->named_required, 0;
69 is_deeply [$info->named_optional], [qw($no1)];
70 is scalar $info->named_optional, 1;
71 is $info->slurpy, '@rem';
72 is $info->args_min, 1;
73 is $info->args_max, Inf;
77 my $info = Function::Parameters::info method () {};
78 is $info->keyword, 'method';
79 is $info->invocant, '$self';
80 is_deeply [$info->positional_required], [];
81 is scalar $info->positional_required, 0;
82 is_deeply [$info->positional_optional], [];
83 is scalar $info->positional_optional, 0;
84 is_deeply [$info->named_required], [];
85 is scalar $info->named_required, 0;
86 is_deeply [$info->named_optional], [];
87 is scalar $info->named_optional, 0;
88 is $info->slurpy, undef;
89 is $info->args_min, 1;
90 is $info->args_max, 1;
94 use Function::Parameters { proc => 'function' };
95 my $info = Function::Parameters::info proc {};
96 is $info->keyword, 'proc';
97 is $info->invocant, undef;
98 is_deeply [$info->positional_required], [];
99 is scalar $info->positional_required, 0;
100 is_deeply [$info->positional_optional], [];
101 is scalar $info->positional_optional, 0;
102 is_deeply [$info->named_required], [];
103 is scalar $info->named_required, 0;
104 is_deeply [$info->named_optional], [];
105 is scalar $info->named_optional, 0;
106 is $info->slurpy, '@_';
107 is $info->args_min, 0;
108 is $info->args_max, Inf;
112 my $info = Function::Parameters::info method {};
113 is $info->keyword, 'method';
114 is $info->invocant, '$self';
115 is_deeply [$info->positional_required], [];
116 is scalar $info->positional_required, 0;
117 is_deeply [$info->positional_optional], [];
118 is scalar $info->positional_optional, 0;
119 is_deeply [$info->named_required], [];
120 is scalar $info->named_required, 0;
121 is_deeply [$info->named_optional], [];
122 is scalar $info->named_optional, 0;
123 is $info->slurpy, '@_';
124 is $info->args_min, 1;
125 is $info->args_max, Inf;
130 for my $i (qw(aku soku zan)) {
131 push @fs, [$i => fun (:$sin, :$swift, :$slay) { $i }];
135 my $info = Function::Parameters::info $f;
136 is $info->keyword, 'fun';
137 is $info->invocant, undef;
138 is_deeply [$info->positional_required], [];
139 is scalar $info->positional_required, 0;
140 is_deeply [$info->positional_optional], [];
141 is scalar $info->positional_optional, 0;
142 is_deeply [$info->named_required], [qw($sin $swift $slay)];
143 is scalar $info->named_required, 3;
144 is_deeply [$info->named_optional], [];
145 is scalar $info->named_optional, 0;
146 is $info->slurpy, undef;
147 is $info->args_min, 6;
148 is $info->args_max, Inf;