private bool PostNotification_Imp(System.Type tp, Notification n, bool bNotifyEntity)
        {
            bool handled = false;

            handled = this.PostNotificationToJustSelf(tp, _owner, n);

            if (_ownerGameObject != null)
            {
                if (!Object.ReferenceEquals(_owner, _ownerGameObject))
                {
                    if (_ownerGameObject.Observers.PostNotificationToJustSelf(tp, _owner, n))
                    {
                        handled = true;
                    }
                }

                if (bNotifyEntity)
                {
                    //TODO - a bottleneck here, consider possibilities of speeding this up by removing the need to constantly call 'FindRoot'
                    var root = _ownerGameObject.FindRoot();
                    GameObjectNotificationDispatcher dispatcher;
                    if (root != _ownerGameObject.gameObject && root.GetComponent <GameObjectNotificationDispatcher>(out dispatcher))
                    {
                        if (dispatcher.Observers.PostNotificationToJustSelf(tp, _owner, n))
                        {
                            handled = true;
                        }
                    }
                }
            }

            //let anyone registered with the global hear about it
            var globallyHandled = Notification.PostGlobalNotification(tp, _owner, n);

            //if not handled, check if we should throw an exception
            if (!(handled || globallyHandled) && System.Attribute.IsDefined(tp, typeof(RequireNotificationReceiverAttribute), false))
            {
                var requiredAttrib = tp.GetCustomAttributes(typeof(RequireNotificationReceiverAttribute), false).FirstOrDefault() as RequireNotificationReceiverAttribute;
                if (requiredAttrib != null)
                {
                    if (!handled)
                    {
                        if (!requiredAttrib.GlobalObserverConsidered || !globallyHandled)
                        {
                            if (_ownerGameObject != null)
                            {
                                var root = _ownerGameObject.FindRoot();
                                if (_owner is GameObjectNotificationDispatcher)
                                {
                                    throw new AbsentNotificationReceiverException(n, "A GameObject named '" + root.name + "' requires a receiver to notification of type '" + tp.Name + "'.");
                                }
                                else
                                {
                                    var senderTypeName = (_owner != null) ? _owner.GetType().Name : this.GetType().Name;
                                    throw new AbsentNotificationReceiverException(n, "An object of type '" + senderTypeName + "' on GameObject named '" + root.name + "' requires a receiver to notification of type '" + tp.Name + "'.");
                                }
                            }
                            else
                            {
                                var senderTypeName = (_owner != null) ? _owner.GetType().Name : this.GetType().Name;
                                throw new AbsentNotificationReceiverException(n, "An object of type '" + senderTypeName + "' requires a receiver to notification of type '" + tp.Name + "'.");
                            }
                        }
                    }
                }

                return(false);
            }
            {
                return(true);
            }
        }