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; + } + } +} +