Wx::NewClass(3pm)

NAME

NewClass - adding a new class to wxPerl

CHECKLIST

o Are there constants or events that need to be wrapped?
see "COSTANTS" and "EVENTS".
o Is the class is derived from wxObject, from wxEvtHandler or from
another class?
see "CHOOSING A TYPEMAP".
o Are class instances destroyed by wxWidgets or should they be
garbage collected like normal Perl objects?
see "DESTRUCTORS AND THREADS".
o Does the class have overloaded methods?

see "OVERLOADING".
o Does the class have virtual methods that should be overridable from
Perl?
see "VIRTUAL METHODS".

SKELETON

Add a new file XS/NewClass.xsp and update the MANIFEST. Choose a relevant .xs file in the top level directory (es. Controls.xs) and add this line:
INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- -t typemap.xsp XS/NewClass.xsp
A skeleton for NewClass.xsp:

%module{Wx};
#include <wx/newclass.h> // use the relevant wxWidgets header(s)
%name{Wx::NewClass} class wxNewClass : public wxSomeBaseClass
{
# constructors see the CONSTRUCTORS section
wxNewClass( wxWindow* some_window, const wxString& str );
# destructors
~wxNewClass();
# methods
wxString GetString() const;
void SetString( const wxString& str );
};
Add the typemap definition to typemap.tmpl. See "CHOOSING A TYPEMAP".

CHOOSING A TYPEMAP

There are five typemaps that should work for most wxWidgets objects:

o "O_NON_WXOBJECT"
for all classes that do not derive from "wxObject" AND do not need to be garbage collected.
o "O_NON_WXOBJECT_THR"

for all classes that do not derive from "wxObject" AND need to be
garbage collected (see "DESTRUCTORS AND THREADS").
o "O_WXOBJECT"

for all classes that derive from "wxObject" AND do not need to be
garbage collected.
o "O_WXOBJECT_THR"

for all classes derived from "wxObject" AND need to be garbage
collected (see "DESTRUCTORS AND THREADS").
o "O_WXEVTHANDLER"

for all classes that derive from "wxEvtHandler". See also
"CONSTRUCTORS".

CONSTRUCTORS

For "O_WXEVTHANDLER" typemaps, there is some additional code that needs to be added to the constructor:
wxNewClass( wxWindow* some_window, const wxString& str )
%code{% RETVAL = new wxNewClass( some_window, str );
wxPli_create_evthandler( aTHX_ RETVAL, CLASS );
%};

DESTRUCTORS AND THREADS

For many classes not derived from "wxEvtHandler" you need to add a
destructor to free the C++ object when the Perl object is garbage
collected. At the XS++ level this means adding
~wxNewClass();
to the class definition, but there is a catch: the Perl threading
model.
Without going into details, this is needed for Perl threads
compatibility:
o Use the correct typemap

choose either "O_NON_WXOBJECT_THR" or "O_WXOBJECT_THR".
o Implement a "CLONE" method

add this code inside the class declaration:

%{
static void
wxNewClass::CLONE()
CODE:
wxPli_thread_sv_clone( aTHX_ CLASS, (wxPliCloneSV)wxPli_detach_object );
%}
o Fix the destructor.

modify the destructor like this:

~wxNewClass()
%code%{ wxPli_thread_sv_unregister( aTHX_ "Wx::NewClass", THIS, ST(0) );
delete THIS;
%};
Copyright © 2010-2025 Platon Technologies, s.r.o.           Home | Man pages | tLDP | Documents | Utilities | About
Design by styleshout