use singleton trait instead of abstract class