VirtualObject<TNode>
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Threading;
namespace Castle.Components.DictionaryAdapter
{
    public abstract class VirtualObject<TNode> : IVirtual<TNode>, IVirtual
    {
        private List<IVirtualSite<TNode>> sites;
        public abstract bool IsReal { get; }
        public event EventHandler Realized {
            [CompilerGenerated]
            add {
                EventHandler eventHandler = this.Realized;
                EventHandler eventHandler2;
                do {
                    eventHandler2 = eventHandler;
                    EventHandler value2 = (EventHandler)Delegate.Combine(eventHandler2, value);
                    eventHandler = Interlocked.CompareExchange<EventHandler>(ref this.Realized, value2, eventHandler2);
                } while ((object)eventHandler != eventHandler2);
            }
            [CompilerGenerated]
            remove {
                EventHandler eventHandler = this.Realized;
                EventHandler eventHandler2;
                do {
                    eventHandler2 = eventHandler;
                    EventHandler value2 = (EventHandler)Delegate.Remove(eventHandler2, value);
                    eventHandler = Interlocked.CompareExchange<EventHandler>(ref this.Realized, value2, eventHandler2);
                } while ((object)eventHandler != eventHandler2);
            }
        }
        protected VirtualObject()
        {
        }
        protected VirtualObject(IVirtualSite<TNode> site)
        {
            sites = new List<IVirtualSite<TNode>> {
                site
            };
        }
        protected void AddSite(IVirtualSite<TNode> site)
        {
            if (sites != null)
                sites.Add(site);
        }
        void IVirtual<TNode>.AddSite(IVirtualSite<TNode> site)
        {
            AddSite(site);
        }
        protected void RemoveSite(IVirtualSite<TNode> site)
        {
            if (sites != null) {
                int num = sites.IndexOf(site);
                if (num != -1)
                    sites.RemoveAt(num);
            }
        }
        void IVirtual<TNode>.RemoveSite(IVirtualSite<TNode> site)
        {
            RemoveSite(site);
        }
        public TNode Realize()
        {
            if (TryRealize(out TNode node)) {
                if (sites != null) {
                    int count = sites.Count;
                    for (int i = 0; i < count; i++) {
                        sites[i].OnRealizing(node);
                    }
                    sites = null;
                }
                OnRealized();
            }
            return node;
        }
        void IVirtual.Realize()
        {
            Realize();
        }
        protected abstract bool TryRealize(out TNode node);
        protected virtual void OnRealized()
        {
            EventHandler realized = this.Realized;
            if (realized != null) {
                realized(this, EventArgs.Empty);
                this.Realized = null;
            }
        }
    }
}