public void AddProcessor(IEventReceiverable requester)
        {
            var interfaces = requester.GetType().GetInterfaces();

            int length = interfaces.Length;

            for (int i = 0; i < length; i++)
            {
                var temp = interfaces[i];
                if (temp.IsGenericType && temp.GetGenericTypeDefinition() == typeof(IEventReceiverable <>))
                {
                    int type = temp.GetGenericArguments()[0].GetHashCode();
                    List <WeakWrapper <IEventReceiverable> > outProc = null;

                    if (processors.TryGetValue(type, out outProc))
                    {
                        WeakWrapper <IEventReceiverable> wrap = new WeakWrapper <IEventReceiverable>(requester);
                        processors[type].Add(wrap);
                        return;
                    }

                    processors.Add(type, new List <WeakWrapper <IEventReceiverable> >()
                    {
                        new WeakWrapper <IEventReceiverable>(requester)
                    });
                }
            }
        }
                public int GetOrCreateId(object o, Func <int> idProvider)
                {
                    return(objectToIdMap.GetOrAdd(WeakWrapper <object> .CreateForComparison(o), s =>
                    {
                        s.ConvertToRealWeakWrapper();

                        var id = idProvider();
                        idToObjectMap.TryAdd(id, s);
                        return id;
                    }));
                }
 public bool TryGetId(object o, out int sourceId)
 {
     return(objectToIdMap.TryGetValue(WeakWrapper <object> .CreateForComparison(o), out sourceId));
 }