    # File lib/rbot/messagemapper.rb, line 448
        def items=(str)
          raise ArgumentError, "template #{str.inspect} should be a String" unless str.kind_of?(String)

          # split and convert ':xyz' to symbols
          items = str.strip.split(/\]?\s+\[?|\]?$/).collect { |c|
            # there might be extra (non-alphanumeric) stuff (e.g. punctuation) after the symbol name
            if /^(:|\*)(\w+)(.*)/ =~ c
              sym = ($1 == ':' ) ? $2.intern : "*#{$2}".intern
              if $3.empty?
                sym
              else
                [sym, $3]
              end
            else
              c
            end
          }.flatten
          @items = items

          raise ArgumentError, "Illegal template -- first component cannot be dynamic: #{str.inspect}" if @items.first.kind_of? Symbol

          raise ArgumentError, "Illegal template -- first component cannot be optional: #{str.inspect}" if @items.first =~ /\[|\]/

          # Verify uniqueness of each component.
          @items.inject({}) do |seen, item|
            if item.kind_of? Symbol
              # We must remove the initial * when present,
              # because the parameters hash will intern both :item and *item as :item
              it = item.to_s.sub(/^\*/,"").intern
              raise ArgumentError, "Illegal template -- duplicate item #{it} in #{str.inspect}" if seen.key? it
              seen[it] = true
            end
            seen
          end
        end