methods should be pure virtual