Index: src/SynTree/CompoundStmt.cc
===================================================================
--- src/SynTree/CompoundStmt.cc	(revision 06903509f799ad9b509246cc8b08bb77dcd2f1f4)
+++ src/SynTree/CompoundStmt.cc	(revision 6e0f4bd410ae9434db47d2108332267a1d9ec2aa)
@@ -64,6 +64,5 @@
 	}
 	if ( ! declMap.empty() ) {
-		VarExprReplacer replacer( declMap );
-		accept( replacer );
+		VarExprReplacer::replace( this, declMap );
 	}
 }
Index: src/SynTree/FunctionDecl.cc
===================================================================
--- src/SynTree/FunctionDecl.cc	(revision 06903509f799ad9b509246cc8b08bb77dcd2f1f4)
+++ src/SynTree/FunctionDecl.cc	(revision 6e0f4bd410ae9434db47d2108332267a1d9ec2aa)
@@ -49,6 +49,5 @@
 	}
 	if ( ! declMap.empty() ) {
-		VarExprReplacer replacer( declMap );
-		accept( replacer );
+		VarExprReplacer::replace( this, declMap );
 	}
 }
Index: src/SynTree/VarExprReplacer.cc
===================================================================
--- src/SynTree/VarExprReplacer.cc	(revision 06903509f799ad9b509246cc8b08bb77dcd2f1f4)
+++ src/SynTree/VarExprReplacer.cc	(revision 6e0f4bd410ae9434db47d2108332267a1d9ec2aa)
@@ -16,18 +16,49 @@
 #include <iostream>       // for operator<<, basic_ostream, ostream, basic_o...
 
+#include "Common/PassVisitor.h"
 #include "Declaration.h"  // for operator<<, DeclarationWithType
 #include "Expression.h"   // for VariableExpr
 #include "VarExprReplacer.h"
 
-VarExprReplacer::VarExprReplacer( const DeclMap & declMap, bool debug ) : declMap( declMap ), debug( debug ) {}
+namespace VarExprReplacer {
+	namespace {
+		/// Visitor that replaces the declarations that VariableExprs refer to, according to the supplied mapping
+		struct VarExprReplacer {
+		private:
+			const DeclMap & declMap;
+			bool debug;
+		public:
+			VarExprReplacer( const DeclMap & declMap, bool debug = false );
 
-// replace variable with new node from decl map
-void VarExprReplacer::visit( VariableExpr * varExpr ) {
-	// xxx - assertions and parameters aren't accounted for in this... (i.e. they aren't inserted into the map when it's made, only DeclStmts are)
-	if ( declMap.count( varExpr->get_var() ) ) {
-		if ( debug ) {
-			std::cerr << "replacing variable reference: " << (void*)varExpr->get_var() << " " << varExpr->get_var() << " with " << (void*)declMap.at( varExpr->get_var() ) << " " << declMap.at( varExpr->get_var() ) << std::endl;
+			// replace variable with new node from decl map
+			void previsit( VariableExpr * varExpr );
+		};
+	}
+
+	void replace( BaseSyntaxNode * node, const DeclMap & declMap, bool debug ) {
+		PassVisitor<VarExprReplacer> replacer( declMap, debug );
+		maybeAccept( node, replacer );
+	}
+
+	namespace {
+		VarExprReplacer::VarExprReplacer( const DeclMap & declMap, bool debug ) : declMap( declMap ), debug( debug ) {}
+
+		// replace variable with new node from decl map
+		void VarExprReplacer::previsit( VariableExpr * varExpr ) {
+			// xxx - assertions and parameters aren't accounted for in this... (i.e. they aren't inserted into the map when it's made, only DeclStmts are)
+			if ( declMap.count( varExpr->var ) ) {
+				if ( debug ) {
+					std::cerr << "replacing variable reference: " << (void*)varExpr->var << " " << varExpr->var << " with " << (void*)declMap.at( varExpr->var ) << " " << declMap.at( varExpr->var ) << std::endl;
+				}
+				varExpr->var = declMap.at( varExpr->var );
+			}
 		}
-		varExpr->set_var( declMap.at( varExpr->get_var() ) );
 	}
-}
+} // namespace VarExprReplacer
+
+
+
+
+
+
+
Index: src/SynTree/VarExprReplacer.h
===================================================================
--- src/SynTree/VarExprReplacer.h	(revision 06903509f799ad9b509246cc8b08bb77dcd2f1f4)
+++ src/SynTree/VarExprReplacer.h	(revision 6e0f4bd410ae9434db47d2108332267a1d9ec2aa)
@@ -23,22 +23,9 @@
 class VariableExpr;
 
-/// Visitor that replaces the declarations that VariableExprs refer to, according to the supplied mapping
-class VarExprReplacer : public Visitor {
-public:
+namespace VarExprReplacer {
 	typedef std::map< DeclarationWithType *, DeclarationWithType * > DeclMap;
-private:
-	const DeclMap & declMap;
-	bool debug;
-public:
-	VarExprReplacer( const DeclMap & declMap, bool debug = false );
 
-	// replace variable with new node from decl map
-	virtual void visit( VariableExpr * varExpr );
-
-	static void replace( BaseSyntaxNode * node, const DeclMap & declMap, bool debug = false ) {
-		VarExprReplacer replacer( declMap, debug );
-		maybeAccept( node, replacer );
-	}
-};
+	void replace( BaseSyntaxNode * node, const DeclMap & declMap, bool debug = false );
+}
 
 // Local Variables: //
