-// Set pointers to base class(es) to speed up IsKindOf
-void wxClassInfo::InitializeClasses()
-{
-    // using IMPLEMENT_DYNAMIC_CLASS() macro twice (which may happen if you
-    // link any object module twice mistakenly) will break this function
-    // because it will enter an infinite loop and eventually die with "out of
-    // memory" - as this is quite hard to detect if you're unaware of this,
-    // try to do some checks here
-#ifdef __WXDEBUG__
-    // more classes than we'll ever have
-    static const size_t nMaxClasses = 10000;
-    size_t nClass = 0;
-#endif // Debug
-
-    wxClassInfo::sm_classTable = new wxHashTable(wxKEY_STRING);
-
-    // Index all class infos by their class name
-    wxClassInfo *info = sm_first;
-    while (info)
+    // Using IMPLEMENT_DYNAMIC_CLASS() macro twice (which may happen if you
+    // link any object module twice mistakenly, or link twice against wx shared
+    // library) will break this function because it will enter an infinite loop
+    // and eventually die with "out of memory" - as this is quite hard to
+    // detect if you're unaware of this, try to do some checks here.
+    wxASSERT_MSG( classTable->Get(m_className) == NULL,
+        wxString::Format
+        (
+            wxT("Class \"%s\" already in RTTI table - have you used IMPLEMENT_DYNAMIC_CLASS() multiple times or linked some object file twice)?"),
+            m_className
+        )
+    );
+
+    classTable->Put(m_className, (wxObject *)this);
+
+    // if we're using a local hash we need to try to make it global
+    if ( sm_classTable != classTable )