public static void BindExecutionOrder(
            this DiContainer container, Type type, int order)
        {
            Assert.That(type.DerivesFrom <ITickable>() || type.DerivesFrom <IInitializable>() || type.DerivesFrom <IDisposable>() || type.DerivesFrom <IFixedTickable>() || type.DerivesFrom <ILateTickable>(),
                        "Expected type '{0}' to derive from one or more of the following interfaces: ITickable, IInitializable, ILateTickable, IFixedTickable, IDisposable", type.Name());

            if (type.DerivesFrom <ITickable>())
            {
                container.BindTickableExecutionOrder(type, order);
            }

            if (type.DerivesFrom <IInitializable>())
            {
                container.BindInitializableExecutionOrder(type, order);
            }

            if (type.DerivesFrom <IDisposable>())
            {
                container.BindDisposableExecutionOrder(type, order);
            }

            if (type.DerivesFrom <IFixedTickable>())
            {
                container.BindFixedTickableExecutionOrder(type, order);
            }

            if (type.DerivesFrom <ILateTickable>())
            {
                container.BindLateTickableExecutionOrder(type, order);
            }
        }
 public static void BindSignal <TSignal>(this DiContainer container)
     where TSignal : ISignal
 {
     container.Bind(typeof(TSignal), typeof(IDisposable)).To <TSignal>().AsSingle();
     // Execute at the very end to ensure that everyone has unsubscribed before
     // we verify that our listener count is empty
     container.BindDisposableExecutionOrder <TSignal>(int.MinValue);
 }
 public static void BindSignal <TSignal>(this DiContainer container, string identifier)
     where TSignal : ISignal
 {
     container.Bind <TSignal>().WithId(identifier).AsSingle(identifier);
     container.Bind <IDisposable>().To <TSignal>().FromResolve(identifier);
     // Execute at the very end to ensure that everyone has unsubscribed before
     // we verify that our listener count is empty
     container.BindDisposableExecutionOrder <TSignal>(int.MinValue);
 }
        public static void ApplyBindSettings(
            SubContainerCreatorBindInfo subContainerBindInfo, DiContainer subContainer)
        {
            if (subContainerBindInfo.DefaultParentName != null)
            {
#if !ZEN_TESTS_OUTSIDE_UNITY && !NOT_UNITY3D
                var defaultParent = new GameObject(
                    subContainerBindInfo.DefaultParentName);

                defaultParent.transform.SetParent(
                    subContainer.InheritedDefaultParent, false);

                subContainer.DefaultParent = defaultParent.transform;

                subContainer.Bind <IDisposable>()
                .To <DefaultParentObjectDestroyer>().AsCached().WithArguments(defaultParent);

                // Always destroy the default parent last so that the non-monobehaviours get a chance
                // to clean it up if they want to first
                subContainer.BindDisposableExecutionOrder <DefaultParentObjectDestroyer>(int.MinValue);
#endif
            }

            if (subContainerBindInfo.CreateKernel)
            {
                var parentContainer = subContainer.ParentContainers.OnlyOrDefault();
                Assert.IsNotNull(parentContainer, "Could not find unique container when using WithKernel!");

                if (subContainerBindInfo.KernelType != null)
                {
                    parentContainer.Bind(typeof(Kernel).Interfaces()).To(subContainerBindInfo.KernelType)
                    .FromSubContainerResolve()
                    .ByInstance(subContainer).AsCached();
                    subContainer.Bind(subContainerBindInfo.KernelType).AsCached();
                }
                else
                {
                    parentContainer.BindInterfacesTo <Kernel>().FromSubContainerResolve()
                    .ByInstance(subContainer).AsCached();
                    subContainer.Bind <Kernel>().AsCached();
                }
            }
        }
 public static void BindDisposableExecutionOrder <T>(
     this DiContainer container, int order)
     where T : IDisposable
 {
     container.BindDisposableExecutionOrder(typeof(T), order);
 }