function cache [ci skip]