// A simple Demeter/Java program for computing averages Container { traversal allWeights( CheckingVisitor cV, SummingVisitor sV ) { to Weight;} (@ // traverse while counting and summing void checkCapacity() throws Exception { // adaptive specification of objects using parsing SummingVisitor sV = SummingVisitor.parse("0"); CheckingVisitor cV = new CheckingVisitor(sV); this.allWeights(cV, sV); } @) } SummingVisitor { before Weight (@ System.out.println("sum " + total.intValue()); total = new Integer(total.intValue() + host.get_i().intValue()); @) } CheckingVisitor { before Container (@ host.set_initial(sV.get_total()); @) after Container (@ int cap = host.get_capacity().get_i().intValue(); int diff = sV.get_total().intValue() - host.get_initial().intValue(); if (diff > host.get_capacity().get_i().intValue()) { System.out.println(" capacity " + diff + " but limit is = " + cap + " OVER CAPACITY "); }; @) } Main { (@ static public void main(String args[]) throws Exception { Runtime rt = Runtime.getRuntime(); rt.traceMethodCalls(true); Container a = Container.parse(System.in); a.checkCapacity(); System.out.println("done "); } @) }