diff --git a/Makefile.am b/Makefile.am
index b76be4d2..c80acdd3 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -71,6 +71,7 @@ UTIL_FILES = \
pool.cpp \
pool.hpp \
preprocessor.hpp \
+ raii.hpp \
random.cpp \
random.hpp \
range.cpp \
diff --git a/raii.hpp b/raii.hpp
new file mode 100644
index 00000000..533cc041
--- /dev/null
+++ b/raii.hpp
@@ -0,0 +1,54 @@
+/*
+ * This file is part of libgim.
+ *
+ * libgim is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * libgim is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with libgim. If not, see .
+ *
+ * Copyright 2012 Danny Robson
+ */
+
+#ifndef __UTIL_RAII_HPP
+#define __UTIL_RAII_HPP
+
+#include "preprocessor.hpp"
+
+#define raii CONCATENATE(__unique_, __COUNTER__)
+
+namespace util {
+ template
+ struct scoped_counter {
+ scoped_counter (T &_counter):
+ counter (_counter)
+ { ++counter; }
+
+ ~scoped_counter ()
+ { --counter; }
+
+ T &counter;
+ };
+
+
+ template
+ struct scoped_function {
+ scoped_function (T &&_func):
+ func (std::move (_func))
+ { ; }
+
+ ~scoped_function ()
+ { func (); }
+
+ T func;
+ };
+}
+
+#endif