make data type templated