/// <summary>
        /// Get an assignment designed to match a given crew member.
        /// </summary>
        /// <param name="crew"></param>
        /// <returns></returns>
        public static Assignment ForCrew(ProtoCrewMember crew)
        {
            if (crew == null)
            {
                return(Empty);
            }
            List <AssignmentNode> nodes = new List <AssignmentNode>(3);

            nodes.Add(AssignmentNode.ByName(crew));
            nodes.Add(AssignmentNode.ByProfession(crew));
            nodes.Add(AssignmentNode.ByType(crew));
            return(new Assignment(nodes));
        }
        /// <summary>
        /// Pops off the head of the assignment node list and returns it (null if none left).
        /// </summary>
        /// <returns></returns>
        private AssignmentNode Pop()
        {
            if (nodes.Count == 0)
            {
                return(null);
            }
            AssignmentNode node = nodes[0];

            if (node.Type != AssignmentType.Empty)
            {
                nodes.RemoveAt(0);
            }
            return(node);
        }
        public override bool Equals(object obj)
        {
            if (object.ReferenceEquals(this, obj))
            {
                return(true);
            }
            AssignmentNode other = obj as AssignmentNode;

            if (other == null)
            {
                return(false);
            }
            return((Type == other.Type) && (value == other.value));
        }
        public override string ToString()
        {
            if (nodes.Count == 0)
            {
                return(string.Empty);
            }
            if (nodes[0].Type == AssignmentType.Empty)
            {
                return(nodes[0].ToString());
            }
            StringBuilder builder = new StringBuilder(nodes[0].ToString());

            for (int index = 1; index < nodes.Count; ++index)
            {
                AssignmentNode node = nodes[index];
                builder.Append("|").Append(node.ToString());
                if (node.Type == AssignmentType.Empty)
                {
                    break;
                }
            }
            return(builder.ToString());
        }
        /// <summary>
        /// Parse an assignment from a text string.
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        public static Assignment Parse(string text)
        {
            List <AssignmentNode> nodes = new List <AssignmentNode>();

            if (text != null)
            {
                text = text.Trim();
                string[] tokens = text.Split('|');
                foreach (string token in tokens)
                {
                    AssignmentNode node = AssignmentNode.Parse(token);
                    if (node == null)
                    {
                        break;
                    }
                    nodes.Add(node);
                    if (node.Type == AssignmentType.Empty)
                    {
                        break;
                    }
                }
            }
            return((nodes.Count == 0) ? null : new Assignment(nodes));
        }