*laughs* Then I must've accidentally implemented a metaclass that does all my OO book-keeping for me. All my mutators are defined using closures over an array data structure whose reference is blessed. So, if I wanted to add logging to all mutators, I change the way the mutators are created. (In fact, I do this on a regular basis.)

My baseclass gives me access to doing things during:

Object instantiation

Mutator access

Attribute definition

Object initialization

What other actions do I need to provide traps for?

------We are the carpenters and bricklayers of the Information Age.

The idea is a little like C++ templates, except not quite so brain-meltingly complicated. -- TheDamian, Exegesis 6

Please remember that I'm crufty and crochety. All opinions are purely mine and all code is untested, unless otherwise specified.

Then I must've accidentally implemented a metaclass that does all my OO book-keeping for me.

Me too ;-)

However, it's nice to work in a language where you don't have to reinvent this wheel by yourself. With metaclasses you can do this sort of thing for all classes - rather than just the ones you have had the foresight to add a flexible base class to.