diff --git a/ha-inject/.gitignore b/ha-inject/.gitignore
new file mode 100644
index 0000000..106490c
--- /dev/null
+++ b/ha-inject/.gitignore
@@ -0,0 +1,6 @@
+/.project
+/.classpath
+/.settings/
+/target/
+/bulldozer-temp.json
+/.factorypath
diff --git a/ha-inject/pom.xml b/ha-inject/pom.xml
new file mode 100644
index 0000000..d68d2d1
--- /dev/null
+++ b/ha-inject/pom.xml
@@ -0,0 +1,16 @@
+
+
+ 4.0.0
+
+ ha-inject
+
+
+ com.g2forge.habitat
+ ha-project
+ 0.0.8-SNAPSHOT
+ ../ha-project/pom.xml
+
+
+ Habitat Inject
+ An API for value injection.
+
diff --git a/ha-inject/src/main/java/com/g2forge/habitat/inject/IInjectedValue.java b/ha-inject/src/main/java/com/g2forge/habitat/inject/IInjectedValue.java
new file mode 100644
index 0000000..701d8ae
--- /dev/null
+++ b/ha-inject/src/main/java/com/g2forge/habitat/inject/IInjectedValue.java
@@ -0,0 +1,5 @@
+package com.g2forge.habitat.inject;
+
+public interface IInjectedValue {
+ public InjectedValueDescriptor getDescriptor();
+}
diff --git a/ha-inject/src/main/java/com/g2forge/habitat/inject/InjectedValueDescriptor.java b/ha-inject/src/main/java/com/g2forge/habitat/inject/InjectedValueDescriptor.java
new file mode 100644
index 0000000..b3d05ce
--- /dev/null
+++ b/ha-inject/src/main/java/com/g2forge/habitat/inject/InjectedValueDescriptor.java
@@ -0,0 +1,26 @@
+package com.g2forge.habitat.inject;
+
+import com.g2forge.alexandria.java.type.ref.ITypeRef;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+
+@Data
+@Builder(toBuilder = true)
+@RequiredArgsConstructor
+public class InjectedValueDescriptor {
+ protected final String id;
+
+ protected final ITypeRef type;
+
+ protected final T fallback;
+
+ public InjectedValueDescriptor(Class> owner, String name, ITypeRef type, T fallback) {
+ this(owner.getName() + "." + name, type, fallback);
+ }
+
+ public InjectedValueDescriptor(Class type, T fallback) {
+ this(type.getName(), ITypeRef.of(type), fallback);
+ }
+}
\ No newline at end of file
diff --git a/ha-inject/src/main/java/com/g2forge/habitat/inject/MapInjectedValue.java b/ha-inject/src/main/java/com/g2forge/habitat/inject/MapInjectedValue.java
new file mode 100644
index 0000000..c735e85
--- /dev/null
+++ b/ha-inject/src/main/java/com/g2forge/habitat/inject/MapInjectedValue.java
@@ -0,0 +1,24 @@
+package com.g2forge.habitat.inject;
+
+import java.util.Map;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+
+@Data
+@Builder(toBuilder = true)
+@RequiredArgsConstructor
+public class MapInjectedValue implements IInjectedValue {
+ protected final InjectedValueDescriptor descriptor;
+
+ public T get(Map, ?> map) {
+ if ((map != null) && map.containsKey(getDescriptor().getId())) return getDescriptor().getType().cast(map.get(getDescriptor().getId()));
+ return getDescriptor().getFallback();
+ }
+
+ public Map super String, ? super T> inject(Map super String, ? super T> map, T value) {
+ map.put(getDescriptor().getId(), value);
+ return map;
+ }
+}
diff --git a/pom.xml b/pom.xml
index 4b83ede..a384b52 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,5 +20,6 @@
ha-trace
ha-metadata
ha-plugin
+ ha-inject