namespace internal {                                                                                                                                      \
        template<typename T, bool is_class = std::is_class<T>::value, typename = void> struct has_method_##NAME##_helper : std::false_type {};                \
                                                                                                                                                              \
        template<
typename T> 
struct has_method_##NAME##_helper<T, true, 
std::void_t<decltype(&T::NAME)>> : has_method_##NAME##_helper<decltype(&T::NAME)> {}; \
 
                                                                                                                                                              \
        template<typename Signature> struct has_method_##NAME##_helper<Signature, false> {                                                                    \
            static_assert(std::is_member_function_pointer<Signature>::value, "Not a member function pointer");                                                \
            using T = 
typename function_traits<Signature>::class_type;                                                                                        \
 
            static_assert(!std::is_void<T>::value, "Void class type");                                                                                        \
                                                                                                                                                              \
            template<typename C, typename = std::void_t<decltype(static_cast<Signature>(&C::NAME))>> static auto check(int) -> std::true_type;                \
            template<typename> static auto check(...) -> std::false_type;                                                                                     \
                                                                                                                                                              \
            using type = decltype(check<T>(0));                                                                                                               \
        };                                                                                                                                                    \
    }                                                                                                                                                         \
    template<typename Signature> struct has_method_##NAME : internal::has_method_##NAME##_helper<Signature>::type {};