1
augment class Signature {
2
method ACCEPTS(Signature) {
3
die("Sorry, smart-matching a Signature against a Signature is not yet implemented.");
6
method ACCEPTS(Callable) {
7
die("Sorry, smart-matching a Callable against a Signature is not yet implemented.");
10
method ACCEPTS(Capture $c) {
11
my $result = Bool::False;
19
method ACCEPTS($any) {
20
my $result = Bool::False;
22
self!BIND((|$any).Capture);
32
my $last_was_multi_inv = True;
33
for $.params -> $param {
34
# First, separator, if any.
35
if $last_was_multi_inv && !$param.multi_invocant { $sep = ';; ' }
40
my $name = $param.name;
43
my $sigil = $name.substr(0, 1);
44
my $perl = $param.type.perl;
49
if $perl ne 'Positional' {
50
take $perl.substr(11, $perl.chars - 12) ~ ' ';
54
if $perl ne 'Associative' {
55
take $perl.substr(12, $perl.chars - 13) ~ ' ';
58
elsif $perl.substr(0, 8) eq 'Callable' {
59
if $perl ne 'Callable' {
60
take $perl.substr(9, $perl.chars - 10) ~ ' ';
69
for @($param.type_captures) -> $name {
70
take '::' ~ $name ~ ' ';
73
# Slurpiness, namedness, then the name.
74
if $param.slurpy { take '*' }
75
if $param.capture { take '|' }
76
if $param.parcel { take '\|' }
77
my @names = @($param.named_names);
79
take ':' ~ $name ~ '(';
85
if $param.optional && !$param.named && !$param.default { take '?' }
86
elsif !$param.optional && $param.named && !$param.slurpy { take '!' }
89
my $cons_perl = $param.constraints.perl;
90
if $cons_perl ne 'Bool::True' {
91
take ' where ' ~ $cons_perl;
96
take ' ' ~ $param.signature.perl.substr(1);
101
take ' = ' ~ $param.default.perl;
104
# Invocant/multi invocant marking.
105
if $param.invocant { $sep = ': '; }
106
$last_was_multi_inv = $param.multi_invocant;
110
return @parts.join('');