On May 7, 2007, at 1:31 PM, Joshua Schairbaum wrote:

I'm wanted to make a "global" module that I could include in my
application for some shared code between them.  I've been making
several camping apps and wanted them all to share a helper/partial
that contained the navigation.

I think the root of the "problem" is the way the app modules are loaded into the Markaby rendering context:

  module Views; include Controllers, Helpers end
  class Mab < Markaby::Builder
      include Views
      def tag!(*g,&b)
          h=g[-1]
          [:href,:action,:src].each{|a|(h[a]=self/h[a])rescue 0}
          super
      end
  end

Here's a slightly unnerving hack which seems to solve the problem. You pass it the base module (or symbol of) your Camping app and one or more shared helper modules, and it'll inject them into your Camping app. (Obviously the symbol parameters won't work if you have nested modules...you'll have to pass in the module constant instead...the symbols are just syntactic sugar to echo Camping.goes().)

class TentSteak
  def self.bootstrap(mod_or_sym, *appmods)
@@rootmod = mod_or_sym.instance_of?(Module) ? mod_or_sym : const_get(mod_or_sym.to_s)
    inject appmods
  end
  def self.inject(*mod_or_syms)
@@rootmod.module_eval "class Mab < Markaby::Builder; include # {mod_or_syms.join(', ')}; end"
  end
  def self.view_method_defined?(meth)
    @@rootmod::Mab.method_defined?(meth)
  end
end

Usage is like this:

  Camping.goes :MyApp
  TentSteak.bootstrap :MyApp, :MyHelperModule, :MyOtherHelpers

I'd love to hear if there's a better way to do this injection. Seems pretty hacky. Incidentally, TentSteak is a Camping helper library I've been working on recently. I'll upload it to rubyforge as soon as I get the ugly corners chiseled off and properly tested/ documented....

John

--
"The Internet is not something you just dump something
on.  It's not a big truck.  It's a series of tubes."
 --Senator Ted Stevens, R-AK

John R. Sheets
http://bark.metacasa.net



_______________________________________________
Camping-list mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/camping-list

Reply via email to