in reply to OO design: abstract class or can()?

I use can() when I don't have a base class and the method involved doesn't get called all that much.

If I have a base class I'd just put a no-op method in there.

Alternatively you can also demand that conforming classes provide the no-op method if they don't need that functionality (and possibly provide an "empty" base class for convenience). That way you don't have to inherit from the base class, you just need to have that method defined. Typing sub noop {} isn't that much work, after all.