reimplement more efficient updating. could still be much more efficient -- consider using observe statements entirely