Refactored to improve extensibility and flexibility of cache invalidation logic. Event construction has been moved into protected methods to allow easier customization; additionally, more event data is passed through to give application listeners greater control over handling.