Use abstract class instead of trait for binary compatibility