public Proposer(Presence presence, Acceptor myAcceptor, Uri orignatorUri, Uri[] allAcceptors) : base(presence)
		{
			this.myAcceptor = myAcceptor;
			this.orignatorUri = orignatorUri;
			this.allAcceptors = allAcceptors;

			ballotBase = base.GetHashCode()%25; // effectively a random choice

			Register<Promise>(OnPromise);
			Register<ProposalSubsumed>(OnProposalSubsumed);
			Register<Accepted>(OnAccepted);
		}
        public Proposer(Presence presence, Acceptor myAcceptor, Uri orignatorUri, Uri[] allAcceptors) : base(presence)
        {
            this.myAcceptor   = myAcceptor;
            this.orignatorUri = orignatorUri;
            this.allAcceptors = allAcceptors;

            ballotBase = base.GetHashCode() % 25;           // effectively a random choice

            Register <Promise>(OnPromise);
            Register <ProposalSubsumed>(OnProposalSubsumed);
            Register <Accepted>(OnAccepted);
        }
		protected virtual void SelectNewMasterOnTopologyChanged(object sender, NodeMetadata nodeMetadata)
		{
			if (nodeMetadata.ChangeType == TopologyChangeType.MasterSelected)
				return;//nothing to do here

			MasterSelectedByQuorum = null; // Who is the master is in doubt, because the topology changed

			var others = topologyState.Keys.ToArray();
			var acceptor = new Acceptor(this, myAddress, others);
			var proposer = new Proposer(this, acceptor, myAddress, others);
			var learner = new Learner(this, others);
			learner.OnAcceptedValue += LearnerOnOnAcceptedValue;
			agents = new Agent[] { acceptor, proposer, learner };

			proposer.StartProposing(new SwitchMasterCommand
			{
				NewMaster = others.OrderBy(x => x.AbsoluteUri).First()
			});
		}