Use abstract classes/functions where appropriate