<lyle / knology.net> wrote in message
news:20030310154111.23290.qmail / webmail1.knology.net...
> All,
>
> We'd like to be able to provide support for a kind of "limited" multiple
> inheritance in SWIG's Ruby module. It is limited in the sense that, since
> Ruby doesn't support MI, we'll obviously never have the case that class
"D"
> is a direct subclass of more than one base class. However, it might be
> useful to provide support for this kind of C++ class structure:

[snip]

> The simplest solution so far seems to be to override Derived's
> #method_missing method, something like this (pseudocode):
>
>     class Derived
>       def method_missing(mth, *args)
>         for each base other than Base1
>           see if this base can handle it
>         end
>         super # call Object#method_missing
>       end
>     end
>
> but I haven't tried to implement this yet.
>
> Can someone else point out the flaws in this, and/or suggest other
> possibilities?

I realize I am way behind on this discussion (no cc's to swig, just swig-dev
of which I'm not a member) but I don't see a definite decision yet.  The
news server at work just ceased feeding comp.lang.ruby (grr) so I only catch
up here at home until they get it fixed.

I just want to indicate that I already use method_missing in my SWIG wrapped
classes for other reasons.
If this is the way you go, I suppose I could alias the old method_missing to
something, then have my new one call the old one when my code falls through.
This just seems like it would be a gotcha though, i.e. you redefine
method_missing and your MI stops working.

>That is still a possibility; the only potential drawback is that (I think)
>you'd have to wrap the non-primary base classes twice, once as a regular
>Ruby Class and once as a Module. Using the previous example, we'd wrap
>Base1, Base2, Base3 and Derived as classes, and Base2 and Base3 as modules,
>hen mix the Base2 and Base3 modules into Derived.

>This is assuming that the developer wants to be able to instantiate Base2
>and Base3 objects directly, use them as bases for other classes, and
>anything else that you'd want to do with a class. If that were *not* the
>case, I guess we could introduce a special directive that says "Wrap this
>class as a Ruby module *only*, and not as a class".

>What do you think?

I hope I'm not missing portions of this thread... I view it through
comp.lang.ruby and the threading is always screwy--(is that due to mail
clients through the ruby-talk mailing list?).  In this case it may be that
half of this is on swig-dev and not here :)

This is certainly better than my original braindead suggestion many months
ago which is to wrap the Base2 etc classes for each subclass who has it as a
secondary superclass.  I'd certainly be happy with the above.  I have a need
for both situations, i.e. when a class should only be wrapped as a module
and when it should be both.

Thanks for working on this one Lyle.  Sorry if I'm behind the 8-ball here
but this is my pet wish for SWIG Ruby.

--
Brett Williams