recast intends visitors to be shared

* extract visitor to own file
* use shared visitor
Merge pull request #6 from stefanpenner/share-visitor

recast intends visitors to be shared