I think we should separate the different possiblities in different classes, which respect SRP, and compose with them.