[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

private include

T. Onoma

11/28/2004 10:56:00 PM

Is there a simple way to include a module such that all the included methods
are private?

Thanks,
T.


3 Answers

Sam Stephenson

11/28/2004 11:27:00 PM

0

On Mon, 29 Nov 2004 07:56:27 +0900, trans. (T. Onoma)
<transami@runbox.com> wrote:
> Is there a simple way to include a module such that all the included methods
> are private?

If you can change the module definition itself, just add ``private''
before defining any methods.

If not, perhaps this would work:

| class Module
| def privately_include(mod)
| self.class_eval {include(mod)}
| mod.instance_methods.each do |m|
| self.class_eval {private m.to_sym}
| end
| nil
| end
| end

An example:

| irb(main):001:0> module Foo; def bar() end end
| => nil
| irb(main):002:0> class Baz; privately_include Foo end
| => nil
| irb(main):003:0> Baz.new.bar
| NoMethodError: private method `bar' called for #<Baz:0x402d4610>
| from (irb):3

Note that this won't make future public methods defined in the module
private in the including class.

> Thanks,
> T.

Sam


Sam Stephenson

11/28/2004 11:55:00 PM

0

On Sun, 28 Nov 2004 17:26:43 -0600, Sam Stephenson
<sstephenson@gmail.com> wrote:
> If not, perhaps this would work:

Sorry, that was pretty ugly. Make that:

| class Module
| private
| def privately_include(mod)
| self.class_eval do
| include mod
| private *mod.instance_methods
| end
| end
| end

Sam


T. Onoma

11/29/2004 1:57:00 AM

0

On Sunday 28 November 2004 06:26 pm, Sam Stephenson wrote:
| On Mon, 29 Nov 2004 07:56:27 +0900, trans. (T. Onoma)
|
| <transami@runbox.com> wrote:
| > Is there a simple way to include a module such that all the included
| > methods are private?
|
| If you can change the module definition itself, just add ``private''
| before defining any methods.

Nope. It's FileUtils that I want to include.

| If not, perhaps this would work:
| | class Module
| | def privately_include(mod)
| | self.class_eval {include(mod)}
| | mod.instance_methods.each do |m|
| | self.class_eval {private m.to_sym}
| | end
| | nil
| | end
| | end
|

Thanks.

| Note that this won't make future public methods defined in the module
| private in the including class.

Right. Hmm... Module#method_added could do it.

T.