WIP
diff --git a/hamilton/base.py b/hamilton/base.py
index 5debad7..298567d 100644
--- a/hamilton/base.py
+++ b/hamilton/base.py
@@ -32,10 +32,12 @@
 
     @staticmethod
     @abc.abstractmethod
-    def build_result(**outputs: Dict[str, Any]) -> Any:
+    def build_result(**outputs: Any) -> Any:
         """This function builds the result given the computed values."""
         pass
 
+    # def valid_inputs(self) -> :
+
 
 class DictResult(ResultMixin):
     """Simple function that returns the dict of column -> value results.
diff --git a/hamilton/io/__init__.py b/hamilton/io/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/hamilton/io/__init__.py
diff --git a/hamilton/io/materialization.py b/hamilton/io/materialization.py
new file mode 100644
index 0000000..cf8ce2c
--- /dev/null
+++ b/hamilton/io/materialization.py
@@ -0,0 +1,24 @@
+import typing
+
+from hamilton import node
+from hamilton.base import ResultMixin
+from hamilton.function_modifiers import dependencies
+
+
+class SaveTo:
+    def __init__(self, *columns: str):
+        self.columns = columns
+
+    def to_nodes(self) -> typing.List[node.Node]:
+        raise NotImplementedError()
+
+
+class SaveToCSV:
+    def __init__(
+        self,
+        pathname: typing.Union[dependencies.LiteralDependency, dependencies.UpstreamDependency],
+        results_builder: ResultMixin,
+        *columns: str
+    ):
+        self.pathname = pathname
+        self.results_builder = results_builder