The art of the metaobject protocol