added caching decorator