I opened up a USB numeric-keypad, like this one:
NumKeyPad.jpg
and rewired the buttons into a Plasticine shape, like this:

FancyNumKeyPad.JPG
JPII_back.jpg
Note: Ignore the gyroscopes on this picture - I put them on for a later revamp of this prototype

These buttons sit really nicely beneath the thumb and first two fingers.

then I used and really neat piece of software - AutoHotKey
this lets any remap input, so for example (if I was feeling naughty) I could remap the spacebar to perform ALT+F4

but it is not limited to this: is contains its own scripting language, so it is possible to do very advanced stuff:

For example, the following code creates a magnifier glass when the NumPad '-' key is pressed:

;original by:    holomind
;see more:       http://www.autohotkey.com/forum/topic11700.html
 
  Width=80
  Height=80
 
  HotKey , NumPadSub    , Mag_On
  HotKey , NumPadSub up , Mag_Off
 
  OnExit handle_exit
 
  CoordMode, Mouse, Screen
 
  SPI_GETMOUSESPEED = 0x70
  SPI_SETMOUSESPEED = 0x71
  SlowMouseSpeed = 6
 
  zoom = 2
  Gui,  +AlwaysOnTop +Resize +ToolWindow -SysMenu +E0x00000020
  MouseGetPos, start_x, start_y
  start_x -= Width/2
  start_y -= Height/2
  Gui, Show, w%Width% h%Height% x%start_x% y%start_y% , Magnifier
  WinGet MagnifierID, id  ,Magnifier
  WinSet, Transparent , 254, Magnifier
  Gui, -Caption
 
  GoSub Mag_Off
 
  ;retrieve the unique ID number (HWND/handle) of that window
  WinGet, PrintSourceID, id
 
  hdd_frame := DllCall( "GetDC", UInt, PrintSourceID )
  hdc_frame := DllCall( "GetDC", UInt, MagnifierID )
return
 
;------------------------------------------------------------------
 
Mag_On:
   ; Retrieve the current speed so that it can be restored later:
   DllCall("SystemParametersInfo", UInt, SPI_GETMOUSESPEED, UInt, 0, UIntP, OrigMouseSpeed, UInt, 0)
 
   ; Now set the mouse to the slower speed specified in the
   ; next-to-last parameter (the range is 1-20, 10 is default):
   DllCall("SystemParametersInfo", UInt, SPI_SETMOUSESPEED, UInt, 0, UInt, SlowMouseSpeed, UInt, 0)
 
  Gui, Show
 
  SetTimer, MoveWin, 0
  SetTimer, Repaint, 0
 
   KeyWait NumPadSub  ; This prevents keyboard auto-repeat from doing the DllCall repeatedly.
return
 
Mag_Off:
  SetTimer, MoveWin, Off
  SetTimer, Repaint, Off
 
  Gui, Show, Hide
 
   ; Restore the original speed.
   DllCall("SystemParametersInfo", UInt, 0x71, UInt, 0, UInt, OrigMouseSpeed, UInt, 0)
return
 
;------------------------------------------------------------------
 
Repaint:
   MouseGetPos, start_x, start_y
   WinGetPos, wx, wy, ww, wh , Magnifier
 
   DllCall( "gdi32.dll\SetStretchBltMode", "uint", hdc_frame, "int", 0 )  ; No Antializing
 
   DllCall("gdi32.dll\StretchBlt", UInt,hdc_frame, Int,0, Int,0, Int,ww, Int,wh
          , UInt,hdd_frame, Int, start_x-(ww / 2 / zoom)
          , Int,start_y -( wh / 2/zoom), Int,ww / zoom, Int,wh / zoom ,UInt,0xCC0020) ; SRCCOPY
 
Return
 
;------------------------------------------------------------------
 
MoveWin:
   MouseGetPos, now_x, now_y
   now_x -= Width/2
   now_y -= Height/2
   WinMove, Magnifier, , %now_x%, %now_y%
Return
 
;------------------------------------------------------------------
 
GuiClose:
handle_exit:
   DllCall("gdi32.dll\DeleteDC", UInt,hdc_frame )
   DllCall("gdi32.dll\DeleteDC", UInt,hdd_frame )
ExitApp
 
;------------------------------------------------------------------
 
!+WheelUp::         ; Alt+Shift+WheelUp to zoom in
  If zoom != 16
      zoom *= 2
Return
 
!+WheelDown::      ; Alt+Shift+WheelUp to zoom out
  If zoom != 2
      zoom /= 2
Return