/**
 * This example is adapted from: 
 * 
 * Kim B. Bruce, Luca Cardelli, Giuseppe Castagna, The Hopkins Objects Group, 
 * Gary T. Leavens, and Benjamin Pierce. On Binary Methods, 
 * Theory and Practice of Object Systems 1 (3), 1995, pp. 217-238. 
 *
 * http://www.cs.jhu.edu/labs/pll/constraints/#6
 */

class Point
{
  public double x;
  public double y;

  public Point(double x, double y) {
    this.x = x;
    this.y = y;
  }
  public boolean equal(Point p) {
    return x == p.x && y == p.y;
  }
}

class ColorPoint extends Point
{
  public String color;
  
  public ColorPoint(double x, double y, String color) {
    super(x, y);
    this.color = color;
  }

  public boolean equal(Point p) {
      if (p instanceof ColorPoint) {
	  ColorPoint cp = (ColorPoint)p;
	  return color.equals(cp.color) && x == cp.x && y == cp.y;
      }
      else
	  return false;
  }
}

class BinaryMethod 
{
  public static void breakit(Point p) {
    Point nuPt = new Point(3.2, 4.5);

    if (p.equal(nuPt)) {
      // ...
    }
  }
  public static void main(String[] args) {
    breakit(new Point(0, 0));
    breakit(new ColorPoint(0, 0, "blue"));
  }
}