role X::Control is Exception { }

This role turns an exception into a control exception, such as CX::Next or CX::Take. It has got no code other than the definition.

Since Rakudo 2019.03, throwing an object that mixes in this role X::Control can raise a control exception which is caught by the CONTROL phaser instead of CATCH. This allows to define custom control exceptions.

For example, the custom CX::Oops control exception we define below:

class CX::Vaya does X::Control {
    has $.message
sub ea {
        default {
            say "Controlled { .^name }{ .message }"
    CX::Vaya.newmessage => "I messed up!" ).throw;
# OUTPUT: Ā«Controlled CX::Vaya: I messed up!ā¤Ā»