method cache [ci skip]