public CoroutineState(IEnumerator enumerator, RecurranceParameters rp = null)
        {
            if (enumerator == null) throw new ArgumentNullException("enumerator");
            this.Enumerator = enumerator;

            RecurranceParameters = rp;
        }
        //private Coroutine(RecurranceParameters recurranceParameters = null)
        //{
        //    this.RecurranceParameters = recurranceParameters;
        //}

        public static Coroutine Start(IEnumerator coroutine, object owner = null, RecurranceParameters recurranceParameters = null)
        {
            var host = GetCoroutineHost(owner);

            var c = new Coroutine();
            c.State = host.EnqueueCoroutine(coroutine, recurranceParameters);
            return c;
        }
        /// <summary>
        /// Run coroutine once immediately.  Returns null if the coroutine finished.
        /// </summary>
        /// <param name="owner">owner must provide a CoroutineHost by implementing IHasCoroutineHost.CoroutineHost, or the static Coroutine.DefaultCoroutineHost must be set</param>
        /// <param name="coroutine"></param>
        /// <param name="recurranceParameters"></param>
        /// <returns></returns>
        public static Coroutine StartImmediately(IEnumerator coroutine, object owner = null, RecurranceParameters recurranceParameters = null)
        {
            var host = GetCoroutineHost(owner);

            var state = host.RunCoroutine(coroutine, recurranceParameters);
            if (state == null) return null; // Finished right away

            var c = new Coroutine();
            c.State = state;
            return c;
        }
 public ScorePoller(IPolledScorer polled, RecurranceParameters recurranceParameters = null)
 {
     if (recurranceParameters == null)
     {
         var hasRP = polled as IHasScorerRecurranceParameters;
         if (hasRP != null)
         {
             recurranceParameters = hasRP.ScorerRecurranceParameters;
         }
     }
     SetPolledAndRP(polled, recurranceParameters);
 }
 public StatusPoller(IPolledStatus polled, RecurranceParameters recurranceParameters = null
     //, object context = null
     ) 
 {
     if (recurranceParameters == null)
     {
         var hasRP = polled as IHasStatusRecurranceParameters;
         if (hasRP != null)
         {
             recurranceParameters = hasRP.RecurranceParameters;
         }
     }
     SetPolledAndRP(polled, recurranceParameters); 
 }
        protected void SetPolledAndRP(object polled, RecurranceParameters recurranceParameters)
        {
            this.PollTarget = polled; // Also sets context

            if (recurranceParameters != null)
            {
                RecurranceParameters = recurranceParameters;
            }
            else
            {
                IHasRecurranceParameters hasRP = polled as IHasRecurranceParameters;
                if (hasRP != null)
                {
                    RecurranceParameters = hasRP.RecurranceParameters;
                }
            }
        }
        protected override BehaviorStatus OnStart()
        {
            coroutineRecurranceParameters = new RecurranceParameters() // TODO - clone
            {
                Interval = this.RecurranceParameters.Interval,
                StartImmediately = this.RecurranceParameters.StartImmediately,
            };
            
            if (behaviorCoroutine == null)
            {
                behaviorCoroutine = new BehaviorCoroutine(this, CheckTime, coroutineRecurranceParameters);
            }
            // else bc will respond to start

            //Coroutine.Start(CheckTime, this.Context, this.RecurranceParameters);
            return base.OnStart();
        }
        public BehaviorCoroutine(IBehavior behavior, IEnumerator enumerator, RecurranceParameters recurranceParameters = null)
        {
            if (behavior == null) throw new ArgumentNullException("behavior");
            if (enumerator == null) throw new ArgumentNullException("enumerator");
            this.behavior = behavior;
            this.enumerator = enumerator;
            this.recurranceParameters = recurranceParameters;

            #region this.coroutineHost = ...
            // OLD
            //public static CoroutineHost DefaultCoroutineHost;
            //this.coroutineHost = coroutineHost;

            //if (coroutineHost == null)
            //{
            //    IHasCoroutineHost hasCH = behavior.Context as IHasCoroutineHost;
            //    if (hasCH != null) coroutineHost = hasCH.CoroutineHost;
            //}

            //if (coroutineHost == null)
            //{
            //    coroutineHost = DefaultCoroutineHost;
            //}

            //if (coroutineHost == null)
            //{
            //    throw new ArgumentNullException("CoroutineHost must be set by behavior.Context (which implements IHasCoroutineHost), or in BehaviorCoroutine.DefaultCoroutineHost.");
            //}

            #endregion
            
            behavior.StatusChangedForFromTo += OnBehaviorStatusChanged;

            if (behavior.IsRunning)
            {
                StartCoroutine();
            }
        }
        int backlog = 0; // TODO: Attach to child status and when it finishes, decrement backlog and launch another

        #endregion

        #region Construction

        public OldPollingRepeater(IBehavior behavior, RecurranceParameters recurranceParameters = null)
        {
            l.Warn("TODO: Obsolete OldPollingRepeater - get interval support in new Repeater");
            behavior.Parent = this; // TODO - how to automatically set Parents 
            //this.behavior = behavior;

            //if (recurranceParameters == null)
            //{
            //    var hasRP = behavior as IHasStartRecurranceParameters;
            //    if (hasRP != null)
            //    {
            //        recurranceParameters = hasRP.StartRecurranceParameters;
            //    }
            //}
            SetPolledAndRP(behavior, recurranceParameters);
        }
 public IntervalRepeater(IBehavior behavior, RecurranceParameters recurranceParameters = null)
     : base(behavior)
 {
     this.RecurranceParameters = recurranceParameters;
 }