use a prototype to properly handle `this`