- use impl ptr pattern for Device objects