Index: src/AST/Node.hpp
===================================================================
--- src/AST/Node.hpp	(revision 3cd5fdde9ed74eb5131706e7f87dc45dcdd63a34)
+++ src/AST/Node.hpp	(revision b7d92b9615536fccd480694cbb6833bd89ffa8f3)
@@ -18,4 +18,5 @@
 #include <cassert>
 #include <iosfwd>
+#include <type_traits> // for remove_reference
 
 #include "Common/ErrorObjects.h"  // for SemanticErrorException
@@ -82,6 +83,6 @@
 };
 
-// Mutate a node, non-member function to avoid static type
-// problems and be able to use auto return
+/// Mutate a node, non-member function to avoid static type
+/// problems and be able to use auto return
 template<typename node_t>
 node_t * mutate( const node_t * node ) {
@@ -95,4 +96,18 @@
 	);
 	return node->clone();
+}
+
+/// Mutate a node field (only clones if not equal to existing value)
+template<typename node_t, typename field_t>
+const node_t * mutate_field( 
+	const node_t * node, 
+	typename std::remove_const<typename std::remove_reference<field_t>::type>::type node_t::* field,
+	field_t&& val 
+) {
+	if ( node->*field == val ) return node;
+	
+	node_t * ret = mutate( node );
+	ret->*field = std::forward< field_t >( val );
+	return ret;
 }
 
