templates are lazy initialized and compiled once