#include "wx/listimpl.cpp"
-#define TRACE_MODULE _T("module")
+#define TRACE_MODULE wxT("module")
WX_DEFINE_LIST(wxModuleList)
-IMPLEMENT_CLASS(wxModule, wxObject)
+wxIMPLEMENT_ABSTRACT_CLASS(wxModule, wxObject)
wxModuleList wxModule::m_modules;
// and register them.
void wxModule::RegisterModules()
{
- wxHashTable::compatibility_iterator node;
- wxClassInfo* classInfo;
-
- wxClassInfo::sm_classTable->BeginFind();
- node = wxClassInfo::sm_classTable->Next();
- while (node)
+ for (wxClassInfo::const_iterator it = wxClassInfo::begin_classinfo(),
+ end = wxClassInfo::end_classinfo();
+ it != end; ++it)
{
- classInfo = (wxClassInfo *)node->GetData();
+ const wxClassInfo* classInfo = *it;
+
if ( classInfo->IsKindOf(CLASSINFO(wxModule)) &&
- (classInfo != (& (wxModule::ms_classInfo))) )
+ (classInfo != (& (wxModule::ms_classInfo))) )
{
wxLogTrace(TRACE_MODULE, wxT("Registering module %s"),
classInfo->GetClassName());
wxModule* module = (wxModule *)classInfo->CreateObject();
- RegisterModule(module);
+ wxModule::RegisterModule(module);
}
- node = wxClassInfo::sm_classTable->Next();
}
}
module->m_state = State_Initializing;
+ // translate named dependencies to the normal ones first
+ if ( !module->ResolveNamedDependencies() )
+ return false;
+
const wxArrayClassInfo& dependencies = module->m_dependencies;
// satisfy module dependencies by loading them before the current module
wxModule * module = node->GetData();
wxASSERT_MSG( module->m_state == State_Initialized,
- _T("not initialized module being cleaned up") );
+ wxT("not initialized module being cleaned up") );
module->Exit();
module->m_state = State_Registered;
// clear all modules, even the non-initialized ones
WX_CLEAR_LIST(wxModuleList, m_modules);
}
+
+bool wxModule::ResolveNamedDependencies()
+{
+ // first resolve required dependencies
+ for ( size_t i = 0; i < m_namedDependencies.size(); ++i )
+ {
+ wxClassInfo *info = wxClassInfo::FindClass(m_namedDependencies[i]);
+
+ if ( !info )
+ {
+ // required dependency not found
+ return false;
+ }
+
+ // add it even if it is not derived from wxModule because
+ // DoInitializeModule() will make sure a module with the same class
+ // info exists and fail if it doesn't
+ m_dependencies.Add(info);
+ }
+
+ return true;
+}