//(P)erhaps (C)lown (N)onsense (I)s (C)onstructive
//(O)nly (T)oward (G)etting (S)ettlers (U)nderwear
// Note: getX() and getY() added so subclasses (ComplexOrderedPair)
// can read the coordinates through the public interface.
public class OrderedPair {
    // instance variables — private: enforced by compiler
    private double x;
    private double y;
    private double absVal;
    private String label;

    // default constructor
    public OrderedPair(){
        System.out.println("...OrderedPair default constructor...");
        x = 0;
        y = 0;
        absVal = computeAbsVal();
        label = "O";
    }

    // two-parameter constructor
    public OrderedPair(double x, double y){
        System.out.println("...OrderedPair two-parameter constructor...");
        this.x = x;
        this.y = y;
        absVal = computeAbsVal();
        label = "P";
    }

    // copy constructor
    public OrderedPair(OrderedPair orig){
        System.out.println("...OrderedPair copy constructor...");
        x = orig.x;
        y = orig.y;
        absVal = computeAbsVal();
        label = orig.label + "_copy";
    }

    // override toString
    public String toString(){
        return label + "(" + x + ", " + y + ")";
    }

    // getters (accessors)
    public double getX()      { return x;      }
    public double getY()      { return y;      }
    public double getAbsVal() { return absVal; }
    public String getLabel()  { return label;  }

    // setter (mutator)
    public void setLabel(String lbl){
        System.out.println("...setLabel...");
        label = lbl;
    }

    // utility methods
    public double computeAbsVal(){
        System.out.println("...computeAbsVal...");
        return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
    }

    public void transpose(){
        System.out.println("...transpose...");
        double temp = y;
        y = x;
        x = temp;
        absVal = computeAbsVal();
    }

}//end class OrderedPair
