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::Vaya control exception we define below:

class CX::Vaya does X::Control {
    has $.message
}

sub ea {
    CONTROL {
        default {
            say "Controlled { .^name }: { .message }"
        }
    }
    CX::Vaya.new( message => "I messed up!" ).throw;

}
ea;
# OUTPUT: Ā«Controlled CX::Vaya: I messed up!ā¤Ā»