A while ago I promised a couple of people an article about Raku roles. To be frank, it was a long time ago. The plan was to cover a number of other subjects needed to better understand a few concepts behind the role model implementation in Rakudo.

Unfortunately, it turned out to be one of those perfect examples of the principle: “wanna make the God laugh? tell him your plans!” But promise is promise and a few days ago the WTF mood took me over, all actual tasks were pushed back, and my note-taking app was ready for a new draft.

So, welcome Roles Or When One Is Many of the Advanced Raku For Beginners cycle!

As it often happens, writing an article ends up with a bug found in Rakudo. Of course, this time is no exception. While consulting with metamodel code I found this comment:

# Pass along any parents that have been added, resolving them in
# the case they're generic (role Foo[::T] is T { })

I never used the construct before and decided to give it a try. Apparently, it didn’t work. My first thinking was that it is rather useless because a class consuming such role can simply do, for example:

class C does Foo[Int] is Int { }

I don’t really see a big problem here. But if we slightly change the role declaration:

role Foo[::T Numeric] is T { }

It would make more sense. Of course, the above declaration of C is still possible, but the whole thing lacks elegance.

Thus, the time for a new PR has come.