public virtual int RegisterId()
        {
            int id = CurrentId;

            ReferencesByGuid.Add(id, new ReferenceNode());
            CurrentId++;
            return(id);
        }
        public virtual bool IsRegistered(int id)
        {
            if (id == 0)
            {
                throw new ArgumentNullException("id");
            }

            return(ReferencesByGuid.ContainsKey(id));
        }
        public virtual int RegisterId(int id)
        {
            if (id == 0)
            {
                throw new ArgumentNullException("id");
            }

            CurrentId = id + 1;
            ReferencesByGuid.Add(id, new ReferenceNode());
            return(id);
        }
        public virtual int RegisterId(object obj)
        {
            if (obj == null)
            {
                throw new ArgumentNullException("obj");
            }

            int id = CurrentId;

            CurrentId++;
            ReferencesByGuid.Add(id, new ReferenceNode(obj));
            ReferencesByInstance[obj] = id;
            return(id);
        }
        public virtual MemberReferenceList MemberReferences(int id)
        {
            if (id == 0)
            {
                throw new ArgumentNullException("id");
            }

            ReferenceNode value;

            if (!ReferencesByGuid.TryGetValue(id, out value))
            {
                throw new ReferenceException(string.Format("No reference exists for id {0}", id));
            }
            return(value.References);
        }
        public object GetObject(int id)
        {
            if (id == 0)
            {
                throw new ArgumentNullException("id");
            }

            ReferenceNode value;

            if (!ReferencesByGuid.TryGetValue(id, out value))
            {
                throw new ReferenceException(string.Format("No object exists for id {0}", id));
            }

            return(value.SourceObject);
        }