btw, I see a lot of boilerplate here.  Probably, we can introduce some decorator to handle this?