template function