use abstract class for DRY