import java.util.Vector; 
aspect Concrete1 extends Back {
   declare parents: Item implements Target;
   declare parents: Container implements Source;
   pointcut modifyTargets(Source s,Target t): 
     target(s) 
       && call(* Container.addItem(Item)) 
       && args(t) ;
}
aspect Concrete2 extends Caching {
   declare parents: Container implements C;
   pointcut cachedmeth(C t): 
     target(t) && call(* Item.check(..));
   pointcut invalidate(C t): 
     target(t) && call(* Container.addItem(..));
}
aspect Adapt {
  public Vector Container.allInvalidated() {
    Vector v = new Vector();
    Container c = this;
    while (c != null) {
      v.add(c);
      c = (Container) c.getSource();
    }
    return v;
  }
  public Vector Container.getTargets() {
    return contents; 
  }
}

