Delegates

class Non-Delegate  { }

class Delegate {
    method thing {
        return "delegate implementation"
    }
}

class Delegator {
    has $.delegate is rw;

    method operation {
        $.delegate.^can( 'thing' ) ?? $.delegate.thing
        !! "default implementation"
    }
}

my Delegator $d .= new;

say "empty: "~$d.operation;

$d.delegate = Non-Delegate.new;

say "Non-Delegate: "~$d.operation;

$d.delegate = Delegate.new;

say "Delegate: "~$d.operation;