create abstract class agent