// 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); 
  }
}






// Oviparous.java [dynamic]
public class Oviparous
 extends Animal
{
  public void LayEggs() {
    trace( "Oviparous.LayEggs()" );
  }
}









// Mammal.java [dynamic]
public class Mammal 
 extends Animal
{
  public void Nurse() {
    trace( "Mammal.Nurse()" );
  }
}

// Pelican.java [dynamic]
import java.util.*;
public class Pelican 
 extends Oviparous
 implements Flier, Walker
{
  // for Flier
  public void Takeoff() { trace("Pelican.Takeoff():"); }
  public void Ascend() { trace("Pelican.Ascend()");  }
  public boolean ThereYet(int x, int y) {
    trace( "Pelican.ThereYet()" );
    return false;
  }
  public void FlapTowards(int x, int y) { trace( "Pelican.FlapTowards()" ); }
  public void Descend() { trace( "Pelican.Descend():" ); }
  public void Land() { trace( "Pelican.Land()" ); }

  // for Walker
  public void Prepare() { trace( "Pelican.Prepare()" ); }
  public int  NumberOfFeet() { trace( "Pelican.NumberOfFeet()" ); return 2; }
  public void MoveFoot(int feetno) { trace( "Pelican.MoveFoot()" ); }
  public void Stabilize() { trace( "Pelican.Stabilize()" ); }
  public void AtEase() { trace( "Pelican.AtEase()" ); }
  // ============== for Flier
  Flier$Ego $flier = new Flier$Ego( $shrink );
  public void Fly(int x, int y, int altitude) {
    if ( personifies( "Flier" ) )
      $flier.Fly(this, x, y, altitude);
  }
  // ============== For Walker
  Walker$Ego $walker = new Walker$Ego( $shrink );
  public void Walk(int distance) {
    if ( personifies( "Walker" ) )
      $walker.Walk(this, distance);
  }
}
// Bat.java [dynamic]
import java.util.*;
public class Bat 
 extends Mammal 
 implements Flier
{
  // di implementation for Flier ---------------
  public void Takeoff() { trace("Bat.Takeoff():"); }
  public void Ascend() { trace("Bat.Ascend()");  }
  public boolean ThereYet(int x, int y) {
    trace( "Bat.ThereYet()" );
    return true;
  }
  public void FlapTowards(int x, int y) { trace( "Bat.FlapTowards()" ); }
  public void Descend() { trace( "Bat.Descend():" ); }
  public void Land() { trace( "Bat.Land()" ); }
  // ============== for Flier
  Flier$Ego $flier = new Flier$Ego( $shrink );
  public void Fly(int x, int y, int altitude) {
    if ( personifies( "Flier" ) )
      $flier.Fly(this, x, y, altitude);
  }
}        











// Whale.java [dynamic]
import java.util.*;
public class Whale 
  extends Mammal
  implements Swimmer, Jumper
{
  int depth;
  int swam_distance;
  public  Whale() { depth = 0; swam_distance = 0; }
  private void Propel() { swam_distance++; }
  // --- for Swimmer
  public void JumpInTheWater() { trace( "Whale.JumpInTheWater()" ); }
  public void Submerge() { trace( "Whale.Submerge()"); depth++; }
  public void MoveFin() { trace( "Whale.MoveFin()"); Propel(); }
  public void Rise() { trace( "Whale.Rise()");depth--; }
  public void JumpOutOfTheWater() { trace( "Whale.JumpOutOfTheWater()"); }
  // --- for Jumper
  public boolean CheckDistance(int x, int y) {
    trace( "Whale.CheckDistance()" );
    return true;
  }
  public void SprintTo(int x, int y) { trace( "Whale.SprintTo()" ); }
  public void LiftOff(int alt) { trace( "Whale.LiftOff()" ); }
  public void Land() { trace( "Whale.Land()" ); }
  // ============== for Swimmer
  Swimmer$Ego $swimmer = new Swimmer$Ego( $shrink );
  public void Swim(int miles, int depth) {
    if ( personifies( "Swimmer" ) ) 
      $swimmer.Swim(this, miles, depth);
  }
  // ============== for Jumper
  Jumper$Ego $jumper = new Jumper$Ego( $shrink );
  public void Jump(int x, int y, int alt) {
    if ( personifies( "Jumper" ) )
      $jumper.Jump(this, x, y, alt);
  }
}
// SeaLion.java [dynamic]
import java.util.*;
public class SeaLion
 extends Mammal
 implements Walker,Jumper,Swimmer
{
  // for Walker
  public void Prepare() { trace( "SeaLion.Prepare()" ); }
  public int  NumberOfFeet() { trace( "SeaLion.NumberOfFeet()" ); return 2; }
  public void MoveFoot(int feetno) { trace( "SeaLion.MoveFoot()" ); }
  public void Stabilize() { trace( "SeaLion.Stabilize()" ); }
  public void AtEase() { trace( "SeaLion.AtEase()" ); }

  // for Swimmer
  public void JumpInTheWater() { trace( "SeaLion.JumpInTheWater()" ); }
  public void Submerge() { trace( "SeaLion.Submerge()");  }
  public void MoveFin() { trace( "SeaLion.MoveFin()");  }
  public void Rise() { trace( "SeaLion.Rise()"); }
  public void JumpOutOfTheWater() { trace( "SeaLion.JumpOutOfTheWater()"); }

  // for Jumper
  public boolean CheckDistance(int x, int y) {
    trace( "SeaLion.CheckDistance()" );
    return true;
  }
  public void SprintTo(int x, int y) { trace( "SeaLion.SprintTo()" ); }
  public void LiftOff(int alt) { trace( "SeaLion.LiftOff()" ); }
  public void Land() { trace( "SeaLion.Land()" ); }
  // ============== for Swimmer
  Swimmer$Ego $swimmer = new Swimmer$Ego( $shrink );
  public void Swim(int miles, int depth) {
    if ( personifies( "Swimmer" ) ) 
      $swimmer.Swim(this, miles, depth);
  }
  // ============== for Walker
  Walker$Ego $walker = new Walker$Ego( $shrink );
  public void Walk(int distance) {
    if ( personifies( "Walker" ) )
      $walker.Walk(this, distance);
  }
  // ============== for Jumper
  Jumper$Ego $jumper = new Jumper$Ego( $shrink );
  public void Jump(int x, int y, int alt) {
    if ( personifies( "Jumper" ) )
      $jumper.Jump(this, x, y, alt);
  }
}

