internal void Talk(Actor sender, Actor?receiver, ActorAddress receiverAddress, object message)
        {
            if (receiver == null)
            {
                if (receiver !.GetAddress().IsUsable)
                {
                    Undelivered.Add(new Envelope(sender, receiverAddress, message));
                }
                return;
            }

            lock (receiver.MatchList)
            {
                //Deliver to all subscribing functions.
                var delivered = false;

                if (receiver.MatchList.Count > 0)
                {
                    //Any function may change the list, so a copy is needed.
                    var ml = receiver.MatchList.ToArray();
                    foreach (var t in ml)
                    {
                        if (t.IsMatch(message))
                        {
                            var receiveProcess = t.GetReceiveProcess(receiver);

                            if (receiveProcess == null)
                            {
                                continue;
                            }

                            receiveProcess(sender, t, message);
                            delivered = true;
                        }
                    }
                }
                if (!delivered)
                {
                    receiver.Other(sender, null, message);
                }
            }
        }
 internal Envelope(Actor sender, ActorAddress actorAddress, object message)
 {
     Sender       = sender;
     ActorAddress = actorAddress;
     Message      = message;
 }
 internal Envelope(Actor sender, Type receiverType, string receiverName, object message)
 {
     Sender       = sender;
     ActorAddress = new ActorAddress(receiverType, receiverName);
     Message      = message;
 }