Class_extension and module_extension

Just a quick comment about class_extension. In using I've come across
cases where I want the extension to propogate through further
inclusions and cases where I do not. So I think we new two versions,
one for each. Perhapos the propogating version caould be called
module_extension.

Thanks,
T.

This is actually pretty interesting. I'm in the midst of deep meta code
and I have the situation where I'm creating a sort of DSL for building
classes --you know, defining my own attr methods. And then I use that
in a module which is to be included into my class. That way I keep
these DSL methods out of my class (qua class). Eg.

  module MetaDSL
    def foos() @foos ||=[] end
    def metafoo x
       foos << x
       attr_reader "#{x}oo"
    end
  end

  module MetaFoo
    extend MetaDSL
    metafoo :f
  end

  class Foo
    include MetaFoo
  end

The problem is that I actaully want #foos to show up in my class (qua
class) but not metafoo! How's can I achieve that?

In the future there's class_extension, and I suggested
module_extiension too, one for propogating and one not (which is
which?) So a solution would be:

  module MetaDSL
    # lets say class_extension propogates
    class_extension do
      def foos() @foos ||=[] end
    end
    # and module_extension does not
    module_extension do
      def metafoo x
         foos << x
         attr_reader "#{x}oo"
      end
    end
  end

  module MetaFoo
    include MetaDSL
    metafoo :f
  end

But uh oh! Now the two methods can't see each other. Well, maybe we can
fix by including the returned module of each when invoked without a
block:

  module MetaDSL
    class_extension do
      def foos() @foos ||=[] end
    end
    include class_extension

    module_extension do
      def metafoo x
         foos << x
         attr_reader "#{x}oo"
      end
    end
    include module_extension
  end

Will that work? Well, I assume somthing to that effect would. But even
so, now I'm looking at this and thinking it got quite complex, when all
I really want to do is *control visibility*, much like public, private
and protected. But local, single_provision, and propogated (for lack of
better terms).

T.