void Application::Initialize()
        {
            BOOST_ASSERT( m_IsInitialized == false );
            
            Super::Initialize();

            // Initialize loaded plug-ins
            PluginList::iterator pluginIter = m_Plugins.begin();
            while ( pluginIter != m_Plugins.end() )
            {
                PluginPtr plugin = (*pluginIter);
                plugin->Initialize();

                ++pluginIter;
            }

            // Initialize registered subsystems
            SubsystemList::iterator subsystemIter = m_Subsystems.begin();
            while ( subsystemIter != m_Subsystems.end() )
            {
                SubsystemPtr subsystem = (*subsystemIter);
                subsystem->Initialize();

                ++subsystemIter;
            }

            m_IsInitialized = true;

            OnInitialized( EventArgs( *this ) );
        }
        PluginPtr Application::LoadPlugin( const std::wstring& filename )
        {            
            fs::wpath filePath( filename );
            fs::wpath pluginName = filePath.stem();
            PluginPtr pluginPtr = GetPluginByName( pluginName.wstring() );

            if ( !pluginPtr )
            {
                // Try to load the dynamic lib from the provided filename.
                DynamicLibPtr pluginLib = m_DynamicLibSubsystem->Load( filename );
                if ( pluginLib )
                {
                    CreatePluginFP createPluginFunc = (CreatePluginFP)pluginLib->GetSymbol( "CreatePlugin" );
                    if ( createPluginFunc != NULL )
                    {
                        pluginPtr = createPluginFunc();
                        if ( pluginPtr != NULL )
                        {
                            pluginPtr->FileName = filePath.wstring();
                            pluginPtr->PluginName = filePath.stem().wstring();
                            if ( m_IsInitialized )
                            {
                                pluginPtr->Initialize();
                            }

                            AddPlugin( pluginPtr );
                        }
                        else
                        {
                            std::cerr << "Application::LoadPlugin: Plug-in creation failed in library \"";
                            std::wcerr << filename;
                            std::wcerr << "\"" << std::endl;
                        }
                    }
                    else
                    {

                        std::cerr << "Application::LoadPlugin: Could not find symbol \"CreatePlugin\" in library \"";
                        std::wcerr << filename;
                        std::cerr << "\"" << std::endl;
                    }
                }
            }

            return pluginPtr;
        }