public void joinByEnterAttribute(NGCCEventReceiver source, String uri, String local, String qname)
      throws SAXException {

    if (isJoining) return; // we are already in the process of joining. ignore.
    isJoining = true;

    // send special token to the rest of the branches.
    // these branches don't understand this token, so they will
    // try to move to a final state and send the token back to us,
    // which this object will ignore (because isJoining==true)
    // Otherwise branches will find an error.
    for (int i = 0; i < _receivers.length; i++)
      if (_receivers[i] != source) _receivers[i].enterAttribute(uri, local, qname);

    // revert to the parent
    _parent._source.replace(this, _parent);
    _parent.onChildCompleted(null, _cookie, true);
    // send this event to the parent
    _parent.enterAttribute(uri, local, qname);
  }