better l/rvalue handling, simpler, works