Revisiting the problem using rakudo version 2016.10-31-g6ed3a68 built on MoarVM version 2016.10 implementing Perl 6.c.

The issue still exist but tried to rewrite things to get it working

role RR1 {
  submethod BUILD ( Int :$i ) { say $i // 'No i'; }

role RR2 {
  submethod BUILD ( Str :$t ) { say $t // 'No t'; }

class CC {
  multi submethod BUILD ( Int :$i! ) {
    say "Integer $i";
    self does RR1;

  multi submethod BUILD ( Str :$t! ) {
    say "String $t";
    self does RR2;

for <t i> {
  when 'i' {
    my CC $c .= new(:i(10));

  when 't' {
    my CC $c .= new(:t<text1>);

This version works, but output is

String text1
No t
Integer 10
No i

This means that the BUILD submethods in the roles are called without arguments, while the signatures must be the same from the use in the class. The required '!' must be removed(no arguments delivered).

The roles, if needed, must be initialized with a later call, e.g. via method init(Int $i) to get the values in the role.

Removing the submethods BUILD from the roles will trigger again the exception;

Cannot resolve caller BUILD(CC+{RR1}: ); none of these signatures match:
    (CC $: Str :$t!, *%_)
    (CC $: Int :$i!, *%_)
  in block  at Does.pl6 line 23
  in block <unit> at Does.pl6 line 20


Reply via email to