made cache universal, use singleton factory