public CellElement getPointerWithPolicy(int policy) {

      if (m_pointers.size() == 0) {
         return null;
      }

      CellElement retCell = null;

      switch (policy) {
         case POINTER_POLICY_ANY:

            retCell = (CellElement) m_pointers.firstElement();
            break;

         case POINTER_POLICY_CLOCKWISE:

            // Clockwise:
            // 1. left
            // 2. diag
            // 3. top

            retCell = getPositionalPointer(POINTERPOS_LEFT);

            if (retCell == null) {
               retCell = getPositionalPointer(POINTERPOS_DIAG);
            }

            if (retCell == null) {
               retCell = getPositionalPointer(POINTERPOS_TOP);
            }

            break;

         case POINTER_POLICY_COUNTERCLOCKWISE:

            // Clockwise:
            // 1. top
            // 2. diag
            // 3. left

            retCell = getPositionalPointer(POINTERPOS_TOP);

            if (retCell == null) {
               retCell = getPositionalPointer(POINTERPOS_DIAG);
            }

            if (retCell == null) {
               retCell = getPositionalPointer(POINTERPOS_LEFT);
            }

            break;

         case POINTER_POLICY_RANDOM:

            retCell = getPointer( (int) (Math.random() * m_pointers.size()));
      }

      return retCell;
   }