// 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, new Integer(0)); 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 (@ this.set_initial(sV.get_total()); System.out.println(" start new container "); @) after Container (@ int cap = host.get_capacity().get_i().intValue(); int diff = sV.get_total().intValue() - this.get_initial().intValue(); if (diff > host.get_capacity().get_i().intValue()) { System.out.println(" total weight " + diff + " but limit is = " + cap + " OVER CAPACITY "); }; System.out.println(" end container "); @) } 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 "); } @) }