Index: trunk/nv/lua/lua_dispatch.hh
===================================================================
--- trunk/nv/lua/lua_dispatch.hh	(revision 347)
+++ trunk/nv/lua/lua_dispatch.hh	(revision 348)
@@ -41,7 +41,12 @@
 				}
 				template <class C, typename... Args, typename... Vs>
-				static void do_call(lua_State* L, C& c, R(C::*func)(Args...), Vs&&... vs)
+				static void do_call(lua_State* L, C* c, R(C::*func)(Args...), Vs&&... vs)
 				{
-					push_value(L, (c.*func)(std::forward<Vs>(vs)...)); 
+					push_value(L, (*c.*func)(std::forward<Vs>(vs)...)); 
+				}
+				template <class C, typename... Args, typename... Vs>
+				static void do_call( lua_State* L, C const * c, R( C::*func )( Args... ) const, Vs&&... vs )
+				{
+					push_value( L, ( *c.*func )( std::forward<Vs>( vs )... ) );
 				}
 			};
@@ -56,7 +61,12 @@
 				}
 				template <class C, typename... Args, typename... Vs>
-				static void do_call(lua_State*, C& c, void(C::*func)(Args...), Vs&&... vs)
+				static void do_call(lua_State*, C* c, void(C::*func)(Args...), Vs&&... vs)
 				{
-					(c.*func)(std::forward<Vs>(vs)...);
+					(*c.*func)(std::forward<Vs>(vs)...);
+				}
+				template <class C, typename... Args, typename... Vs>
+				static void do_call( lua_State*, C const * c, void( C::*func )( Args... ) const, Vs&&... vs )
+				{
+					( *c.*func )( std::forward<Vs>( vs )... );
 				}
 			};
@@ -69,7 +79,13 @@
 
 			template <typename R, class C, typename... Args, typename Head, typename ...Tail, typename... Vs>
-			int do_call(lua_State* L, int index, C& c, R(C::*func)(Args...), types<Head, Tail...>, Vs&&... vs)
+			int do_call(lua_State* L, int index, C* c, R(C::*func)(Args...), types<Head, Tail...>, Vs&&... vs)
 			{
 				do_call(L, index + 1, c, func, types < Tail... > {}, std::forward<Vs>(vs)..., get_value<Head>(L, index)); return 1;
+			}
+
+			template <typename R, class C, typename... Args, typename Head, typename ...Tail, typename... Vs>
+			int do_call( lua_State* L, int index, C const * c, R( C::*func )( Args... ) const, types<Head, Tail...>, Vs&&... vs )
+			{
+				do_call( L, index + 1, c, func, types < Tail... > {}, std::forward<Vs>( vs )..., get_value<Head>( L, index ) ); return 1;
 			}
 
@@ -82,7 +98,14 @@
 
 			template <typename R, class C, typename... Args, typename... Vs>
-			int do_call(lua_State* L, int, C& c, R(C::*func)(Args...), types<>, Vs&&... vs)
+			int do_call(lua_State* L, int, C* c, R(C::*func)(Args...), types<>, Vs&&... vs)
 			{
 				call_and_push<R>::do_call(L, c, func, std::forward<Vs>(vs)...);
+				return 1;
+			}
+
+			template <typename R, class C, typename... Args, typename... Vs>
+			int do_call( lua_State* L, int, C const * c, R( C::*func )( Args... ) const, types<>, Vs&&... vs )
+			{
+				call_and_push<R>::do_call( L, c, func, std::forward<Vs>( vs )... );
 				return 1;
 			}
@@ -95,9 +118,16 @@
 			}
 			template < typename R, class C, typename... Args >
-			int dispatch(lua_State* L, int index, C& c, R(C::*func)(Args...))
+			int dispatch(lua_State* L, int index, C* c, R( C::*func )( Args... ) )
 			{
 				do_call(L, index, c, func, types < Args... > {});
 				return 1;
 			}
+			template < typename R, class C, typename... Args >
+			int dispatch( lua_State* L, int index, C const * c, R( C::*func )( Args... ) const )
+			{
+				do_call( L, index, c, func, types < Args... > {} );
+				return 1;
+			}
+
 
 			template < typename F, F f > 
@@ -111,5 +141,5 @@
 			{
 				C* c = (C*)to_ref_object( L, 1 );
-				return dispatch( L, 2, *c, f );
+				return dispatch( L, 2, c, f );
 			}
 
@@ -118,5 +148,5 @@
 			{
 				C* c = (C*)to_pointer( L, nv::lua::detail::upvalue_index(1) );
-				return dispatch( L, 1, *c, f );
+				return dispatch( L, 1, c, f );
 			}
 			
