whole_func_string: function () {
                      var name, params = [], match, ruleset, cond, variadic = false;
                      if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||
                          parserInput.peek(/^[^{]*\}/)) {
                          return;
                      }
  
                      parserInput.save();
  
                      match = parserInput.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/);
                      if (match) {
                          name = match[1];
  
                          var argInfo = this.args(false);
                          params = argInfo.args;
                          variadic = argInfo.variadic;
  
                          // .mixincall("@{a}");
                          // looks a bit like a mixin definition..
                          // also
                          // .mixincall(@a: {rule: set;});
                          // so we have to be nice and restore
                          if (!parserInput.$char(')')) {
                              parserInput.restore('Missing closing \')\'');
                              return;
                          }
  
                          parserInput.commentStore.length = 0;
  
                          if (parserInput.$str('when')) { // Guard
                              cond = expect(parsers.conditions, 'expected condition');
                          }
  
                          ruleset = parsers.block();
  
                          if (ruleset) {
                              parserInput.forget();
                              return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);
                          } else {
                              parserInput.restore();
                          }
                      } else {
                          parserInput.forget();
                      }
                  }
func_code_string: function () {
                      var name, params = [], match, ruleset, cond, variadic = false;
                      if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||
                          parserInput.peek(/^[^{]*\}/)) {
                          return;
                      }
  
                      parserInput.save();
  
                      match = parserInput.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/);
                      if (match) {
                          name = match[1];
  
                          var argInfo = this.args(false);
                          params = argInfo.args;
                          variadic = argInfo.variadic;
  
                          // .mixincall("@{a}");
                          // looks a bit like a mixin definition..
                          // also
                          // .mixincall(@a: {rule: set;});
                          // so we have to be nice and restore
                          if (!parserInput.$char(')')) {
                              parserInput.restore('Missing closing \')\'');
                              return;
                          }
  
                          parserInput.commentStore.length = 0;
  
                          if (parserInput.$str('when')) { // Guard
                              cond = expect(parsers.conditions, 'expected condition');
                          }
  
                          ruleset = parsers.block();
  
                          if (ruleset) {
                              parserInput.forget();
                              return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);
                          } else {
                              parserInput.restore();
                          }
                      } else {
                          parserInput.forget();
                      }
                  }
func_documentation_string: A Mixin definition, with a list of parameters  .rounded (@radius: 2px, @color) { ... }  Until we have a finer grained state-machine, we have to do a look-ahead, to make sure we don't have a mixin call. See the `rule` function for more information.  We start by matching `.rounded (`, and then proceed on to the argument list, which has optional default values. We store the parameters in `params`, with a `value` key, if there is a value, such as in the case of `@radius`.  Once we've got our params list, and a closing `)`, we parse the `{...}` block.