IRecievable DetectRecievables()
        {
            m_PointerEventData          = new PointerEventData(m_EventSystem);
            m_PointerEventData.position = Input.mousePosition;

            List <RaycastResult> results = new List <RaycastResult>();

            m_Raycaster.Raycast(m_PointerEventData, results);

            foreach (RaycastResult result in results)
            {
                if (recievableMask == (recievableMask | (1 << result.gameObject.layer)))
                {
                    recievableObject = result.gameObject.GetComponent <IRecievable>();
                    if (recievableObject != null)
                    {
                        return(recievableObject);
                    }
                }
            }
            return(null);
        }
 // Update is called once per frame
 void Update()
 {
     if (Input.GetMouseButtonDown(0))
     {
         draggableObject   = DetectDraggables();
         objectDraggedFrom = DetectRecievables();
         if (draggableObject != null)
         {
             draggableObject.Select();
         }
         dragged = false;
     }
     else if (Input.GetMouseButton(0))
     {
         if (draggableObject != null)
         {
             mousePosition = Input.mousePosition;
             if (dragged)
             {
                 draggedItemPreviewImage.transform.position = mousePosition;
                 //recievableObject = DetectRecievables();
                 //if (recievableObject != null)
                 //{
                 //    recievableObject.OnObjectHoveringOver(selectedItem);
                 //}
             }
             else
             if (Vector2.Distance(mouseDownPosition, mousePosition) > dragThreshold)  // TODO: Optimize.
             {
                 if (draggableMask == (draggableMask | (1 << selectedItem.gameObject.layer)))
                 {
                     dragged = true;
                     draggedItemPreviewImage.sprite             = draggableObject.OnStartDrag();
                     draggedItemPreviewImage.transform.position = mousePosition;
                     draggedItemPreviewImage.gameObject.SetActive(true);
                 }
             }
         }
     }
     else if (Input.GetMouseButtonUp(0))
     {
         if (draggableObject != null)         //something is selected.
         {
             draggedItemPreviewImage.gameObject.SetActive(false);
             recievableObject = DetectRecievables();
             if (!dragged)
             {
                 return;
             }
             if (recievableObject != null && objectDraggedFrom != null && recievableObject != objectDraggedFrom)         //object is over something other than where it started from. could use better logic..
             {
                 draggableObject.OnDragDone();
                 recievableObject.OnObjectAdded(selectedItem);
             }
             else
             {
                 draggableObject.OnCancelDrag();
             }
         }
     }
 }