Index: src/ResolvExpr/Occurs.cc
===================================================================
--- src/ResolvExpr/Occurs.cc	(revision ecd4923b6c6691baf4df6c29ef6d99081a28b0d1)
+++ src/ResolvExpr/Occurs.cc	(revision 103b2647fd3e1566f5a1eb7f427ed05be4f8311e)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// Occurs.cc -- 
+// Occurs.cc --
 //
 // Author           : Richard C. Bilson
@@ -17,29 +17,27 @@
 #include <string>             // for string
 
+#include "Common/PassVisitor.h"
 #include "SynTree/Type.h"     // for TypeInstType, Type
-#include "SynTree/Visitor.h"  // for Visitor
 #include "TypeEnvironment.h"  // for EqvClass, TypeEnvironment
 
 namespace ResolvExpr {
-	class Occurs : public Visitor {
-	  public:
+	struct Occurs : public WithVisitorRef<Occurs> {
 		Occurs( std::string varName, const TypeEnvironment &env );
-		bool get_result() const { return result; }
-		virtual void visit( TypeInstType *typeInst );
-	  private:
+		void previsit( TypeInstType * typeInst );
+
 		bool result;
 		std::set< std::string > eqvVars;
-		const TypeEnvironment &env;
+		const TypeEnvironment &tenv;
 	};
 
 	bool occurs( Type *type, std::string varName, const TypeEnvironment &env ) {
-		Occurs occur( varName, env );
+		PassVisitor<Occurs> occur( varName, env );
 		type->accept( occur );
-		return occur.get_result();
+		return occur.pass.result;
 	}
 
-	Occurs::Occurs( std::string varName, const TypeEnvironment &env ) : result( false ), env( env ) {
+	Occurs::Occurs( std::string varName, const TypeEnvironment & env ) : result( false ), tenv( env ) {
 		EqvClass eqvClass;
-		if ( env.lookup( varName, eqvClass ) ) {
+		if ( tenv.lookup( varName, eqvClass ) ) {
 			eqvVars = eqvClass.vars;
 		} else {
@@ -48,17 +46,17 @@
 	}
 
-	void Occurs::visit( TypeInstType *typeInst ) {
+	void Occurs::previsit( TypeInstType * typeInst ) {
 		EqvClass eqvClass;
-///   std::cout << "searching for vars: ";
-///   std::copy( eqvVars.begin(), eqvVars.end(), std::ostream_iterator< std::string >( std::cout, " " ) );
-///   std::cout << std::endl;
+///   std::cerr << "searching for vars: ";
+///   std::copy( eqvVars.begin(), eqvVars.end(), std::ostream_iterator< std::string >( std::cerr, " " ) );
+///   std::cerr << std::endl;
 		if ( eqvVars.find( typeInst->get_name() ) != eqvVars.end() ) {
 			result = true;
-		} else if ( env.lookup( typeInst->get_name(), eqvClass ) ) {
+		} else if ( tenv.lookup( typeInst->get_name(), eqvClass ) ) {
 			if ( eqvClass.type ) {
-///       std::cout << typeInst->get_name() << " is bound to";
-///       eqvClass.type->print( std::cout );
-///       std::cout << std::endl;
-				eqvClass.type->accept( *this );
+///       std::cerr << typeInst->get_name() << " is bound to";
+///       eqvClass.type->print( std::cerr );
+///       std::cerr << std::endl;
+				eqvClass.type->accept( *visitor );
 			} // if
 		} // if
