Hi,

Not sure if this has been mentioned already, but you might also be  
interested in checking out http://rubyforge.org/projects/abstract/

George


On 12 Jul 2007, at 14:32, James Edward Gray II wrote:

> On Jul 12, 2007, at 7:05 AM, Robert Dober wrote:
>
>> On 7/12/07, James Edward Gray II <james / grayproductions.net> wrote:
>>> On Jul 11, 2007, at 5:40 PM, cypher.dp / gmail.com wrote:
>>>
>>> > How do you implement something like the "abstract" keyword in  
>>> Java ?
>>> > Or: Is there a technique to force a subclass to implement a  
>>> special
>>> > method ?
>>>
>>> One way is:
>>>
>>> class Parent
>>>    def abstract_method
>>>      raise NotImplementedError
>>>    end
>>> end
>>>
>>> You may just want to skip this step altogether though, since an
>>> exception toss is the default behavior.
>>
>> Hmm, I would say no, you will be caught by #method_missing one day.
>> It would be interesting why you want to do this?
>
> If someone adds a method_missing() implementation to a child class  
> that accepts messages it shouldn't, there is a bug in that  
> implementation and it needs to be fixed.  Your tests are going to  
> catch that for you.
>
>> For documentation purpose?
>
> That is about the best reason to add the stub, I think.
>
>> If you are looking for warnings or errors for subclasses not
>> implementing the abstract method you will be disappointed at Compile
>> Time [which arguabley does not even exist in 1.8]
>
> class AbtractClass
>   REQUIRED_METHODS = %w[one two three]
>
>   def self.inherited(subclass)
>     REQUIRED_METHODS.each do |m|
>       raise "An implementation of #{m} is required by #{self.class}" \
>         unless subclass.instance_methods.include? m
>     end
>   end
> end
>
> class Broken < AbtractClass
>   def one; end
>   def two; end
> end
> # ~> -:7:in `inherited': An implementation of one is required by  
> Class (RuntimeError)
> # ~> 	from -:5:in `each'
> # ~> 	from -:5:in `inherited'
> # ~> 	from -:12
>
> But don't do that.  ;)
>
> James Edward Gray II
>