Here is an example that explains the two Demeter rows. The static JPM row we will do in DemeterJ and the dynamic JPM row we will do in AspectJ without touching the DemeterJ code. Using two different implementation technologies more clearly separates the two JPMs. The task is to count the number of inheritance relationships in a UML-style class diagram: Cd_graph { traversal allInh(UniversalVisitor v) { via Alternat to Vertex; } int countInhRels() {{ this.allInh(new UniversalVisitor(){}); return 0; }} } The purpose of this code is to produce the traversal methods using an empty visitor that does not do anything interesting. This is a use of the first join point model where a traversa strategy introduces traversal methods to the classes in the scope of the traversal. Now, to say what needs to be done in addition to the traversal we use the JPM of AspectJ: (we have to know a little bit about the naming conventions in the generated Java code) aspect Count { static int total; pointcut init(): target(Cd_graph) && call(int countInhRels()); pointcut counting(): target(Vertex) && call(* allInh_Cd_graph_trv_bef (UniversalVisitor)); before():init() {total=0;} before():counting() {total++;} int around(): init() { thisJoinPoint.proceed(); return total; } } Back to Gregor's other point: I can see why he prefers "signatures" over "class names". But what really happens here is that you use a flow specification (NOT a cflow) that is like a cflow but in a different kind of graph. A+ is basically flow(A) along subclass edges in the class graph (and not in the call graph). This is explained better in the slides I pointed to earlier. -- Karl