using System; using ModestTree; namespace Zenject { public class BindSignalToBinder { DiContainer _container; BindStatement _bindStatement; SignalBindingBindInfo _signalBindInfo; public BindSignalToBinder(DiContainer container, SignalBindingBindInfo signalBindInfo) { _container = container; _signalBindInfo = signalBindInfo; // This will ensure that they finish the binding _bindStatement = container.StartBinding(); } protected SignalBindingBindInfo SignalBindInfo { get { return _signalBindInfo; } } public SignalCopyBinder ToMethod(Action callback) { Assert.That(!_bindStatement.HasFinalizer); _bindStatement.SetFinalizer(new NullBindingFinalizer()); var bindInfo = _container.Bind() .To() .AsCached() // Note that there's a reason we don't just make SignalCallbackWrapper have a generic // argument for signal type - because when using struct type signals it throws // exceptions on AOT platforms .WithArguments(_signalBindInfo, (Action)(o => callback((TSignal)o))) .NonLazy().BindInfo; return new SignalCopyBinder(bindInfo); } public SignalCopyBinder ToMethod(Action callback) { return ToMethod(signal => callback()); } public BindSignalFromBinder ToMethod(Action handler) { return ToMethod(x => (Action)(s => handler(x, s))); } public BindSignalFromBinder ToMethod(Func handlerGetter) { return ToMethod(x => (Action)(s => handlerGetter(x)())); } public BindSignalFromBinder ToMethod(Func> handlerGetter) { return new BindSignalFromBinder( _signalBindInfo, _bindStatement, handlerGetter, _container); } } }