public final void setStart(InstructionHandle start) {

    // Call notifyTargetChanging *before* modifying this,
    // as the code triggered by notifyTargetChanging
    // depends on this pointing to the 'old' start.
    notifyTargetChanging();

    this.start = start;

    // call notifyTargetChanged *after* modifying this,
    // as the code triggered by notifyTargetChanged
    // depends on this pointing to the 'new' start.
    notifyTargetChanged();
  }
  public final void setEnd(InstructionHandle end) {
    // call notifyTargetChanging *before* modifying this,
    // as the code triggered by notifyTargetChanging
    // depends on this pointing to the 'old' end.
    // Unregister 'this' from the HashSet held by the 'old' end.
    notifyTargetChanging();

    this.end = end;

    // call notifyTargetChanged *after* modifying this,
    // as the code triggered by notifyTargetChanged
    // depends on this pointing to the 'new' end.
    // Register 'this' in the HashSet held by the 'new' end.
    notifyTargetChanged();
  }