docs: function () {
                      var name, params = [], match, ruleset, param, value, cond, variadic = false;
                      if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') ||
                          peek(/^[^{]*\}/)) return;
  
                      save();
  
                      if (match = $(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)) {
                          name = match[1];
  
                          do {
                              $(this.comment);
                              if (input.charAt(i) === '.' && $(/^\.{3}/)) {
                                  variadic = true;
                                  params.push({ variadic: true });
                                  break;
                              } else if (param = $(this.entities.variable) || $(this.entities.literal)
                                                                           || $(this.entities.keyword)) {
                                  // Variable
                                  if (param instanceof tree.Variable) {
                                      if ($(':')) {
                                          value = expect(this.expression, 'expected expression');
                                          params.push({ name: param.name, value: value });
                                      } else if ($(/^\.{3}/)) {
                                          params.push({ name: param.name, variadic: true });
                                          variadic = true;
                                          break;
                                      } else {
                                          params.push({ name: param.name });
                                      }
                                  } else {
                                      params.push({ value: param });
                                  }
                              } else {
                                  break;
                              }
                          } while ($(',') || $(';'))
  
                          // .mixincall("@{a}"); 
                          // looks a bit like a mixin definition.. so we have to be nice and restore
                          if (!$(')')) {
                              furthest = i;
                              restore();
                          }
                          
                          $(this.comment);
  
                          if ($(/^when/)) { // Guard
                              cond = expect(this.conditions, 'expected condition');
                          }
  
                          ruleset = $(this.block);
  
                          if (ruleset) {
                              return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);
                          } else {
                              restore();
                          }
                      }
                  }