Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision 134322e8f4d4a14c74012f379a803fc111da3be3)
+++ src/Common/PassVisitor.h	(revision aff3af4b724906e57f820d662e4cead8f89c72f4)
@@ -26,13 +26,11 @@
 
 	template< typename... Args >
-	PassVisitor(Args &&... args) 
+	PassVisitor(Args &&... args)
 		: pass( std::forward<Args>( args )... )
 	{}
 
 	virtual ~PassVisitor() = default;
-private:
+
 	pass_type pass;
-
-public:
 
 	virtual void visit( ObjectDecl *objectDecl ) override final;
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 134322e8f4d4a14c74012f379a803fc111da3be3)
+++ src/InitTweak/FixInit.cc	(revision aff3af4b724906e57f820d662e4cead8f89c72f4)
@@ -192,14 +192,13 @@
 		};
 
-		class FixInit final : public GenPoly::PolyMutator {
+		class FixInit {
 		  public:
 			/// expand each object declaration to use its constructor after it is declared.
 			static void fixInitializers( std::list< Declaration * > &translationUnit );
 
-			typedef GenPoly::PolyMutator Parent;
-			using Parent::mutate;
-			virtual DeclarationWithType * mutate( ObjectDecl *objDecl ) override;
+			DeclarationWithType * postmutate( ObjectDecl *objDecl );
 
 			std::list< Declaration * > staticDtorDecls;
+			std::list< Statement * > stmtsToAddAfter; // found by PassVisitor
 		};
 
@@ -312,5 +311,5 @@
 
 		void FixInit::fixInitializers( std::list< Declaration * > & translationUnit ) {
-			FixInit fixer;
+			PassVisitor<FixInit> fixer;
 
 			// can't use mutateAll, because need to insert declarations at top-level
@@ -320,5 +319,5 @@
 				try {
 					*i = maybeMutate( *i, fixer );
-					translationUnit.splice( i, fixer.staticDtorDecls );
+					translationUnit.splice( i, fixer.pass.staticDtorDecls );
 				} catch( SemanticError &e ) {
 					e.set_location( (*i)->location );
@@ -696,8 +695,6 @@
 		}
 
-		DeclarationWithType *FixInit::mutate( ObjectDecl *objDecl ) {
-			// first recursively handle pieces of ObjectDecl so that they aren't missed by other visitors when the init
-			// is removed from the ObjectDecl
-			objDecl = dynamic_cast< ObjectDecl * >( Parent::mutate( objDecl ) );
+		DeclarationWithType *FixInit::postmutate( ObjectDecl *objDecl ) {
+			// since this removes the init field from objDecl, it must occur after children are mutated (i.e. postmutate)
 			if ( ConstructorInit * ctorInit = dynamic_cast< ConstructorInit * >( objDecl->get_init() ) ) {
 				// a decision should have been made by the resolver, so ctor and init are not both non-NULL
