"T. Onoma" <transami@runbox.com> schrieb im Newsbeitrag
news:200408141028.42017.transami@runbox.com...
> You didn't say so in your original post. And as far as I can see you
have
> two modules in your example, too. As you obviously noticed, you need to
> identify those parts that should go into instances and those for the
class
> *somehow*. So having two separate modules is really the simplest way.
Okay, more detail then.
Currently I have a class that can be subclassed to inherit behavior, but I
want to turn that into a mixin module instead. Problem is that the class
has
class methods that need to be inherited too. Can't do that with a module,
so
I had to figure out a way. Of course I could use two *seperate* modules,
as
you say, but then the lib user would have to add two lines of code (an
include and an extend) to get functionality that really belongs together.
So let me ask it this way: I have class behavior and instance behavior
that
needs to encapsulated into a single mixin unit. How to do it?
You probably want this which works with a single (!) module. Ha!
module Foo
class <<self
attr_accessor :foo
end
attr_accessor :bar
def self.append_features(cl)
# need a copy of me to avoid state interference
copy = dup
cls = class<<cl;self;end
copy.singleton_methods.each do |m|
cls.send(:define_method, m, copy.method(m).to_proc)
end
super
end
end
Foo.foo = "Foo.foo"
p Foo.foo
class Bar
include Foo
end
bar = Bar.new
bar.bar = "bar.bar"
p bar.bar
Bar.foo = "Bar.foo"
p Bar.foo
# ensure Foo.foo is unchanged
p Foo.foo
Regards
robert
···
On Saturday 14 August 2004 10:06 am, Robert Klemme wrote: