[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Enforce implementation of Module method

Paul

12/13/2007 10:39:00 PM

Let's say I have the following module:

------------------------
module Parenting

def add_child(a_child)
self.children.push(a_child)
end

def delete_child(a_child)
self.children.delete(a_child)
end

def children
# need to implement
end

end
------------------------

Is there a way to enforce that the 'children' method is implemented in
any class which includes this module? Or do I simply rely on a
commenting convention, as above?
4 Answers

Ken Bloom

12/14/2007 12:31:00 AM

0

On Thu, 13 Dec 2007 14:38:34 -0800, Paul wrote:

> Let's say I have the following module:
>
> ------------------------
> module Parenting
>
> def add_child(a_child)
> self.children.push(a_child)
> end
>
> def delete_child(a_child)
> self.children.delete(a_child)
> end
>
> def children
> # need to implement
> end
>
> end
> ------------------------
>
> Is there a way to enforce that the 'children' method is implemented in
> any class which includes this module? Or do I simply rely on a
> commenting convention, as above?

It may be the more ruby way to rely on the commenting convention (there's
no need to define the children method at all in Parenting, just comment
somewhere that it needs to be implemented.)

But if checking is really a must, then you can check from
Parenting.included as follows:

module Parenting
def self.included klass
raise NoMethodError, "#{klass} must define #children" unless
klass.method_defined? :children
end
end



--
Ken (Chanoch) Bloom. PhD candidate. Linguistic Cognition Laboratory.
Department of Computer Science. Illinois Institute of Technology.
http://www.iit.edu...

Phrogz

12/14/2007 12:48:00 AM

0

On Dec 13, 3:38 pm, Paul <pdavi...@gmail.com> wrote:
> Let's say I have the following module:
>
> ------------------------
> module Parenting
>
> def add_child(a_child)
> self.children.push(a_child)
> end
>
> def delete_child(a_child)
> self.children.delete(a_child)
> end
>
> def children
> # need to implement
> end
>
> end
> ------------------------
>
> Is there a way to enforce that the 'children' method is implemented in
> any class which includes this module? Or do I simply rely on a
> commenting convention, as above?

module Parenting
def children
raise "OOPS!" #Better error message here
end
end

If a class defines that method, it will shadow the module method. As
long as the class method doesn't try to call super, you should be good
to go.

Gareth Adams

12/14/2007 2:59:00 PM

0

Phrogz <phrogz <at> mac.com> writes:
> module Parenting
> def children
> raise "OOPS!" #Better error message here
> end
> end
>
> If a class defines that method, it will shadow the module method. As
> long as the class method doesn't try to call super, you should be good
> to go.

And of course, there's a rather handy NotImplementedError class just sat there
in Ruby code if you want to use it.


Rob Biedenharn

12/14/2007 3:19:00 PM

0

On Dec 14, 2007, at 9:58 AM, Gareth Adams wrote:
> Phrogz <phrogz <at> mac.com> writes:
>> module Parenting
>> def children
>> raise "OOPS!" #Better error message here
>> end
>> end
>>
>> If a class defines that method, it will shadow the module method. As
>> long as the class method doesn't try to call super, you should be
>> good
>> to go.
>
> And of course, there's a rather handy NotImplementedError class just
> sat there
> in Ruby code if you want to use it.

If you simply don't define Parenting#children, you'll get a
NoMethodError. Isn't that good enough?

-Rob

Rob Biedenharn http://agileconsult...
Rob@AgileConsultingLLC.com