public static void Test()
        {
            AlarmSource   alarmSource    = new AlarmSource();
            AlarmConsumer alarmConsumer1 = new AlarmConsumer(1);
            AlarmConsumer alarmConsumer2 = new AlarmConsumer(2);

            AlarmEventWeakEventManager.AddHandler(alarmSource, alarmConsumer1.Listener);
            AlarmEventWeakEventManager.AddHandler(alarmSource, alarmConsumer2.Listener);
            alarmSource.RaiseAlarm();

            // the weak connection: the alarm consumer can be deleted
            // and discarded by GC without removing the listener form the source.
            // Alarm source still stays alive.
            alarmConsumer1 = null;
            Assert.IsNull(alarmConsumer1);
            GC.Collect();

            alarmSource.RaiseAlarm();
        }
            /// <summary>
            /// Stop listening to the given source for the event.
            /// </summary>
            protected override void StopListening(object source)
            {
                AlarmSource typedSource = (AlarmSource)source;

                typedSource.OnAlarmRaised -= OnAlarmEvent;
            }