Okay, this is hackish as hell, but seems to work fine in 1.9 too:
diff --git a/lib/tilt.rb b/lib/tilt.rb
index e61efe9..4ea328b 100644
--- a/lib/tilt.rb
+++ b/lib/tilt.rb
@@ -188,7 +188,7 @@ module Tilt
if scope.respond_to?(method_name)
scope.send(method_name, locals, &block)
else
- compile_template_method(method_name, locals)
+ compile_template_method(scope.class, method_name, locals)
scope.send(method_name, locals, &block)
end
else
@@ -279,18 +279,51 @@ module Tilt
digest = Digest::MD5.hexdigest(parts.join(':'))
"__tilt_#{digest}"
end
-
- def compile_template_method(method_name, locals)
- source, offset = precompiled(locals)
- offset += 1
- CompileSite.module_eval <<-RUBY, eval_file, line - offset
- def #{method_name}(locals)
- #{source}
- end
- RUBY
-
- ObjectSpace.define_finalizer self,
- Template.compiled_template_method_remover(CompileSite, method_name)
+
+ if RUBY_VERSION < '1.9'
+ def compile_template_method(klass, method_name, locals)
+ source, offset = precompiled(locals)
+ offset += 2
+
+ klass.class_eval <<-RUBY, eval_file, line - offset
+ ::Tilt::CompileSite.class_eval do
+ def #{method_name}(locals)
+ #{source}
+ end
+ end
+ RUBY
+
+ ObjectSpace.define_finalizer self,
+ Template.compiled_template_method_remover(CompileSite, method_name)
+ end
+ else
+ def compile_template_method(klass, method_name, locals)
+ source, offset = precompiled(locals)
+ definer = "__tilt_definer_#{rand.to_s[2..-1]}"
+ offset += 3
+
+ klass.class_eval <<-RUBY, eval_file, line - offset
+ def self.#{definer}
+ ::Tilt::CompileSite.send(:define_method,
#{method_name.inspect}) do |locals, &blk|
+ Thread.current[:tilt_blk] = blk
+ #{source}
+ end
+ end
+
+ #{definer} do |*a|
+ if blk = Thread.current[:tilt_blk]
+ blk.call(*a)
+ else
+ raise LocalJumpError, "no block given"
+ end
+ end
+
+ class << self; undef #{definer} end
+ RUBY
+
+ ObjectSpace.define_finalizer self,
+ Template.compiled_template_method_remover(CompileSite, method_name)
+ end
end
def self.compiled_template_method_remover(site, method_name)
// Magnus Holm