using System; namespace GodotHostTest.GodotDI; /// /// An object that allows communication through scopes, by providing a couple getter/setter that can be injected in /// different scopes. /// /// The type that's been passed through scopes. /// public class ValueProvider { private bool _isSet; private T? _value; public ValueProvider() { Setter = new SetterImplementation(this); } public IValueSetter Setter { get; } public IValueGetter Getter => !_isSet ? throw new InvalidOperationException($"Value of type {typeof(T)} has not been set yet.") : new GetterImplementation(_value!); private class SetterImplementation(ValueProvider valueProvider) : IValueSetter { public void Set(T value) { if (valueProvider._isSet) throw new InvalidOperationException($"A value (of type {typeof(T)}) cannot be set more than once."); valueProvider._value = value; valueProvider._isSet = true; } } private class GetterImplementation(T value) : IValueGetter { public T Value => value; } }