module main pub struct Message { pub mut: text string = 'Init' m2 ?&Message } pub fn (mut m Message) update_text(new_text string) { m.text = new_text } pub fn (mut m Message) update_ext_text(new_text string) ? { m.m2?.text = new_text } type LocalMessageType = Message interface IMessage { mut: text string update_text(new_text string) } struct App { mut: message &IMessage } pub fn (mut m LocalMessageType) update_text_externally(new_text string) { m.text = new_text } fn print_message(mut mdef IMessage) { if mut mdef is Message { mut a := LocalMessageType(*mdef) mut b := &LocalMessageType(mdef) mut c := LocalMessageType(mdef) dump(a) dump(b) dump(c) } } fn test_main() { mut m2 := &Message{ text: 'Init External' } mut mdef := &Message{ text: 'Init' m2: m2 } mut app := &App{ message: mdef } print_message(mut app.message) }