add cache func