Files
dungeons/Assets/Plugins/Zenject/OptionalExtras/Signals/Internal/Binders/BindSignal/BindSignalToBinder.cs

65 lines
2.2 KiB
C#

using System;
using ModestTree;
namespace Zenject
{
public class BindSignalToBinder<TSignal>
{
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<TSignal> callback)
{
Assert.That(!_bindStatement.HasFinalizer);
_bindStatement.SetFinalizer(new NullBindingFinalizer());
var bindInfo = _container.Bind<IDisposable>()
.To<SignalCallbackWrapper>()
.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<object>)(o => callback((TSignal)o)))
.NonLazy().BindInfo;
return new SignalCopyBinder(bindInfo);
}
public SignalCopyBinder ToMethod(Action callback)
{
return ToMethod(signal => callback());
}
public BindSignalFromBinder<TObject, TSignal> ToMethod<TObject>(Action<TObject, TSignal> handler)
{
return ToMethod<TObject>(x => (Action<TSignal>)(s => handler(x, s)));
}
public BindSignalFromBinder<TObject, TSignal> ToMethod<TObject>(Func<TObject, Action> handlerGetter)
{
return ToMethod<TObject>(x => (Action<TSignal>)(s => handlerGetter(x)()));
}
public BindSignalFromBinder<TObject, TSignal> ToMethod<TObject>(Func<TObject, Action<TSignal>> handlerGetter)
{
return new BindSignalFromBinder<TObject, TSignal>(
_signalBindInfo, _bindStatement, handlerGetter, _container);
}
}
}