fully templatized