use sealed trait for InputType