slightly more complex, using adaptor pattern