add comment
move function
use template