template<typename T>
(requires {
{ &T::shift } -> std::same_as<T& (T::*)(const luabridge::LuaRef&, const luabridge::LuaRef&)>;
{ &T::rotate } -> std::same_as<T& (T::*)(const scripting_engine::CPoint2D&, double)>;
{ &T::scale } -> std::same_as<T& (T::*)(const scripting_engine::CPoint2D&, double, double)>;
{ &T::transform } -> std::same_as<T& (T::*)(const scripting_engine::CMatrix2D&)>; })
|| (requires {
{ &T::shift } -> std::same_as<luabridge::RefCountedObjectPtr<T> (T::*)(const luabridge::LuaRef&, const luabridge::LuaRef&)>;
{ &T::rotate } -> std::same_as<luabridge::RefCountedObjectPtr<T> (T::*)(const scripting_engine::CPoint2D&, double)>;
{ &T::scale } -> std::same_as<luabridge::RefCountedObjectPtr<T> (T::*)(const scripting_engine::CPoint2D&, double, double)>;
{ &T::transform } -> std::same_as<luabridge::RefCountedObjectPtr<T> (T::*)(const scripting_engine::CMatrix2D&)>; })