abstract methods