Index: trunk/nv/core/io_event.hh
===================================================================
--- trunk/nv/core/io_event.hh	(revision 446)
+++ trunk/nv/core/io_event.hh	(revision 447)
@@ -15,4 +15,5 @@
 
 #include <nv/common.hh>
+#include <nv/core/types.hh>
 
 namespace nv
@@ -238,8 +239,27 @@
 	 * @param db The database to store all event data in.
 	 */
-	//void register_io_types( type_database* db );
+	void register_io_types( type_database* db );
 
 	void log_event( const io_event& e );
 }
 
+NV_RTTI_DECLARE( nv::key_code )
+NV_RTTI_DECLARE( nv::mouse_code )
+NV_RTTI_DECLARE( nv::io_event_code )
+NV_RTTI_DECLARE( nv::key_event )
+NV_RTTI_DECLARE( nv::mouse_button_event )
+NV_RTTI_DECLARE( nv::mouse_wheel_event )
+NV_RTTI_DECLARE( nv::mouse_move_event )
+NV_RTTI_DECLARE( nv::pad_button_event )
+NV_RTTI_DECLARE( nv::pad_axis_event )
+NV_RTTI_DECLARE( nv::joy_button_event )
+NV_RTTI_DECLARE( nv::joy_axis_event )
+NV_RTTI_DECLARE( nv::joy_hat_event )
+NV_RTTI_DECLARE( nv::joy_ball_event )
+NV_RTTI_DECLARE( nv::resize_event )
+NV_RTTI_DECLARE( nv::active_event )
+NV_RTTI_DECLARE( nv::system_event )
+NV_RTTI_DECLARE( nv::io_event )
+
+
 #endif // NV_CORE_IO_EVENT_HH
Index: trunk/nv/core/types.hh
===================================================================
--- trunk/nv/core/types.hh	(revision 446)
+++ trunk/nv/core/types.hh	(revision 447)
@@ -15,4 +15,5 @@
 #include <nv/stl/string_table.hh>
 #include <nv/stl/functional/hash.hh>
+#include <nv/stl/rtti_types.hh>
 #include <nv/stl/type_traits/properties.hh>
 
@@ -126,4 +127,10 @@
 
 		template< typename TYPE >
+		type_creator create_type()
+		{
+			return create_type<TYPE>( rtti_type_hash< TYPE >.name() );
+		}
+
+		template< typename TYPE >
 		type_creator create_type( const string_view& name )
 		{
Index: trunk/src/core/io_event.cc
===================================================================
--- trunk/src/core/io_event.cc	(revision 446)
+++ trunk/src/core/io_event.cc	(revision 447)
@@ -8,4 +8,5 @@
 
 #include "nv/core/logging.hh"
+#include "nv/core/types.hh"
 
 using namespace nv;
@@ -49,98 +50,95 @@
 }
 
-/************************************************************************
 void nv::register_io_types( type_database* db )
 {
-	type_enum key_enums[] = {
-#	define NV_KEY( id, val ) type_enum( #id, id ),
+	db->create_type<key_code>()
+#	define NV_KEY( id, val ) .value( #id, val )
 #		include <nv/detail/key_list.inc>
 #	undef NV_KEY
-	};
-	db->create_type<key_code>("key_code").enums( key_enums );
+	;
 
-	type_enum mouse_enums[] = {
-#	define NV_MOUSE( id, val ) type_enum( #id, id ),
+	db->create_type<mouse_code>()
+#	define NV_MOUSE( id, val ) .value( #id, val )
 #		include <nv/detail/mouse_list.inc>
 #	undef NV_MOUSE
-	};
-	db->create_type<mouse_code>("mouse_code").enums( mouse_enums );
+	;
 
-	type_enum io_event_enums[] = {
-#	define NV_IO_EVENT( id ) type_enum( #id, id ),
+	uint32 counter = 0;
+	db->create_type<io_event_code>()
+#	define NV_IO_EVENT( id ) .value( #id, counter++ )
 #		include <nv/detail/io_event_list.inc>
 #	undef NV_IO_EVENT
-	};
-	db->create_type<io_event_code>("event_code").enums( io_event_enums );
+	;
 
-	type_field key_fields[] = {
-		type_field( "ascii",   &key_event::ascii ),
-		type_field( "code",    &key_event::code ),
-		type_field( "shift",   &key_event::shift ),
-		type_field( "control", &key_event::control ),
-		type_field( "alt",     &key_event::alt ),
-		type_field( "pressed", &key_event::pressed ),
-	};
-	db->create_type<key_event>("key_event").fields( key_fields );
+	db->create_type<key_event>()
+		.field( "ascii",   &key_event::ascii )
+		.field( "code",    &key_event::code )
+		.field( "shift",   &key_event::shift )
+		.field( "control", &key_event::control )
+		.field( "alt",     &key_event::alt )
+		.field( "pressed", &key_event::pressed );
 
-	type_field mouse_button_fields[] = {
-		type_field( "x",       &mouse_button_event::x ),
-		type_field( "y",       &mouse_button_event::y ),
-		type_field( "button",  &mouse_button_event::button ),
-		type_field( "pressed", &mouse_button_event::pressed ),
-		type_field( "code",    &mouse_button_event::code ),
-	};
-	db->create_type<mouse_button_event>("mouse_button_event").fields( mouse_button_fields );
+	db->create_type<mouse_button_event>()
+		.field( "x",       &mouse_button_event::x )
+		.field( "y",       &mouse_button_event::y )
+		.field( "button",  &mouse_button_event::button )
+		.field( "pressed", &mouse_button_event::pressed )
+		.field( "code",    &mouse_button_event::code );
 
-	type_field mouse_move_fields[] = {
-		type_field( "x",       &mouse_move_event::x ),
-		type_field( "y",       &mouse_move_event::y ),
-		type_field( "rx",      &mouse_move_event::rx ),
-		type_field( "ry",      &mouse_move_event::ry ),
-		type_field( "pressed", &mouse_move_event::pressed ),
-		type_field( "code",    &mouse_move_event::code ),
-	};
-	db->create_type<mouse_move_event>("mouse_move_event").fields( mouse_move_fields );
+	db->create_type<mouse_move_event>()
+		.field( "x",       &mouse_move_event::x )
+		.field( "y",       &mouse_move_event::y )
+		.field( "rx",      &mouse_move_event::rx )
+		.field( "ry",      &mouse_move_event::ry )
+		.field( "pressed", &mouse_move_event::pressed )
+		.field( "code",    &mouse_move_event::code );
 
-	type_field mouse_wheel_fields[] = {
-		type_field( "x",       &mouse_wheel_event::x ),
-		type_field( "y",       &mouse_wheel_event::y ),
-	};
-	db->create_type<mouse_wheel_event>("mouse_wheel_event").fields( mouse_wheel_fields );
+	db->create_type<mouse_wheel_event>()
+		.field( "x",       &mouse_wheel_event::x )
+		.field( "y",       &mouse_wheel_event::y );
 
-	type_field joy_button_fields[] = {
-		type_field( "id",      &joy_button_event::id ),
-		type_field( "button",  &joy_button_event::button ),
-		type_field( "pressed", &joy_button_event::pressed ),
-	};
-	db->create_type<joy_button_event>("joy_button_event").fields( joy_button_fields );
+	db->create_type<pad_button_event>()
+		.field( "id",      &pad_button_event::id )
+		.field( "button",  &pad_button_event::button )
+		.field( "pressed", &pad_button_event::pressed );
 
-	type_field joy_axis_fields[] = {
-		type_field( "id",      &joy_axis_event::id ),
-		type_field( "axis",    &joy_axis_event::axis ),
-		type_field( "value",   &joy_axis_event::value ),
-	};
-	db->create_type<joy_axis_event>("joy_axis_event").fields( joy_axis_fields );
+	db->create_type<pad_axis_event>()
+		.field( "id",      &pad_axis_event::id )
+		.field( "axis",    &pad_axis_event::axis )
+		.field( "value",   &pad_axis_event::value );
 
-	type_field joy_hat_fields[] = {
-		type_field( "id",      &joy_hat_event::id ),
-		type_field( "hat",     &joy_hat_event::hat ),
-		type_field( "value",   &joy_hat_event::value ),
-	};
-	db->create_type<joy_hat_event>("joy_hat_event").fields( joy_hat_fields );
+	db->create_type<joy_button_event>()
+		.field( "id",      &joy_button_event::id )
+		.field( "button",  &joy_button_event::button )
+		.field( "pressed", &joy_button_event::pressed );
 
-	type_field joy_ball_fields[] = {
-		type_field( "id",      &joy_ball_event::id ),
-		type_field( "ball",    &joy_ball_event::ball ),
-		type_field( "rx",      &joy_ball_event::rx ),
-		type_field( "ry",      &joy_ball_event::ry ),
-	};
-	db->create_type<joy_ball_event>("joy_ball_event").fields( joy_ball_fields );
+	db->create_type<joy_axis_event>()
+		.field( "id",      &joy_axis_event::id )
+		.field( "axis",    &joy_axis_event::axis )
+		.field( "value",   &joy_axis_event::value );
 
-	type_field system_fields[] = {
-		type_field( "sys_type", &system_event::sys_type ),
-		type_field( "param1",   &system_event::param1 ),
-		type_field( "param2",   &system_event::param2 ),
-	};
-	db->create_type<system_event>("system_event").fields( system_fields );
+	db->create_type<joy_hat_event>()
+		.field( "id",      &joy_hat_event::id )
+		.field( "hat",     &joy_hat_event::hat )
+		.field( "value",   &joy_hat_event::value );
+
+	db->create_type<joy_ball_event>()
+		.field( "id",      &joy_ball_event::id )
+		.field( "ball",    &joy_ball_event::ball )
+		.field( "rx",      &joy_ball_event::rx )
+		.field( "ry",      &joy_ball_event::ry );
+
+	db->create_type<resize_event>()
+		.field( "x",       &resize_event::x )
+		.field( "y",       &resize_event::y );
+
+	db->create_type<active_event>()
+		.field( "gain",    &active_event::gain );
+
+	db->create_type<system_event>()
+		.field( "sys_type", &system_event::sys_type )
+		.field( "param1",   &system_event::param1 )
+		.field( "param2",   &system_event::param2 );
+
+	// TODO: io_event
 }
-************************************************************************/
