public override bool Evaluate()
        {
            // Drill down to a single POSPhrase
            List <IParsedPhrase> unmatched = new List <IParsedPhrase>(matcher.Unmatched);
            IParsedPhrase        input     = matcher.Input;

            while (!input.IsLeaf)
            {
                GroupPhrase groupPhrase = new GroupPhrase(input);
                unmatched.InsertRange(0, groupPhrase.GetRange(1));
                input = groupPhrase.GetBranch(0);
            }

            List <IContent> elements = matcher.Context.LookupDefaulted <List <IContent> >(name, new List <IContent>());

            elements.Add(new Word(input.Text));

            Context eaten;

            if (needRemoval)
            {
                eaten = new Context(matcher.Context, matcher.Context.Contents.GetRange(1, matcher.Context.Contents.Count - 1));
            }
            else
            {
                eaten = new Context(matcher.Context, matcher.Context.Contents);
            }
            eaten.Map.Add(name, elements);

            // Continue matcher
            if (unmatched.Count == 0)
            {
                if (eaten.Contents.Count == 0 || Matcher.IsRemainderOptional(eaten.Contents))
                {
                    matcher.Success.Continue(eaten, matcher.Failure);
                }
                else
                {
                    matcher.Failure.Fail("Ran out of input after *.", matcher.Success);
                }
            }
            else
            {
                // This matcher is for StarEater to eat another
                Matcher clone = (Matcher)matcher.Clone();
                clone.Context   = eaten;
                clone.Input     = unmatched[0];
                clone.Unmatched = unmatched.GetRange(1, unmatched.Count - 1);

                StarEater eater = new StarEater(coderack, salience, clone, name, false);

                if (eaten.Contents.Count == 0)
                {
                    // Just add ourselves again
                    coderack.AddCodelet(eater, "Evaluate empty");
                }
                else
                {
                    Matcher.MatchAgainst(salience, eaten, clone.Input, clone.Unmatched, matcher.Success, eater);
                }
            }

            return(true);
        }