public virtual void AttachEvent(string eventName, IWeakEventTarget target)
        {
            bool eventFound = false;
            if (target != null)
            {                
                for (int i = 0; i < _weakEvents.Length; i++)
                {
                    if (string.Compare(eventName, _weakEvents[i], true) == 0)
                    {
                        eventFound = true;
                        if (HasTarget(_listeners[i], target) == null)
                        {                            
                            _listeners[i].Add(new WeakReference(target));
                            if (_logger != null)
                            {
                                _logger(5, string.Format("WEAK_EVT_SRC {0}. Attmept to attach listener for event {1}... OK [target added]; Target ID = {2}", _sourceID, eventName, target.TargetFriendlyID));
                            }
                        }
                        else
                        {
                            if (_logger != null)
                            {
                                _logger(4, string.Format("WEAK_EVT_SRC {0}: Attmept to attach listener for event {1}... IGNORED [target already listening]; Target ID = {2}", _sourceID, eventName, target.TargetFriendlyID));
                            }
                        }
                        break;
                    }
                }

                if (!eventFound && _logger != null)
                {
                    _logger(2, string.Format("WEAK_EVT_SRC {0}: Attmept to attach listener for event {1}... FAILED [no such event]; Target ID = {2}", _sourceID, eventName, target.TargetFriendlyID));
                }
            }            
        }
 private WeakReference HasTarget(IList<WeakReference> listeners, IWeakEventTarget target)
 {
     WeakReference r = null;
     for (int i = listeners.Count - 1; i >= 0; i--)
     {
         if (ReferenceEquals(listeners[i].Target, target))
         {
             r = listeners[i];
             break;
         }
         else if (!listeners[i].IsAlive || listeners[i].Target == null)
         {
             listeners.RemoveAt(i);
         }
     }
     return r;
 }
        public virtual void DetachEvent(string eventName, IWeakEventTarget target)
        {
            if (target != null)
            {
                int targetRemoved = 0;
                for (int i = 0; i < _weakEvents.Length; i++)
                {
                    if (string.Compare(eventName, _weakEvents[i], true) == 0)
                    {
                        WeakReference targetRef = null;
                        do
                        {
                            targetRef = HasTarget(_listeners[i], target);
                            if (targetRef != null)
                            {
                                _listeners[i].Remove(targetRef);
                                targetRemoved++;
                            }
                        } while (_listeners[i].Count > 0 && targetRef != null);
                        
                        break;
                    }
                }

                if (targetRemoved > 0)
                {
                    if (_logger != null)
                    {
                        _logger(4, string.Format("WEAK_EVT_SRC {0}: Attmept to detach listener for event {1}... OK [target removed {2} time(s)]; Target ID = {3}", _sourceID, eventName, targetRemoved, target.TargetFriendlyID));
                    }
                }
                else
                {
                    if (_logger != null)
                    {
                        _logger(2, string.Format("WEAK_EVT_SRC {0}: Attmept to detach listener for event {1}... FAILED [target did not exist or no such event]; Target ID = {2}", _sourceID, eventName, target.TargetFriendlyID));
                    }
                }
            }
        }