How can I know if I can call a Perl 6 method that has a specific signature?

In Perl 6, a multi-message language, you can find out if a method exists that matches a name. If so, you get a list of Method objects that match that name:

class ParentClass {
    multi method foo (Str $s) { ... }
    }

class ChildClass is ParentClass {
    multi method foo (Int $n) { ... }
    multi method foo (Rat $r) { ... }
    }

my $object = ChildClass.new;

for $object.can( 'foo' )
    .flatmap( *.candidates )
    .unique -> $candidate {
    put join "\t",
        $candidate.package.^name,
        $candidate.name,
        $candidate.signature.perl;
    };


ParentClass foo :(ParentClass $: Str $s, *%_)
ChildClass  foo :(ChildClass $: Int $n, *%_)
ChildClass  foo :(ChildClass $: Rat $r, *%_)

      

That's good, but it's a lot of work. I would prefer something simpler like:

 $object.can( 'foo', $signature );

      

Maybe I'll do a lot of work to make this possible, but am I missing something that is already there?

+3


source to share


1 answer


As I got to submit on this question I had this idea which still seems like a lot of work too. The cando method can test Capture ( backsign ). I can grep the ones that match:

class ParentClass {
    multi method foo (Str $s) { ... }
    }

class ChildClass is ParentClass {
    multi method foo (Int $n) { ... }
    multi method foo (Rat $r) { ... }
    }

my $object = ChildClass.new;

# invocant is the first thing for method captures
my $capture = \( ChildClass, Str );

for $object.can( 'foo' )
    .flatmap( *.candidates )
    .grep( *.cando: $capture )
    -> $candidate {
    put join "\t",
        $candidate.package.^name,
        $candidate.name,
        $candidate.signature.perl;
    };

      



I'm not sure if I like this answer.

+1


source







All Articles