I was trying to avoid actually making sense of the value / weight behaviour because it should either be

1) weight always defaults to weight +1
2) value always defaults to value + 1

OR
1)  IF value is an integer AND there is no weight of that value already then weight defaults to  value
2) value always defaults to value + 1 (& is resolved after weight so weight only resolves to value when you have explicitly set an integer because that's the only time I think weight should ever resolve to anything other than weight + 1)

If 'next' is required then the logic is wrong.