add cache function