diff --git a/Blarg.GameFramework/Blarg.GameFramework.csproj b/Blarg.GameFramework/Blarg.GameFramework.csproj
index ebb1f38..3798348 100644
--- a/Blarg.GameFramework/Blarg.GameFramework.csproj
+++ b/Blarg.GameFramework/Blarg.GameFramework.csproj
@@ -157,6 +157,8 @@
+
+
diff --git a/Blarg.GameFramework/IService.cs b/Blarg.GameFramework/IService.cs
new file mode 100644
index 0000000..6e59869
--- /dev/null
+++ b/Blarg.GameFramework/IService.cs
@@ -0,0 +1,11 @@
+using System;
+
+namespace Blarg.GameFramework
+{
+ public interface IService
+ {
+ void OnRegister();
+ void OnUnregister();
+ }
+}
+
diff --git a/Blarg.GameFramework/Services.cs b/Blarg.GameFramework/Services.cs
new file mode 100644
index 0000000..b2656e6
--- /dev/null
+++ b/Blarg.GameFramework/Services.cs
@@ -0,0 +1,66 @@
+using System;
+using System.Collections.Generic;
+
+namespace Blarg.GameFramework
+{
+ public static class Services
+ {
+ static Dictionary _services = new Dictionary();
+
+ public static void Register(object service)
+ {
+ if (service == null)
+ throw new ArgumentNullException("service");
+ var type = service.GetType();
+ if (type.IsValueType)
+ throw new ArgumentException("Services cannot be used with value types.", "service");
+
+ if (_services.ContainsKey(type))
+ throw new InvalidOperationException("Service object of this type has already been registered.");
+
+ if (service is IService)
+ ((IService)service).OnRegister();
+
+ _services.Add(type, service);
+ }
+
+ public static void Unregister(object service)
+ {
+ if (service == null)
+ throw new ArgumentNullException("service");
+ var type = service.GetType();
+ if (type.IsValueType)
+ throw new ArgumentException("Services cannot be used with value types.", "service");
+
+ object registeredService;
+ _services.TryGetValue(type, out registeredService);
+ if (registeredService == null)
+ return;
+
+ if (registeredService != service)
+ throw new InvalidOperationException("This is not the service object that was registered under this type.");
+
+ _services.Remove(type);
+
+ if (registeredService is IService)
+ ((IService)registeredService).OnUnregister();
+ }
+
+ public static T Get() where T : class
+ {
+ var type = typeof(T);
+ return Get(type) as T;
+ }
+
+ public static object Get(Type type)
+ {
+ if (type.IsValueType)
+ throw new ArgumentException("Services cannot be used with value types.", "type");
+
+ object service;
+ _services.TryGetValue(type, out service);
+ return service;
+ }
+ }
+}
+