Use a dedicated visitor to avoid mixing concerns