    // Copyright (C) 2011  Davis E. King (davis@dlib.net)
    // License: Boost Software License   See LICENSE.txt for the full license.
    #undef DLIB_MAKE_MFp_ABSTRACT_
    #ifdef DLIB_MAKE_MFp_ABSTRACT_

    #include "member_function_pointer_kernel_abstract.h"

    namespace dlib
    {

    // ----------------------------------------------------------------------------------------

        template <
            typename T
            >
        member_function_pointer<> make_mfp (
            T& object,
            void (T::*cb)()
        );
        /*!
            requires
                - cb == a valid member function pointer for class T
            ensures
                - returns a member function pointer object MFP such that:
                    - MFP.is_set() == true
                    - calls to MFP() will call (object.*cb)()
        !*/

        template <
            typename T
            >
        member_function_pointer<> make_mfp (
            const T& object,
            void (T::*cb)()const
        );
        /*!
            requires
                - cb == a valid member function pointer for class T
            ensures
                - returns a member function pointer object MFP such that:
                    - MFP.is_set() == true
                    - calls to MFP() will call (object.*cb)()
        !*/

    // ----------------------------------------------------------------------------------------

        template <
            typename T,
            typename A1
            >
        member_function_pointer<A1> make_mfp (
            T& object,
            void (T::*cb)(A1 a1)
        );
        /*!
            requires
                - cb == a valid member function pointer for class T
            ensures
                - returns a member function pointer object MFP such that:
                    - MFP.is_set() == true
                    - calls to MFP(a1) will call (object.*cb)(a1)
        !*/

        template <
            typename T,
            typename A1
            >
        member_function_pointer<A1> make_mfp (
            const T& object,
            void (T::*cb)(A1 a1)const
        );
        /*!
            requires
                - cb == a valid member function pointer for class T
            ensures
                - returns a member function pointer object MFP such that:
                    - MFP.is_set() == true
                    - calls to MFP(a1) will call (object.*cb)(a1)
        !*/

    // ----------------------------------------------------------------------------------------

        template <
            typename T,
            typename A1,
            typename A2
            >
        member_function_pointer<A1,A2> make_mfp (
            T& object,
            void (T::*cb)(A1 a1, A2 a2)
        );
        /*!
            requires
                - cb == a valid member function pointer for class T
            ensures
                - returns a member function pointer object MFP such that:
                    - MFP.is_set() == true
                    - calls to MFP(a1,a2) will call (object.*cb)(a1,a2)
        !*/

        template <
            typename T,
            typename A1,
            typename A2
            >
        member_function_pointer<A1,A2> make_mfp (
            const T& object,
            void (T::*cb)(A1 a1, A2 a2)const
        );
        /*!
            requires
                - cb == a valid member function pointer for class T
            ensures
                - returns a member function pointer object MFP such that:
                    - MFP.is_set() == true
                    - calls to MFP(a1,a2) will call (object.*cb)(a1,a2)
        !*/

    // ----------------------------------------------------------------------------------------

        template <
            typename T,
            typename A1,
            typename A2,
            typename A3
            >
        member_function_pointer<A1,A2,A3> make_mfp (
            T& object,
            void (T::*cb)(A1 a1, A2 a2, A3 a3)
        );
        /*!
            requires
                - cb == a valid member function pointer for class T
            ensures
                - returns a member function pointer object MFP such that:
                    - MFP.is_set() == true
                    - calls to MFP(a1,a2,a3) will call (object.*cb)(a1,a2,a3)
        !*/

        template <
            typename T,
            typename A1,
            typename A2,
            typename A3
            >
        member_function_pointer<A1,A2,A3> make_mfp (
            const T& object,
            void (T::*cb)(A1 a1, A2 a2, A3 a3)const
        );
        /*!
            requires
                - cb == a valid member function pointer for class T
            ensures
                - returns a member function pointer object MFP such that:
                    - MFP.is_set() == true
                    - calls to MFP(a1,a2,a3) will call (object.*cb)(a1,a2,a3)
        !*/

    // ----------------------------------------------------------------------------------------

        template <
            typename T,
            typename A1,
            typename A2,
            typename A3,
            typename A4
            >
        member_function_pointer<A1,A2,A3,A4> make_mfp (
            T& object,
            void (T::*cb)(A1 a1, A2 a2, A3 a3, A4 a4)
        );
        /*!
            requires
                - cb == a valid member function pointer for class T
            ensures
                - returns a member function pointer object MFP such that:
                    - MFP.is_set() == true
                    - calls to MFP(a1,a2,a3,a4) will call (object.*cb)(a1,a2,a3,a4)
        !*/

        template <
            typename T,
            typename A1,
            typename A2,
            typename A3,
            typename A4
            >
        member_function_pointer<A1,A2,A3,A4> make_mfp (
            const T& object,
            void (T::*cb)(A1 a1, A2 a2, A3 a3, A4 a4)const
        );
        /*!
            requires
                - cb == a valid member function pointer for class T
            ensures
                - returns a member function pointer object MFP such that:
                    - MFP.is_set() == true
                    - calls to MFP(a1,a2,a3,a4) will call (object.*cb)(a1,a2,a3,a4)
        !*/

    // ----------------------------------------------------------------------------------------

    }

    #endif // DLIB_MAKE_MFp_ABSTRACT_