浏览代码

This commit is broken, but has a lot of important stuff in it. Trying to figure out why my constructor thinks it doesn't take any parameters

Thomas "elfprince13" Dickerson 8 年之前
父节点
当前提交
26da831b01
共有 2 个文件被更改,包括 108 次插入1466 次删除
  1. 76 781
      Engine/source/console/engineAPI.h
  2. 32 685
      Engine/source/console/engineFunctions.h

+ 76 - 781
Engine/source/console/engineAPI.h

@@ -437,6 +437,7 @@ inline const char* _EngineConsoleThunkReturnValue( const T& value )
 {
    return EngineMarshallData( value );
 }
+
 inline bool _EngineConsoleThunkReturnValue( bool value )
 {
    return value;
@@ -518,7 +519,7 @@ struct _EngineConsoleThunkCountArgs
 		return sizeof...(ArgTs);
 	}
 	
-	operator U32() const{ // WHAT IS THIS??
+	operator U32() const{ // FIXME: WHAT IS THIS?? I'm pretty sure it's incorrect, and it's the version that is invoked by all the macros
 		return 0;
 	}
 };
@@ -527,801 +528,95 @@ struct _EngineConsoleThunkCountArgs
 
 
 // Encapsulation of a legacy console function invocation.
+namespace engineAPI{
+	namespace detail{
+		template<S32 startArgc, typename R, typename ...ArgTs>
+		struct ThunkHelpers {
+			using SelfType = ThunkHelpers<startArgc, R, ArgTs...>;
+			using FunctionType = R(*)(ArgTs...);
+			template<typename Frame> using MethodType = R(Frame::*)(ArgTs ...) const;
+			template<size_t I> using IthArgType = typename std::tuple_element<I, std::tuple<ArgTs ...> >::type;
+			
+			template<size_t ...> struct Seq {};
+			template<size_t N, size_t ...S> struct Gens : Gens<N-1, N-1, S...> {};
+			template<size_t ...I> struct Gens<0, I...>{ typedef Seq<I...> type; };
+			
+			typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
+			static constexpr S32 NUM_ARGS = sizeof...(ArgTs) + startArgc;
+			
+			template<size_t index, size_t method_offset = 0, typename ...RealArgTs>
+			static IthArgType<index> getRealArgValue(S32 argc, ConsoleValueRef *argv, const _EngineFunctionDefaultArguments< void(RealArgTs...) >& defaultArgs)
+			{
+				return (startArgc + index) < argc
+				? EngineUnmarshallData< IthArgType<index> >()( argv[ startArgc + index ] )
+				: std::get<index + method_offset>(defaultArgs.mArgs);
+			}
+			
+			template<size_t ...I>
+			static R dispatchHelper(S32 argc, ConsoleValueRef *argv, FunctionType fn, const _EngineFunctionDefaultArguments< void(ArgTs...) >& defaultArgs, Seq<I...>){
+				return fn(SelfType::getRealArgValue<I>(argc, argv, defaultArgs) ...);
+			}
+			
+			template<typename Frame, size_t ...I>
+			static R dispatchHelper(S32 argc, ConsoleValueRef *argv, MethodType<Frame> fn, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, ArgTs...) >& defaultArgs, Seq<I...>){
+				return (frame->*fn)(SelfType::getRealArgValue<I,1>(argc, argv, defaultArgs) ...);
+			}
+			
+			using SeqType = typename Gens<sizeof...(ArgTs)>::type;
+		};
+	}
+}
 
 template< S32 startArgc, typename T >
 struct _EngineConsoleThunk {};
 
-template< S32 startArgc, typename R >
-struct _EngineConsoleThunk< startArgc, R() >
-{
-   typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
-   static const S32 NUM_ARGS = 0;
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )(), const _EngineFunctionDefaultArguments< void() >& )
-   {
-      return _EngineConsoleThunkReturnValue( fn() );
-   }
-   template< typename Frame >
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )() const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType* ) >& )
-   {
-      return _EngineConsoleThunkReturnValue( ( frame->*fn )() );
-   }
-};
-
-template< S32 startArgc >
-struct _EngineConsoleThunk< startArgc, void() >
-{
-   typedef void ReturnType;
-   static const S32 NUM_ARGS = 0;
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )(), const _EngineFunctionDefaultArguments< void() >& )
-   {
-      fn();
-   }
-   template< typename Frame >
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )() const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType* ) >& )
-   {
-      return ( frame->*fn )();
-   }
-};
-
-
-
-template< S32 startArgc, typename R, typename A >
-struct _EngineConsoleThunk< startArgc, R( A ) >
-{
-   typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
-   static const S32 NUM_ARGS = 1 + startArgc;
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A ), const _EngineFunctionDefaultArguments< void( A ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      
-      return _EngineConsoleThunkReturnValue( fn( a ) );
-   }
-   template< typename Frame >
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      
-      return _EngineConsoleThunkReturnValue( ( frame->*fn )( a ) );
-   }
-};
-
-template< S32 startArgc, typename A >
-struct _EngineConsoleThunk< startArgc, void( A ) >
-{
-   typedef void ReturnType;
-   static const S32 NUM_ARGS = 1 + startArgc;
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A ), const _EngineFunctionDefaultArguments< void( A ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      
-      fn( a );
-   }
-   template< typename Frame >
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      
-      ( frame->*fn )( a );
-   }
-};
-
-
-template< S32 startArgc, typename R, typename A, typename B >
-struct _EngineConsoleThunk< startArgc, R( A, B ) >
-{
-   typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
-   static const S32 NUM_ARGS = 2 + startArgc;
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B ), const _EngineFunctionDefaultArguments< void( A, B ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      
-      return _EngineConsoleThunkReturnValue( fn( a, b ) );
-   }
-   template< typename Frame >
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      
-      return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b ) );
-   }
-};
-
-template< S32 startArgc, typename A, typename B >
-struct _EngineConsoleThunk< startArgc, void( A, B ) >
-{
-   typedef void ReturnType;
-   static const S32 NUM_ARGS = 2 + startArgc;
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B ), const _EngineFunctionDefaultArguments< void( A, B ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      
-      fn( a, b );
-   }
-   template< typename Frame >
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      
-      ( frame->*fn )( a, b );
-   }
-};
-
-
-template< S32 startArgc, typename R, typename A, typename B, typename C >
-struct _EngineConsoleThunk< startArgc, R( A, B, C ) >
-{
-   typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
-   static const S32 NUM_ARGS = 3 + startArgc;
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C ), const _EngineFunctionDefaultArguments< void( A, B, C ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      
-      return _EngineConsoleThunkReturnValue( fn( a, b, c ) );
-   }
-   template< typename Frame >
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      
-      return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c ) );
-   }
-};
-
-template< S32 startArgc, typename A, typename B, typename C >
-struct _EngineConsoleThunk< startArgc, void( A, B, C ) >
-{
-   typedef void ReturnType;
-   static const S32 NUM_ARGS = 3 + startArgc;
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C ), const _EngineFunctionDefaultArguments< void( A, B, C ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      
-      fn( a, b, c );
-   }
-   template< typename Frame >
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      
-      ( frame->*fn )( a, b, c );
-   }
-};
-
-
-template< S32 startArgc, typename R, typename A, typename B, typename C, typename D >
-struct _EngineConsoleThunk< startArgc, R( A, B, C, D ) >
-{
-   typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
-   static const S32 NUM_ARGS = 4 + startArgc;
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D ), const _EngineFunctionDefaultArguments< void( A, B, C, D ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
-      
-      return _EngineConsoleThunkReturnValue( fn( a, b, c, d ) );
-   }
-   template< typename Frame >
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
-      
-      return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d ) );
-   }
-};
-
-template< S32 startArgc, typename A, typename B, typename C, typename D >
-struct _EngineConsoleThunk< startArgc, void( A, B, C, D ) >
-{
-   typedef void ReturnType;
-   static const S32 NUM_ARGS = 4 + startArgc;
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D ), const _EngineFunctionDefaultArguments< void( A, B, C, D ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
-      
-      fn( a, b, c, d );
-   }
-   template< typename Frame >
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
-      
-      ( frame->*fn )( a, b, c, d );
-   }
-};
-
-
-template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E >
-struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E ) >
-{
-   typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
-   static const S32 NUM_ARGS = 5 + startArgc;
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
-      
-      return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e ) );
-   }
-   template< typename Frame >
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
-      
-      return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e ) );
-   }
-};
-
-template< S32 startArgc, typename A, typename B, typename C, typename D, typename E >
-struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E ) >
-{
-   typedef void ReturnType;
-   static const S32 NUM_ARGS = 5 + startArgc;
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
-      
-      fn( a, b, c, d, e );
-   }
-   template< typename Frame >
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
-      
-      ( frame->*fn )( a, b, c, d, e );
-   }
-};
-
-
-template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F >
-struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F ) >
-{
-   typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
-   static const S32 NUM_ARGS = 6 + startArgc;
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
-      
-      return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f ) );
-   }
-   template< typename Frame >
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
-      
-      return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f ) );
-   }
-};
-
-template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F >
-struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F ) >
+template< S32 startArgc, typename R, typename ...ArgTs >
+struct _EngineConsoleThunk< startArgc, R(ArgTs...) >
 {
-   typedef void ReturnType;
-   static const S32 NUM_ARGS = 6 + startArgc;
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
-      
-      fn( a, b, c, d, e, f );
-   }
-   template< typename Frame >
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
-      
-      ( frame->*fn )( a, b, c, d, e, f );
-   }
-};
-
-
-template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G >
-struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G ) >
-{
-   typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
-   static const S32 NUM_ARGS = 7 + startArgc;
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F, G ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
-      
-      return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g ) );
-   }
-   template< typename Frame >
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F, G ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
-      
-      return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g ) );
-   }
-};
-
-template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F, typename G >
-struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G ) >
-{
-   typedef void ReturnType;
-   static const S32 NUM_ARGS = 7 + startArgc;
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F, G ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
-      
-      fn( a, b, c, d, e, f, g );
-   }
-   template< typename Frame >
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F, G ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
-      
-      ( frame->*fn )( a, b, c, d, e, f, g );
-   }
-};
-
-
-template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
-struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H ) >
-{
-   typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
-   static const S32 NUM_ARGS = 8 + startArgc;
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F, G, H ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
-      
-      return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g, h ) );
-   }
-   template< typename Frame >
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F, G, H ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
-      
-      return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g, h ) );
-   }
-};
-
-template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
-struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H ) >
-{
-   typedef void ReturnType;
-   static const S32 NUM_ARGS = 8 + startArgc;
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F, G, H ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
-      
-      fn( a, b, c, d, e, f, g, h );
-   }
-   template< typename Frame >
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F, G, H ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
-      
-      ( frame->*fn )( a, b, c, d, e, f, g, h );
-   }
-};
-
-
-template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
-struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I ) >
-{
-   typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
-   static const S32 NUM_ARGS = 9 + startArgc;
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F, G, H, I ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
-      I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
-      
-      return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g, h, i ) );
-   }
-   template< typename Frame >
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F, G, H, I ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
-      I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
-      
-      return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g, h, i ) );
-   }
-};
-
-template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
-struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I ) >
-{
-   typedef void ReturnType;
-   static const S32 NUM_ARGS = 9 + startArgc;
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F, G, H, I ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
-      I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
-      
-      fn( a, b, c, d, e, f, g, h, i );
-   }
-   template< typename Frame >
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F, G, H, I ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
-      I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
-      
-      ( frame->*fn )( a, b, c, d, e, f, g, h, i );
-   }
-};
-
-
-template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
-struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I, J ) >
-{
-   typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
-   static const S32 NUM_ARGS = 10 + startArgc;
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F, G, H, I, J ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
-      I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
-      J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) );
-      
-      return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g, h, i, j ) );
-   }
-   template< typename Frame >
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F, G, H, I, J ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
-      I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
-      J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) );
-      
-      return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g, h, i, j ) );
-   }
-};
-
-template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
-struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I, J ) >
-{
-   typedef void ReturnType;
-   static const S32 NUM_ARGS = 10 + startArgc;
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F, G, H, I, J ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
-      I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
-      J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) );
-      
-      fn( a, b, c, d, e, f, g, h, i, j );
-   }
-   template< typename Frame >
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F, G, H, I, J ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
-      I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
-      J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) );
-      
-      ( frame->*fn )( a, b, c, d, e, f, g, h, i, j );
-   }
-};
-
-
-template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K >
-struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I, J, K ) >
-{
-   typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
-   static const S32 NUM_ARGS = 11 + startArgc;
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F, G, H, I, J, K ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J, K ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
-      I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
-      J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) );
-      K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.k ) );
-      
-      return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g, h, i, j, k ) );
-   }
-   template< typename Frame >
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F, G, H, I, J, K ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J, K ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
-      I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
-      J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) );
-      K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.l ) );
-      
-      return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g, h, i, j, k ) );
-   }
-};
-
-template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K >
-struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I, J, K ) >
-{
-   typedef void ReturnType;
-   static const S32 NUM_ARGS = 11 + startArgc;
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F, G, H, I, J, K ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J, K ) >& defaultArgs )
+private:
+	using Helper = engineAPI::detail::ThunkHelpers<startArgc, R, ArgTs...>;
+	using SeqType = typename Helper::SeqType;
+public:
+	typedef typename Helper::FunctionType FunctionType;
+	typedef typename Helper::ReturnType ReturnType;
+	template<typename Frame> using MethodType = typename Helper::template MethodType<Frame>;
+	static constexpr S32 NUM_ARGS = Helper::NUM_ARGS;
+	
+   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, FunctionType fn, const _EngineFunctionDefaultArguments< void(ArgTs...) >& defaultArgs)
    {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
-      I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
-      J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) );
-      K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.k ) );
-      
-      fn( a, b, c, d, e, f, g, h, i, j, k );
+	   return _EngineConsoleThunkReturnValue( Helper::dispatchHelper(argc, argv, fn, defaultArgs, SeqType()));
    }
    template< typename Frame >
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F, G, H, I, J, K ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J, K ) >& defaultArgs )
+	static ReturnType thunk( S32 argc, ConsoleValueRef *argv, MethodType<Frame> fn, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, ArgTs...) >& defaultArgs)
    {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
-      I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
-      J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) );
-      K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.l ) );
-      
-      ( frame->*fn )( a, b, c, d, e, f, g, h, i, j, k );
+	   return _EngineConsoleThunkReturnValue( Helper::dispatchHelper(argc, argv, fn, frame, defaultArgs, SeqType()));
    }
 };
 
-
-template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K, typename L >
-struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I, J, K, L ) >
-{
-   typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
-   static const S32 NUM_ARGS = 12 + startArgc;
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F, G, H, I, J, K, L ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J, K, L ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
-      I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
-      J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) );
-      K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.k ) );
-      L l = ( startArgc + 11 < argc ? EngineUnmarshallData< L >()( argv[ startArgc + 11 ] ) : L( defaultArgs.l ) );
-      
-      return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g, h, i, j, k, l ) );
-   }
-   template< typename Frame >
-   static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F, G, H, I, J, K, L ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J, K, L ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
-      I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
-      J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) );
-      K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.l ) );
-      L l = ( startArgc + 11 < argc ? EngineUnmarshallData< L >()( argv[ startArgc + 11 ] ) : L( defaultArgs.l ) );
-      
-      return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g, h, i, j, k, l ) );
-   }
-};
-
-template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K, typename L >
-struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I, J, K, L ) >
-{
-   typedef void ReturnType;
-   static const S32 NUM_ARGS = 12 + startArgc;
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F, G, H, I, J, K, L ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J, K, L ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
-      I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
-      J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) );
-      K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.k ) );
-      L l = ( startArgc + 11 < argc ? EngineUnmarshallData< L >()( argv[ startArgc + 11 ] ) : L( defaultArgs.l ) );
-      
-      fn( a, b, c, d, e, f, g, h, i, j, k, l );
-   }
-   template< typename Frame >
-   static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F, G, H, I, J, K, L ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J, K, L ) >& defaultArgs )
-   {
-      A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
-      B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
-      C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
-      D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
-      E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
-      F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
-      G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
-      H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
-      I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
-      J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) );
-      K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.l ) );
-      L l = ( startArgc + 11 < argc ? EngineUnmarshallData< L >()( argv[ startArgc + 11 ] ) : L( defaultArgs.l ) );
-      
-      ( frame->*fn )( a, b, c, d, e, f, g, h, i, j, k, l );
-   }
+// Have to do a partial specialization for void-returning functions :(
+template<S32 startArgc, typename ...ArgTs>
+struct _EngineConsoleThunk<startArgc, void(ArgTs...)> {
+private:
+	using Helper = engineAPI::detail::ThunkHelpers<startArgc, void, ArgTs...>;
+	using SeqType = typename Helper::SeqType;
+public:
+	typedef typename Helper::FunctionType FunctionType;
+	typedef typename Helper::ReturnType ReturnType;
+	template<typename Frame> using MethodType = typename Helper::template MethodType<Frame>;
+	static constexpr S32 NUM_ARGS = Helper::NUM_ARGS;
+	
+	static void thunk( S32 argc, ConsoleValueRef *argv, FunctionType fn, const _EngineFunctionDefaultArguments< void(ArgTs...) >& defaultArgs)
+	{
+		Helper::dispatchHelper(argc, argv, fn, defaultArgs, SeqType());
+	}
+	template< typename Frame >
+	static void thunk( S32 argc, ConsoleValueRef *argv, MethodType<Frame> fn, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, ArgTs...) >& defaultArgs)
+	{
+		Helper::dispatchHelper(argc, argv, fn, frame, defaultArgs, SeqType());
+	}
 };
 
 
-
 /// @}
 
 /// @name API Definition Macros

+ 32 - 685
Engine/source/console/engineFunctions.h

@@ -87,693 +87,40 @@ struct EngineFunctionDefaultArguments
 // Structure encapsulating default arguments to an engine API function.
 template< typename T >
 struct _EngineFunctionDefaultArguments {};
-template<>
-struct _EngineFunctionDefaultArguments< void() > : public EngineFunctionDefaultArguments
-{
-   _EngineFunctionDefaultArguments()
-      { mNumDefaultArgs = 0; }
-};
-template< typename A >
-struct _EngineFunctionDefaultArguments< void( A ) > : public EngineFunctionDefaultArguments
-{
-   typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
-   
-   _EngineFunctionDefaultArguments()
-      { mNumDefaultArgs = 0; }
-   _EngineFunctionDefaultArguments( A a )
-      : a( a )
-      { mNumDefaultArgs = 1; }
-};
-template< typename A, typename B >
-struct _EngineFunctionDefaultArguments< void( A, B ) > : public EngineFunctionDefaultArguments
-{
-   typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
-   typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
-   
-   _EngineFunctionDefaultArguments()
-      { mNumDefaultArgs = 0; }
-   _EngineFunctionDefaultArguments( B b )
-      : b( b )
-      { mNumDefaultArgs = 1; }
-   _EngineFunctionDefaultArguments( A a, B b )
-      : a( a ),
-        b( b )
-      { mNumDefaultArgs = 2; }
-};
-template< typename A, typename B, typename C >
-struct _EngineFunctionDefaultArguments< void( A, B, C ) > : public EngineFunctionDefaultArguments
-{
-   typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
-   typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
-   typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
-   
-   _EngineFunctionDefaultArguments()
-      { mNumDefaultArgs = 0; }
-   _EngineFunctionDefaultArguments( C c )
-      : c( c )
-      { mNumDefaultArgs = 1; }
-   _EngineFunctionDefaultArguments( B b, C c )
-      : b( b ),
-        c( c )
-      { mNumDefaultArgs = 2; }
-   _EngineFunctionDefaultArguments( A a, B b, C c )
-      : a( a ),
-        b( b ),
-        c( c )
-      { mNumDefaultArgs = 3; }
-};
-template< typename A, typename B, typename C, typename D >
-struct _EngineFunctionDefaultArguments< void( A, B, C, D ) > : public EngineFunctionDefaultArguments
-{
-   typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
-   typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
-   typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
-   typename EngineTypeTraits< D >::DefaultArgumentValueStoreType d;
-   
-   _EngineFunctionDefaultArguments()
-      { mNumDefaultArgs = 0; }
-   _EngineFunctionDefaultArguments( D d )
-      : d( d )
-      { mNumDefaultArgs = 1; }
-   _EngineFunctionDefaultArguments( C c, D d )
-      : c( c ),
-        d( d )
-      { mNumDefaultArgs = 2; }
-   _EngineFunctionDefaultArguments( B b, C c, D d )
-      : b( b ),
-        c( c ),
-        d( d )
-      { mNumDefaultArgs = 3; }
-   _EngineFunctionDefaultArguments( A a, B b, C c, D d )
-      : a( a ),
-        b( b ),
-        c( c ),
-        d( d )
-      { mNumDefaultArgs = 4; }
-};
-template< typename A, typename B, typename C, typename D, typename E >
-struct _EngineFunctionDefaultArguments< void( A, B, C, D, E ) > : public EngineFunctionDefaultArguments
-{
-   typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
-   typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
-   typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
-   typename EngineTypeTraits< D >::DefaultArgumentValueStoreType d;
-   typename EngineTypeTraits< E >::DefaultArgumentValueStoreType e;
-   
-   _EngineFunctionDefaultArguments()
-      { mNumDefaultArgs = 0; }
-   _EngineFunctionDefaultArguments( E e )
-      : e( e )
-      { mNumDefaultArgs = 1; }
-   _EngineFunctionDefaultArguments( D d, E e )
-      : d( d ),
-        e( e )
-      { mNumDefaultArgs = 2; }
-   _EngineFunctionDefaultArguments( C c, D d, E e )
-      : c( c ),
-        d( d ),
-        e( e )
-      { mNumDefaultArgs = 3; }
-   _EngineFunctionDefaultArguments( B b, C c, D d, E e )
-      : b( b ),
-        c( c ),
-        d( d ),
-        e( e )
-      { mNumDefaultArgs = 4; }
-   _EngineFunctionDefaultArguments( A a, B b, C c, D d, E e )
-      : a( a ),
-        b( b ),
-        c( c ),
-        d( d ),
-        e( e )
-      { mNumDefaultArgs = 5; }
-};
-template< typename A, typename B, typename C, typename D, typename E, typename F >
-struct _EngineFunctionDefaultArguments< void( A, B, C, D, E, F ) > : public EngineFunctionDefaultArguments
-{
-   typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
-   typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
-   typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
-   typename EngineTypeTraits< D >::DefaultArgumentValueStoreType d;
-   typename EngineTypeTraits< E >::DefaultArgumentValueStoreType e;
-   typename EngineTypeTraits< F >::DefaultArgumentValueStoreType f;
-   
-   _EngineFunctionDefaultArguments()
-      { mNumDefaultArgs = 0; }
-   _EngineFunctionDefaultArguments( F f )
-      : f( f )
-      { mNumDefaultArgs = 1; }
-   _EngineFunctionDefaultArguments( E e, F f )
-      : e( e ),
-        f( f )
-      { mNumDefaultArgs = 2; }
-   _EngineFunctionDefaultArguments( D d, E e, F f )
-      : d( d ),
-        e( e ),
-        f( f )
-      { mNumDefaultArgs = 3; }
-   _EngineFunctionDefaultArguments( C c, D d, E e, F f )
-      : c( c ),
-        d( d ),
-        e( e ),
-        f( f )
-      { mNumDefaultArgs = 4; }
-   _EngineFunctionDefaultArguments( B b, C c, D d, E e, F f )
-      : b( b ),
-        c( c ),
-        d( d ),
-        e( e ),
-        f( f )
-      { mNumDefaultArgs = 5; }
-   _EngineFunctionDefaultArguments( A a, B b, C c, D d, E e, F f )
-      : a( a ),
-        b( b ),
-        c( c ),
-        d( d ),
-        e( e ),
-        f( f )
-      { mNumDefaultArgs = 6; }
-};
-template< typename A, typename B, typename C, typename D, typename E, typename F, typename G >
-struct _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G ) > : public EngineFunctionDefaultArguments
-{
-   typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
-   typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
-   typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
-   typename EngineTypeTraits< D >::DefaultArgumentValueStoreType d;
-   typename EngineTypeTraits< E >::DefaultArgumentValueStoreType e;
-   typename EngineTypeTraits< F >::DefaultArgumentValueStoreType f;
-   typename EngineTypeTraits< G >::DefaultArgumentValueStoreType g;
-   
-   _EngineFunctionDefaultArguments()
-      { mNumDefaultArgs = 0; }
-   _EngineFunctionDefaultArguments( G g )
-      : g( g )
-      { mNumDefaultArgs = 1; }
-   _EngineFunctionDefaultArguments( F f, G g )
-      : f( f ),
-        g( g )
-      { mNumDefaultArgs = 2; }
-   _EngineFunctionDefaultArguments( E e, F f, G g )
-      : e( e ),
-        f( f ),
-        g( g )
-      { mNumDefaultArgs = 3; }
-   _EngineFunctionDefaultArguments( D d, E e, F f, G g )
-      : d( d ),
-        e( e ),
-        f( f ),
-        g( g )
-      { mNumDefaultArgs = 4; }
-   _EngineFunctionDefaultArguments( C c, D d, E e, F f, G g )
-      : c( c ),
-        d( d ),
-        e( e ),
-        f( f ),
-        g( g )
-      { mNumDefaultArgs = 5; }
-   _EngineFunctionDefaultArguments( B b, C c, D d, E e, F f, G g )
-      : b( b ),
-        c( c ),
-        d( d ),
-        e( e ),
-        f( f ),
-        g( g )
-      { mNumDefaultArgs = 6; }
-   _EngineFunctionDefaultArguments( A a, B b, C c, D d, E e, F f, G g )
-      : a( a ),
-        b( b ),
-        c( c ),
-        d( d ),
-        e( e ),
-        f( f ),
-        g( g )
-      { mNumDefaultArgs = 7; }
-};
-template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
-struct _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H ) > : public EngineFunctionDefaultArguments
-{
-   typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
-   typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
-   typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
-   typename EngineTypeTraits< D >::DefaultArgumentValueStoreType d;
-   typename EngineTypeTraits< E >::DefaultArgumentValueStoreType e;
-   typename EngineTypeTraits< F >::DefaultArgumentValueStoreType f;
-   typename EngineTypeTraits< G >::DefaultArgumentValueStoreType g;
-   typename EngineTypeTraits< H >::DefaultArgumentValueStoreType h;
-   
-   _EngineFunctionDefaultArguments()
-      { mNumDefaultArgs = 0; }
-   _EngineFunctionDefaultArguments( H h )
-      : h( h )
-      { mNumDefaultArgs = 1; }
-   _EngineFunctionDefaultArguments( G g, H h )
-      : g( g ),
-        h( h )
-      { mNumDefaultArgs = 2; }
-   _EngineFunctionDefaultArguments( F f, G g, H h )
-      : f( f ),
-        g( g ),
-        h( h )
-      { mNumDefaultArgs = 3; }
-   _EngineFunctionDefaultArguments( E e, F f, G g, H h )
-      : e( e ),
-        f( f ),
-        g( g ),
-        h( h )
-      { mNumDefaultArgs = 4; }
-   _EngineFunctionDefaultArguments( D d, E e, F f, G g, H h )
-      : d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h )
-      { mNumDefaultArgs = 5; }
-   _EngineFunctionDefaultArguments( C c, D d, E e, F f, G g, H h )
-      : c( c ),
-        d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h )
-      { mNumDefaultArgs = 6; }
-   _EngineFunctionDefaultArguments( B b, C c, D d, E e, F f, G g, H h )
-      : b( b ),
-        c( c ),
-        d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h )
-      { mNumDefaultArgs = 7; }
-   _EngineFunctionDefaultArguments( A a, B b, C c, D d, E e, F f, G g, H h )
-      : a( a ),
-        b( b ),
-        c( c ),
-        d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h )
-      { mNumDefaultArgs = 8; }
-};
-template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
-struct _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I ) > : public EngineFunctionDefaultArguments
-{
-   typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
-   typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
-   typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
-   typename EngineTypeTraits< D >::DefaultArgumentValueStoreType d;
-   typename EngineTypeTraits< E >::DefaultArgumentValueStoreType e;
-   typename EngineTypeTraits< F >::DefaultArgumentValueStoreType f;
-   typename EngineTypeTraits< G >::DefaultArgumentValueStoreType g;
-   typename EngineTypeTraits< H >::DefaultArgumentValueStoreType h;
-   typename EngineTypeTraits< I >::DefaultArgumentValueStoreType i;
-   
-   _EngineFunctionDefaultArguments()
-      { mNumDefaultArgs = 0; }
-   _EngineFunctionDefaultArguments( I i )
-      : i( i )
-      { mNumDefaultArgs = 1; }
-   _EngineFunctionDefaultArguments( H h, I i )
-      : h( h ),
-        i( i )
-      { mNumDefaultArgs = 2; }
-   _EngineFunctionDefaultArguments( G g, H h, I i )
-      : g( g ),
-        h( h ),
-        i( i )
-      { mNumDefaultArgs = 3; }
-   _EngineFunctionDefaultArguments( F f, G g, H h, I i )
-      : f( f ),
-        g( g ),
-        h( h ),
-        i( i )
-      { mNumDefaultArgs = 4; }
-   _EngineFunctionDefaultArguments( E e, F f, G g, H h, I i )
-      : e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i )
-      { mNumDefaultArgs = 5; }
-   _EngineFunctionDefaultArguments( D d, E e, F f, G g, H h, I i )
-      : d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i )
-      { mNumDefaultArgs = 6; }
-   _EngineFunctionDefaultArguments( C c, D d, E e, F f, G g, H h, I i )
-      : c( c ),
-        d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i )
-      { mNumDefaultArgs = 7; }
-   _EngineFunctionDefaultArguments( B b, C c, D d, E e, F f, G g, H h, I i )
-      : b( b ),
-        c( c ),
-        d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i )
-      { mNumDefaultArgs = 8; }
-   _EngineFunctionDefaultArguments( A a, B b, C c, D d, E e, F f, G g, H h, I i )
-      : a( a ),
-        b( b ),
-        c( c ),
-        d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i )
-      { mNumDefaultArgs = 9; }
-};
-template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
-struct _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J ) > : public EngineFunctionDefaultArguments
-{
-   typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
-   typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
-   typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
-   typename EngineTypeTraits< D >::DefaultArgumentValueStoreType d;
-   typename EngineTypeTraits< E >::DefaultArgumentValueStoreType e;
-   typename EngineTypeTraits< F >::DefaultArgumentValueStoreType f;
-   typename EngineTypeTraits< G >::DefaultArgumentValueStoreType g;
-   typename EngineTypeTraits< H >::DefaultArgumentValueStoreType h;
-   typename EngineTypeTraits< I >::DefaultArgumentValueStoreType i;
-   typename EngineTypeTraits< J >::DefaultArgumentValueStoreType j;
-   
-   _EngineFunctionDefaultArguments()
-      { mNumDefaultArgs = 0; }
-   _EngineFunctionDefaultArguments( J j )
-      : j( j )
-      { mNumDefaultArgs = 1; }
-   _EngineFunctionDefaultArguments( I i, J j )
-      : i( i ),
-        j( j )
-      { mNumDefaultArgs = 2; }
-   _EngineFunctionDefaultArguments( H h, I i, J j )
-      : h( h ),
-        i( i ),
-        j( j )
-      { mNumDefaultArgs = 3; }
-   _EngineFunctionDefaultArguments( G g, H h, I i, J j )
-      : g( g ),
-        h( h ),
-        i( i ),
-        j( j )
-      { mNumDefaultArgs = 4; }
-   _EngineFunctionDefaultArguments( F f, G g, H h, I i, J j )
-      : f( f ),
-        g( g ),
-        h( h ),
-        i( i ),
-        j( j )
-      { mNumDefaultArgs = 5; }
-   _EngineFunctionDefaultArguments( E e, F f, G g, H h, I i, J j )
-      : e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i ),
-        j( j )
-      { mNumDefaultArgs = 6; }
-   _EngineFunctionDefaultArguments( D d, E e, F f, G g, H h, I i, J j )
-      : d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i ),
-        j( j )
-      { mNumDefaultArgs = 7; }
-   _EngineFunctionDefaultArguments( C c, D d, E e, F f, G g, H h, I i, J j )
-      : c( c ),
-        d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i ),
-        j( j )
-      { mNumDefaultArgs = 8; }
-   _EngineFunctionDefaultArguments( B b, C c, D d, E e, F f, G g, H h, I i, J j )
-      : b( b ),
-        c( c ),
-        d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i ),
-        j( j )
-      { mNumDefaultArgs = 9; }
-   _EngineFunctionDefaultArguments( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j )
-      : a( a ),
-        b( b ),
-        c( c ),
-        d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i ),
-        j( j )
-      { mNumDefaultArgs = 10; }
-};
-template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K >
-struct _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J, K ) > : public EngineFunctionDefaultArguments
-{
-   typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
-   typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
-   typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
-   typename EngineTypeTraits< D >::DefaultArgumentValueStoreType d;
-   typename EngineTypeTraits< E >::DefaultArgumentValueStoreType e;
-   typename EngineTypeTraits< F >::DefaultArgumentValueStoreType f;
-   typename EngineTypeTraits< G >::DefaultArgumentValueStoreType g;
-   typename EngineTypeTraits< H >::DefaultArgumentValueStoreType h;
-   typename EngineTypeTraits< I >::DefaultArgumentValueStoreType i;
-   typename EngineTypeTraits< J >::DefaultArgumentValueStoreType j;
-   typename EngineTypeTraits< K >::DefaultArgumentValueStoreType k;
 
-   _EngineFunctionDefaultArguments()
-      { mNumDefaultArgs = 0; }
-   _EngineFunctionDefaultArguments( K k )
-      : k( k )
-      { mNumDefaultArgs = 1; }
-   _EngineFunctionDefaultArguments( J j, K k )
-      : j( j ),
-        k( k )
-      { mNumDefaultArgs = 2; }
-   _EngineFunctionDefaultArguments( I i, J j, K k )
-      : i( i ),
-        j( j ),
-        k( k )
-      { mNumDefaultArgs = 3; }
-   _EngineFunctionDefaultArguments( H h, I i, J j, K k )
-      : h( h ),
-        i( i ),
-        j( j ),
-        k( k )
-      { mNumDefaultArgs = 4; }
-   _EngineFunctionDefaultArguments( G g, H h, I i, J j, K k )
-      : g( g ),
-        h( h ),
-        i( i ),
-        j( j ),
-        k( k )
-      { mNumDefaultArgs = 5; }
-   _EngineFunctionDefaultArguments( F f, G g, H h, I i, J j, K k )
-      : f( f ),
-        g( g ),
-        h( h ),
-        i( i ),
-        j( j ),
-        k( k )
-      { mNumDefaultArgs = 6; }
-   _EngineFunctionDefaultArguments( E e, F f, G g, H h, I i, J j, K k )
-      : e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i ),
-        j( j ),
-        k( k )
-      { mNumDefaultArgs = 7; }
-   _EngineFunctionDefaultArguments( D d, E e, F f, G g, H h, I i, J j, K k )
-      : d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i ),
-        j( j ),
-        k( k )
-      { mNumDefaultArgs = 8; }
-   _EngineFunctionDefaultArguments( C c, D d, E e, F f, G g, H h, I i, J j, K k )
-      : c( c ),
-        d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i ),
-        j( j ),
-        k( k )
-      { mNumDefaultArgs = 9; }
-   _EngineFunctionDefaultArguments( B b, C c, D d, E e, F f, G g, H h, I i, J j, K k )
-      : b( b ),
-        c( c ),
-        d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i ),
-        j( j ),
-        k( k )
-      { mNumDefaultArgs = 10; }
-   _EngineFunctionDefaultArguments( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k )
-      : a( a ),
-        b( b ),
-        c( c ),
-        d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i ),
-        j( j ),
-        k( k )
-      { mNumDefaultArgs = 11; }
-};
-template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K, typename L >
-struct _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J, K, L ) > : public EngineFunctionDefaultArguments
+template<typename ...ArgTs>
+struct _EngineFunctionDefaultArguments< void(ArgTs...) > : public EngineFunctionDefaultArguments
 {
-   typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
-   typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
-   typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
-   typename EngineTypeTraits< D >::DefaultArgumentValueStoreType d;
-   typename EngineTypeTraits< E >::DefaultArgumentValueStoreType e;
-   typename EngineTypeTraits< F >::DefaultArgumentValueStoreType f;
-   typename EngineTypeTraits< G >::DefaultArgumentValueStoreType g;
-   typename EngineTypeTraits< H >::DefaultArgumentValueStoreType h;
-   typename EngineTypeTraits< I >::DefaultArgumentValueStoreType i;
-   typename EngineTypeTraits< J >::DefaultArgumentValueStoreType j;
-   typename EngineTypeTraits< K >::DefaultArgumentValueStoreType k;
-   typename EngineTypeTraits< L >::DefaultArgumentValueStoreType l;
-
-   _EngineFunctionDefaultArguments()
-      { mNumDefaultArgs = 0; }
-   _EngineFunctionDefaultArguments( L l )
-      : l( l )
-      { mNumDefaultArgs = 1; }
-   _EngineFunctionDefaultArguments( K k, L l )
-      : k( k ),
-        l( l )
-      { mNumDefaultArgs = 2; }
-   _EngineFunctionDefaultArguments( J j, K k, L l )
-      : j( j ),
-        k( k ),
-        l( l )
-      { mNumDefaultArgs = 3; }
-   _EngineFunctionDefaultArguments( I i, J j, K k, L l )
-      : i( i ),
-        j( j ),
-        k( k ),
-        l( l )
-      { mNumDefaultArgs = 4; }
-   _EngineFunctionDefaultArguments( H h, I i, J j, K k, L l )
-      : h( h ),
-        i( i ),
-        j( j ),
-        k( k ),
-        l( l )
-      { mNumDefaultArgs = 5; }
-   _EngineFunctionDefaultArguments( G g, H h, I i, J j, K k, L l )
-      : g( g ),
-        h( h ),
-        i( i ),
-        j( j ),
-        k( k ),
-        l( l )
-      { mNumDefaultArgs = 6; }
-   _EngineFunctionDefaultArguments( F f, G g, H h, I i, J j, K k, L l )
-      : f( f ),
-        g( g ),
-        h( h ),
-        i( i ),
-        j( j ),
-        k( k ),
-        l( l )
-      { mNumDefaultArgs = 7; }
-   _EngineFunctionDefaultArguments( E e, F f, G g, H h, I i, J j, K k, L l )
-      : e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i ),
-        j( j ),
-        k( k ),
-        l( l )
-      { mNumDefaultArgs = 8; }
-   _EngineFunctionDefaultArguments( D d, E e, F f, G g, H h, I i, J j, K k, L l )
-      : d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i ),
-        j( j ),
-        k( k ),
-        l( l )
-      { mNumDefaultArgs = 9; }
-   _EngineFunctionDefaultArguments( C c, D d, E e, F f, G g, H h, I i, J j, K k, L l )
-      : c( c ),
-        d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i ),
-        j( j ),
-        k( k ),
-        l( l )
-      { mNumDefaultArgs = 10; }
-   _EngineFunctionDefaultArguments( B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l )
-      : b( b ),
-        c( c ),
-        d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i ),
-        j( j ),
-        k( k ),
-        l( l )
-      { mNumDefaultArgs = 11; }
-   _EngineFunctionDefaultArguments( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l )
-      : a( a ),
-        b( b ),
-        c( c ),
-        d( d ),
-        e( e ),
-        f( f ),
-        g( g ),
-        h( h ),
-        i( i ),
-        j( j ),
-        k( k ),
-        l( l )
-      { mNumDefaultArgs = 12; }
+	
+	
+	template<typename T> using DefVST = typename EngineTypeTraits<T>::DefaultArgumentValueStoreType;
+	
+	std::tuple<DefVST<ArgTs>  ...> mArgs;
+private:
+	using SelfType = _EngineFunctionDefaultArguments< void(ArgTs...) >;
+	
+	template<size_t ...> struct Seq {};
+	template<size_t N, size_t ...S> struct Gens : Gens<N-1, N-1, S...> {};
+	
+	template<size_t ...I> struct Gens<0, I...>{ typedef Seq<I...> type; };
+	
+	template<typename ...TailTs, size_t ...I>
+	void copyHelper(std::tuple<DefVST<TailTs> ...> defaultArgs, Seq<I...>)  {
+		constexpr size_t offset = (sizeof...(ArgTs) - sizeof...(TailTs));
+		std::tie(std::get<I + offset>(mArgs)...) = defaultArgs;
+	}
+	
+	template<typename ...TailTs> using MaybeVoidEnabled = typename std::enable_if<sizeof...(TailTs) <= sizeof...(ArgTs), void>::type;
+	
+	template<typename ...TailTs> MaybeVoidEnabled<TailTs...> tailInit(DefVST<TailTs> ...tail) {
+		mNumDefaultArgs = sizeof...(TailTs);
+		copyHelper(std::make_tuple(tail...), typename Gens<sizeof...(TailTs)>::type());
+	};
+public:
+   template<typename ...TailTs> _EngineFunctionDefaultArguments(DefVST<TailTs> ...tail)
+	{
+		tailInit(tail...);
+	}
 };
 
 #pragma pack( pop )