I think I would go with a sealed trait and case classes since each Filter has a specific behavior. Also I think there must be a way to use scala type system to avoid the throwMatchErrors for unsupported operations.