As far as I understand your question, something like this is what you are looking for:
class Class
def mixin_ancestors(include_ancestors=true)
ancestors.take_while {|a| include_ancestors || a != superclass }.
select {|ancestor| ancestor.instance_of?(Module) }
end
end
However, I don't fully understand your testcases: why is SomeModule
listed as an included module of ChildModel
even though it isn't actually included in ChildModel
but in ParentModel
? And conversely, why is Kernel
not listed as an included module, even though it is just as much in the ancestors chain as SomeModule
? And what does the boolean argument to the method mean?
(Note that boolean arguments are always bad design: a method should do exactly one thing. If it takes a boolean argument, it does by definition two things, one if the argument is true, another is the argument is false. Or, if it does only one thing, then this can only mean that it ignores its argument, in which case it shouldn't take it to begin with.)