public void AddContext(IExtendedSubject context)
        {
            IExtendedSubject newContext = new SynchronizedSubject(context);

            context.AddExtension <ILock>(new StateManagerLock());
            context.AddExtension <IStateCallback>(this);
            lock ( _toBePredicated) {
                _toBePredicated.Enqueue(context);
            }
        }
        // **********************************************************************
        private void ProcessQueuedStates(Object stateInfo)
        {
            IExtendedSubject state = (IExtendedSubject)stateInfo;

            try {
                _lockExecutor.AcquireReaderLock(-1);
                _clientExecutor(state);
            }
            finally {
                _lockExecutor.ReleaseLock();
            }
        }
        // **********************************************************************
        private void ProcessQueuedPredicate(Object obj)
        {
            IExtendedSubject context = (IExtendedSubject)obj;

            try {
                _lockRung.AcquireReaderLock(-1);
                foreach (Rung rung in _rungs)
                {
                    if (rung._predicates(context))
                    {
                        rung._executor(context);
                    }
                }
            }
            finally {
                _lockRung.ReleaseLock();
            }
        }
 public SynchronizedSubject(IExtendedSubject parent)
 {
     _parent = parent;
 }
 public SynchronizedSubject()
 {
     _parent = new Subject();
 }