Part of #6
More reliable design of the macro described in #6.
Replace macro expansion with the way described in the design description avoiding api breaking changes.