push some validation up to the factory method
we should not allow invalid objects to be constructed