+wxObject* wxxVariant::GetAsObject()
+{
+ const wxClassTypeInfo *ti = dynamic_cast<const wxClassTypeInfo*>( m_data->GetTypeInfo() ) ;
+ if ( ti )
+ return ti->GetClassInfo()->VariantToInstance(*this) ;
+ else
+ return NULL ;
+}
+
+// ----------------------------------------------------------------------------
+// wxDynamicObject support
+// ----------------------------------------------------------------------------
+//
+// Dynamic Objects are objects that have a real superclass instance and carry their
+// own attributes in a hash map. Like this it is possible to create the objects and
+// stream them, as if their class information was already available from compiled data
+
+struct wxDynamicObject::wxDynamicObjectInternal
+{
+ wxDynamicObjectInternal() {}
+
+#if wxUSE_UNICODE
+ map<wstring,wxxVariant> m_properties ;
+#else
+ map<string,wxxVariant> m_properties ;
+#endif
+} ;
+
+typedef list< wxDynamicObject* > wxDynamicObjectList ;
+
+struct wxDynamicClassInfo::wxDynamicClassInfoInternal
+{
+ wxDynamicObjectList m_dynamicObjects ;
+} ;
+
+// instantiates this object with an instance of its superclass
+wxDynamicObject::wxDynamicObject(wxObject* superClassInstance, const wxDynamicClassInfo *info)
+{
+ m_superClassInstance = superClassInstance ;
+ m_classInfo = info ;
+ m_data = new wxDynamicObjectInternal ;
+}
+
+wxDynamicObject::~wxDynamicObject()
+{
+ dynamic_cast<const wxDynamicClassInfo*>(m_classInfo)->m_data->m_dynamicObjects.remove( this ) ;
+ delete m_data ;
+ delete m_superClassInstance ;
+}
+
+void wxDynamicObject::SetProperty (const wxChar *propertyName, const wxxVariant &value)
+{
+ wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(propertyName),wxT("Accessing Unknown Property in a Dynamic Object") ) ;
+ m_data->m_properties[propertyName] = value ;
+}
+
+wxxVariant wxDynamicObject::GetProperty (const wxChar *propertyName) const
+{
+ wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(propertyName),wxT("Accessing Unknown Property in a Dynamic Object") ) ;
+ return m_data->m_properties[propertyName] ;
+}
+
+void wxDynamicObject::RemoveProperty( const wxChar *propertyName )
+{
+ wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(propertyName),wxT("Removing Unknown Property in a Dynamic Object") ) ;
+ m_data->m_properties.erase( propertyName ) ;
+}
+
+void wxDynamicObject::RenameProperty( const wxChar *oldPropertyName , const wxChar *newPropertyName )
+{
+ wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(oldPropertyName),wxT("Renaming Unknown Property in a Dynamic Object") ) ;
+ wxxVariant value = m_data->m_properties[oldPropertyName] ;
+ m_data->m_properties.erase( oldPropertyName ) ;
+ m_data->m_properties[newPropertyName] = value ;
+}
+
+
+// ----------------------------------------------------------------------------
+// wxDynamiClassInfo
+// ----------------------------------------------------------------------------
+
+wxDynamicClassInfo::wxDynamicClassInfo( const wxChar *unitName, const wxChar *className , const wxClassInfo* superClass ) :
+wxClassInfo( unitName, className , new const wxClassInfo*[2])
+{
+ GetParents()[0] = superClass ;
+ GetParents()[1] = NULL ;
+ m_data = new wxDynamicClassInfoInternal ;
+}
+
+wxDynamicClassInfo::~wxDynamicClassInfo()
+{
+ delete[] GetParents() ;
+ delete m_data ;
+}
+
+wxObject *wxDynamicClassInfo::AllocateObject() const