private void evaluateActions()
    {
        List <DecisionInfoObject> debugText = new List <DecisionInfoObject>();

        //print("****EVALUATE****");
        dirty = false;
        PriorityQueue    endeavourQueue  = new PriorityQueue();
        List <Endeavour> staleEndeavours = new List <Endeavour>();

        //print("\tCurrent Endeavours");
        foreach (Endeavour action in currentEndeavours)
        {
            if (action.isStale())
            {
                //print("\t\tstale: " + action.getName());
                action.stopExecution();
                staleEndeavours.Add(action);
            }
            else
            {
                //print("\t\t++" + action.getName());
                availableEndeavours.Add(action);
            }
        }
        //print("\tAvailable Endeavours");
        foreach (Endeavour action in availableEndeavours)
        {
            if (action.isStale())
            {
                //print("\t\t--" + action.getName());
                staleEndeavours.Add(action);
            }
            else
            {
                //print("\t\t++" + action.getName());
                endeavourQueue.Enqueue(action);
            }
        }

        foreach (Endeavour action in staleEndeavours)
        {
            //print("remove: " + action.getName());
            availableEndeavours.Remove(action);
            currentEndeavours.Remove(action);
        }
        HashSet <Endeavour> proposedEndeavours = new HashSet <Endeavour>();

        Dictionary <System.Type, int> componentMap = getComponentUsageMap();

#if UNITY_EDITOR
        bool  maxPrioritySet   = false;
        float localMaxPriority = 0;
        float localMinPriority = 0;
#endif

        while (endeavourQueue.Count > 0)
        {
            Endeavour action = (Endeavour)endeavourQueue.Dequeue();
            if (action.isReady(componentMap))
            {
#if UNITY_EDITOR
                if (debug)
                {
                    float priority = action.getPriority();
                    if (!maxPrioritySet)
                    {
                        maxPrioritySet   = true;
                        localMaxPriority = priority;
                        localMinPriority = priority;
                    }
                    else
                    {
                        if (priority > localMaxPriority)
                        {
                            localMaxPriority = priority;
                        }
                        if (priority < localMinPriority)
                        {
                            localMinPriority = priority;
                        }
                    }
                    debugText.Add(new DecisionInfoObject(action.getName(), action.getParent().getName(), priority, true));
                }
#endif
                if (proposedEndeavours.Contains(action))
                {
                    Debug.LogError("action already proposed!!!");
                }
                proposedEndeavours.Add(action);
                availableEndeavours.Remove(action);
            }
            else
            {
#if UNITY_EDITOR
                if (debug)
                {
                    float priority = action.getPriority();
                    if (!maxPrioritySet)
                    {
                        maxPrioritySet   = true;
                        localMaxPriority = priority;
                        localMinPriority = priority;
                    }
                    else
                    {
                        if (priority > localMaxPriority)
                        {
                            localMaxPriority = priority;
                        }
                        if (priority < localMinPriority)
                        {
                            localMinPriority = priority;
                        }
                    }
                    debugText.Add(new DecisionInfoObject(action.getName(), action.getParent().getName(), priority, false));
                }
#endif
                if (action.active)
                {
                    action.stopExecution();
                }
            }
        }

        // All previous actions MUST be stopped before we start the new ones
        foreach (Endeavour action in proposedEndeavours)
        {
            if (!action.active)
            {
                action.execute();
            }
        }

        currentEndeavours = proposedEndeavours;
#if UNITY_EDITOR
        if (debug)
        {
            lines       = debugText;
            maxPriority = (Mathf.Abs(localMaxPriority) > Mathf.Abs(localMinPriority)) ? Mathf.Abs(localMaxPriority) : Mathf.Abs(localMinPriority);
            if (shouldAlphabetize)
            {
                alphabetize();
            }
        }
#endif
    }