[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

RCR: instance_methods(ancestor

Trans

8/24/2008 5:24:00 PM

= Problem

Currently Module#instance_methods (and company) take a single
argument, true or false, as to whether to include all ancestor
methods. I've written enough metacode to come across the need to limit
the search at a particular ancestor. This currently requires code
like:

meths = []
ancestors[0..ancestors.index(FooAncestor)].each do |anc|
meths = meths | anc.instance_methods(false)
end

It would be nice if we could simply say:

instance_methods(FooAncestor)

= Solution

I leave the full solution to more capable C peoples. I imagine it
would not be too difficult however.

= Analysis

This change can be backward compatible. It also eliminates the dreaded
true|false argument, and can be applied to the entire family of
"methods" methods.

T.

1 Answer

James Coglan

8/24/2008 6:06:00 PM

0

[Note: parts of this message were removed to make it a legal post.]

>
>
> It would be nice if we could simply say:
>
> instance_methods(FooAncestor)



You could monkey-patch, if you're into that sort of thing. This maintains
the existing method signature while adding your desired behaviour:

class Module
method = instance_method :instance_methods
define_method :instance_methods do |condition = true|
return method.bind(self).call(condition) unless Module === condition
anc = ancestors
index = anc.index(condition) || -1
anc[0..index].inject([]) { |methods, ancestor|
methods.concat(ancestor.instance_methods(false))
}.uniq
end
end