On Mar 20, 2009, at 09:37 , Robert Klemme wrote:

> On 20.03.2009 17:22, matt neuburg wrote:
>> Howdy. I am a class. There are certain rules for what you are  
>> supposed
>> to do when you subclass me, so as a sanity check I wish to introspect
>> your subclass to make sure it's obeying the contract.
>> However, my problem is that self.inherited is called too early.
>> class C # this is me
>> def self.inherited(p)
>>  #whatever
>>  super
>> end
>> end
>> class B < C # this is you
>> # C's self.inherited is called right here
>> def yourFirstMethod
>>  # etc.
>> end
>> end
>> So I can't, in my self.inherited, ask about what methods you have
>> defined, because you haven't defined them yet. This must have come up
>> before; is there an easy solution? Thx - m.
>
> Even after the class definition methods can be added.  You could  
> catch that with method_added but if you require a minimum set of  
> methods to be defined before class is used (e.g. instantiated) this  
> will be difficult to track.  One option would be to define method  
> initialize in your class and do the check there.  But this is still  
> fragile because it might not be guaranteed that sub classes invoke  
> it from their initialize...
>
> Another option would be to override the sub class's method "new" so  
> you can do the check there.  This might be a bit more robust but  
> even "new" can be overridden by subclasses (although it isn't  
> generally).
>
> I'd probably just omit the check.  If any of your superclass methods  
> invokes a method that is not defined you'll see this at runtime  
> anyway.

I agree with this in general for Matt's particular problem. The  
smalltalk pattern of defining all contracted methods and having them  
raise SubclassResponsibility is a good one to use in this situation.

BUT... There have been many times where I've wanted a "class closed"  
hook to go along with inherited (essentially a "class opened" hook).  
Having both makes it very easy for me to do lots of things with my  
language tools. I can instrument added methods quite easily with that  
mechanism. It'd be nice to have this extra hook.