type Control = ref object of RootObj method handleKeyDownEvent(control: Control, event: KeyboardEvent) {.base.} method handleKeyDownEvent(control: Control, event: KeyboardEvent) = echo "control.handle key down" type ControlImpl = ref object of Control proc pControlKeyPressSignal(widget: pointer, event: var GdkEventKey, data: pointer): Gboolean {.cdecl.} = let control = cast[ControlImpl](data) try: control.handleKeyDownEvent(evt) except: handleException() type MyWidget = ref object of ControlImpl method handleKeyDownEvent(control: MyWidget, event: KeyboardEvent) = echo "MyWidget.handle key down"