diff --git a/CMakeLists.txt b/CMakeLists.txt
index bb12412..bcf5b9a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,5 @@
-cmake_minimum_required(VERSION 3.28)
-project(blt-gp VERSION 0.0.3)
+cmake_minimum_required(VERSION 3.25)
+project(blt-gp VERSION 0.0.4)
option(ENABLE_ADDRSAN "Enable the address sanitizer" OFF)
option(ENABLE_UBSAN "Enable the ub sanitizer" OFF)
diff --git a/include/blt/gp/fwdecl.h b/include/blt/gp/fwdecl.h
new file mode 100644
index 0000000..93effe3
--- /dev/null
+++ b/include/blt/gp/fwdecl.h
@@ -0,0 +1,27 @@
+#pragma once
+/*
+ * Copyright (C) 2024 Brett Terpstra
+ *
+ * This program 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.
+ *
+ * This program 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 this program. If not, see .
+ */
+
+#ifndef BLT_GP_FWDECL_H
+#define BLT_GP_FWDECL_H
+
+namespace blt::gp
+{
+ class identifier;
+}
+
+#endif //BLT_GP_FWDECL_H
diff --git a/include/blt/gp/program.h b/include/blt/gp/program.h
new file mode 100644
index 0000000..b19a492
--- /dev/null
+++ b/include/blt/gp/program.h
@@ -0,0 +1,67 @@
+#pragma once
+/*
+ * Copyright (C) 2024 Brett Terpstra
+ *
+ * This program 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.
+ *
+ * This program 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 this program. If not, see .
+ */
+
+#ifndef BLT_GP_PROGRAM_H
+#define BLT_GP_PROGRAM_H
+
+#include
+#include
+#include
+#include
+
+namespace blt::gp
+{
+ class identifier
+ {
+ };
+
+ template
+ class operation
+ {
+ public:
+ using function_t = std::function)>;
+
+ operation(const operation& copy) = default;
+
+ operation(operation&& move) = default;
+
+ template
+ explicit operation(const T& functor)
+ {
+ if constexpr (std::is_same_v)
+ {
+ func = functor;
+ } else
+ {
+ func = [&functor](blt::span args) {
+ return functor(args);
+ };
+ }
+ }
+
+ explicit operation(function_t&& functor): func(std::move(functor))
+ {}
+
+ private:
+ function_t func;
+ };
+
+
+}
+
+#endif //BLT_GP_PROGRAM_H
diff --git a/src/program.cpp b/src/program.cpp
new file mode 100644
index 0000000..3d821da
--- /dev/null
+++ b/src/program.cpp
@@ -0,0 +1,23 @@
+/*
+ *
+ * Copyright (C) 2024 Brett Terpstra
+ *
+ * This program 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.
+ *
+ * This program 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 this program. If not, see .
+ */
+#include
+
+namespace blt::gp
+{
+
+}
\ No newline at end of file