make a smarter set function that can be used lazily

perhaps not efficiently, but lets get things working first.

close #72