// Animal.java [dynamic] import java.util.*; public class Animal implements Tracer { private String name; private Integer code; public void setName(String n) { name = n; } public String getName() { return name; } public void setCode(Integer i) { code = i; } public Integer getCode() { return code; } // == SHRINK INSERTION ========================= // == generic for all classes that "personify" // the Personalities/J compiler must insert // these definitions only once at the class // within the hierarchy that is closest to // the root, whose ancestors do NOT personify // anything, but it personifies something. // // In this example, the class that fulfills // these requirements is the Animal class. protected Shrink $shrink = new Shrink(); public boolean personify(String what) { return $shrink.personify(what); } public boolean personifies(String what) { return $shrink.personifies(what); } public boolean forget(String what) { return $shrink.forget(what); } public boolean canpersonify(String what) { return $shrink.canpersonify(what); } public Vector personalities() { return $shrink.personalities(); } // == SHRINK INSERTION ENDS =================== // for Tracer Tracer$Ego $tracer = new Tracer$Ego( $shrink ); public void trace(String msg) { if (personifies( "Tracer" )) $tracer.trace(this, msg); } }