       choice2 = new Interleave(@pattern1, p2)
       return (new Choice(choice1, choice2)).attrCheck(node)
 
-
+  ###*
+   * A pattern requiring both of its subpatterns to be valid, in the given order
+  ###
   class Group extends Pattern
     constructor: (pattern1, pattern2) ->
       @pattern1 = getPattern pattern1

      p2 = @pattern2.check(node, descend)
      if @pattern2 + "" is "c-idp9392+"
        console.log "tick"
      if p1 instanceof NotAllowed and p2 instanceof NotAllowed
        failed = new Choice(p1, p2)
        return new NotAllowed("choice failed: #{failed}", failed, node)
      if p2.require() instanceof Empty and p1.require() instanceof Empty
        if p1 instanceof Empty
          return p2
        if p2 instanceof Empty
          return p1
        return new Choice(p1, p2)
      if p1 instanceof NotAllowed and @pattern1.require() instanceof Empty
        return new Choice(@pattern1, p2)
      if p2 instanceof NotAllowed and @pattern2.require() instanceof Empty
        return new Choice(p1, @pattern2)
      return new Choice(p1, p2)
    attrCheck: (node) =>
      if @pattern1 instanceof NotAllowed or @pattern1 instanceof Empty

    attrCheck: (node) =>
      return this

  ###*
   * A pattern indicating missing content (end state)
  ###
  class MissingContent extends NotAllowed
    constructor: (@message, @pattern, @childNode, @priority) ->
    toString: =>
