package cache; public abstract aspect Caching { public interface Cached { java.util.Vector allInvalidated(); } Object Cached.cachedValue; void Cached.clearCache() { System.err.println("cache cleared"); cachedValue = null; } public abstract pointcut cache(Cached t); public abstract pointcut invalidate(Cached t); Object around(Cached t): cache(t) { /* \label{line:cache1} */ if(t.cachedValue==null) { t.cachedValue = proceed(t); /* \label{line:cache2} */ System.err.println("value cached: " + t.cachedValue); } else { System.err.println("cache hit " + t.cachedValue); } return t.cachedValue; } before(Cached t):invalidate(t) { java.util.Iterator it = t.allInvalidated().iterator(); while (it.hasNext()) ((Cached)it.next()).clearCache(); } }