ScopedValueChanger class implementation.
diff --git a/systemverilog-plugin/UhdmAst.cc b/systemverilog-plugin/UhdmAst.cc
index 17b6711..8f76bdc 100644
--- a/systemverilog-plugin/UhdmAst.cc
+++ b/systemverilog-plugin/UhdmAst.cc
@@ -156,6 +156,31 @@
     }
 }
 
+template <typename T> class ScopedValueChanger
+{
+    T &ref;
+    const T prev_val;
+
+  public:
+    ScopedValueChanger() = delete;
+
+    explicit ScopedValueChanger(T &r) : ref(r), prev_val(ref) {}
+
+    ScopedValueChanger(T &r, const T &val) : ref(r), prev_val(ref) { ref = val; }
+
+    ScopedValueChanger(ScopedValueChanger &&) = delete;
+    ScopedValueChanger &operator=(ScopedValueChanger &&) = delete;
+
+    ScopedValueChanger(const ScopedValueChanger &) = delete;
+    ScopedValueChanger &operator=(const ScopedValueChanger &) = delete;
+
+    ~ScopedValueChanger() { ref = prev_val; }
+};
+
+template <typename T> ScopedValueChanger(T &)->ScopedValueChanger<T>;
+
+template <typename T> ScopedValueChanger(T &, const T &)->ScopedValueChanger<T>;
+
 // Delete all children nodes.
 // Does *not* delete attributes.
 // This function exists as Yosys's function node->delete_children() does remove all children and attributes.