Completely refactor internals. No API changes other than how attribute callbacks receive their arguments and are bound.