template< typename T, typename R >
class Closure0 : public Closure
{
    protected
        typedef boost::function<R (T& )> FT;
        T& m_Obj;
        FT m_Function;
    public
        Closure0( T& obj, FT func ) : m_Obj(obj), m_Function(func) { }
        virtual ~Closure0() { }
        virtual void Execute() {
            m_Function( m_Obj );
        }
};

template< typename T, typename R >
Closure* MakeClosure( T& obj, R (T::*func)( ) )
{
    return new Closure0 < T, R > ( obj, func );
}

template< typename T, typename R , typename A0 >
class Closure1 : public Closure
{
    protected
        typedef boost::function<R (T& , A0 )> FT;
        T& m_Obj;
        FT m_Function;
        A0 m_A0;
    public
        Closure1( T& obj, FT func , A0 a0 )
            : m_Obj(obj), m_Function(func) , m_A0( a0 ) { }
        virtual ~Closure1() { }
        virtual void Execute() {
            m_Function( m_Obj , m_A0 );
        }
};

template< typename T, typename R , typename A0 >
Closure* MakeClosure( T& obj, R (T::*func)( A0 a0 ) , A0 a0 )
{
    return new Closure1 < T, R , A0> ( obj, func , a0 );
}

template< typename T, typename R , typename A0 , typename A1 >
class Closure2 : public Closure
{
    protected
        typedef boost::function<R (T& , A0 , A1 )> FT;
        T& m_Obj;
        FT m_Function;
        A0 m_A0;
        A1 m_A1;
    public
        Closure2( T& obj, FT func , A0 a0 , A1 a1 )
            : m_Obj(obj), m_Function(func) , m_A0( a0 ) , m_A1( a1 ) { }
        virtual ~Closure2() { }
        virtual void Execute() {
            m_Function( m_Obj , m_A0 , m_A1 );
        }
};

template< typename T, typename R , typename A0 , typename A1 >
Closure* MakeClosure( T& obj, R (T::*func)( A0 a0 , A1 a1 ) , A0 a0 , A1 a1 )
{
    return new Closure2 < T, R , A0 , A1> ( obj, func , a0 , a1 );
}

template< typename T, typename R , typename A0 , typename A1 , typename A2 >
class Closure3 : public Closure
{
    protected
        typedef boost::function<R (T& , A0 , A1 , A2 )> FT;
        T& m_Obj;
        FT m_Function;
        A0 m_A0;
        A1 m_A1;
        A2 m_A2;
    public
        Closure3( T& obj, FT func , A0 a0 , A1 a1 , A2 a2 )
            : m_Obj(obj), m_Function(func) , m_A0( a0 ) , m_A1( a1 ) ,
            m_A2( a2 ) { }
        virtual ~Closure3() { }
        virtual void Execute() {
            m_Function( m_Obj , m_A0 , m_A1 , m_A2 );
        }
};

template< typename T, typename R , typename A0 , typename A1 , typename A2 >
Closure* MakeClosure( T& obj, R (T::*func)( A0 a0 , A1 a1 , A2 a2 ) , A0 a0 ,
        A1 a1 , A2 a2 )
{
    return new Closure3 < T, R , A0 , A1 , A2> ( obj, func , a0 , a1 , a2 );
}

template< typename T, typename R , typename A0 , typename A1 , typename A2 ,
    typename A3 >
class Closure4 : public Closure
{
    protected
        typedef boost::function<R (T& , A0 , A1 , A2 , A3 )> FT;
        T& m_Obj;
        FT m_Function;
        A0 m_A0;
        A1 m_A1;
        A2 m_A2;
        A3 m_A3;
    public
        Closure4( T& obj, FT func , A0 a0 , A1 a1 , A2 a2 , A3 a3 )
            : m_Obj(obj), m_Function(func) , m_A0( a0 ) , m_A1( a1 ) ,
            m_A2( a2 ) , m_A3( a3 ) { }
        virtual ~Closure4() { }
        virtual void Execute() {
            m_Function( m_Obj , m_A0 , m_A1 , m_A2 , m_A3 );
        }
};

template< typename T, typename R , typename A0 , typename A1 , typename A2 ,
    typename A3 >
Closure* MakeClosure( T& obj, R (T::*func)( A0 a0 , A1 a1 , A2 a2 , A3 a3 ) ,
        A0 a0 , A1 a1 , A2 a2 , A3 a3 ) {
    return new Closure4 < T, R , A0 , A1 , A2 , A3> ( obj, func , a0 , a1 , a2 ,
            a3 );
}