Files

83 lines
2.0 KiB
C#

using System;
using System.Linq;
using ModestTree;
namespace Zenject
{
public class SignalSubscription : IDisposable, IPoolable<Action<object>, SignalDeclaration>
{
readonly Pool _pool;
Action<object> _callback;
SignalDeclaration _declaration;
BindingId _signalId;
public SignalSubscription(Pool pool)
{
_pool = pool;
SetDefaults();
}
public BindingId SignalId
{
get { return _signalId; }
}
public void OnSpawned(
Action<object> callback, SignalDeclaration declaration)
{
Assert.IsNull(_callback);
_callback = callback;
_declaration = declaration;
// Cache this in case OnDeclarationDespawned is called
_signalId = declaration.BindingId;
declaration.Add(this);
}
public void OnDespawned()
{
if (_declaration != null)
{
_declaration.Remove(this);
}
SetDefaults();
}
void SetDefaults()
{
_callback = null;
_declaration = null;
_signalId = new BindingId();
}
public void Dispose()
{
// Allow calling this twice since signals automatically unsubscribe in SignalBus.LateDispose
// and so this causes issues if users also unsubscribe in a MonoBehaviour OnDestroy on a
// root game object
if (!_pool.InactiveItems.Contains(this))
{
_pool.Despawn(this);
}
}
// See comment in SignalDeclaration for why this exists
public void OnDeclarationDespawned()
{
_declaration = null;
}
public void Invoke(object signal)
{
_callback(signal);
}
public class Pool : PoolableMemoryPool<Action<object>, SignalDeclaration, SignalSubscription>
{
}
}
}