struct tvision_info { TObject *tobj; }; struct tvision_info* tvision_info_from_magic(SV *objref, int flags) { ... } #### TYPEMAP TObject* O_TObject TView* O_TView TButton* O_TButton INPUT O_TObject $var= tvision_info_from_magic($arg, OR_DIE)->tobj; O_TView $var= dynamic_cast(tvision_info_from_magic($arg, OR_DIE)->tobj); if (!$var) croak("Not an instance of TView"); O_TButton $var= dynamic_cast(tvision_info_from_magic($arg, OR_DIE)->tobj); if (!$var) croak("Not an instance of TButton"); #### bool focus(view) TView* view CODE: RETVAL= view->focus(); OUTPUT: RETVAL #### template void tvision_obj_from_magic(T *dest, SV *objref, int flags) { struct tvision_info* tinfo= tvision_info_from_magic(objref, flags); T typed= tinfo->tobj? dynamic_cast(tinfo->tobj) : NULL; if ((flags & OR_DIE) && !typed) croak("Wrong type of object"); *dest= typed; } #### O_TButton tvision_obj_from_magic(&$var, $arg, OR_DIE); #### TYPEMAP TObject* O_TObject TView* O_TObject TButton* O_TObject INPUT O_TObject $var= dynamic_cast<$type>(tvision_info_from_magic($arg, OR_DIE)->tobj); if (!$var) croak("Object is not a $type");