module Basepack::Renderable::ClassMethods

Public Instance Methods

render(name = nil, options = {}, &rendering_block) click to toggle source
# File lib/basepack/renderable.rb, line 6
def render(name = nil, options = {}, &rendering_block)
  if name.blank?
    render = "render"
    content = options[:content] || "content"
  else
    render = "render_#{name}"
    content = options[:content] || "content_for_#{name}"
  end

  var = "@#{content}".to_sym
  render_bang = "#{render}!"

  define_method content do |&block|
    # hack - view.capture doesn't work for Haml if not called on block with original binding
    params = block.parameters
    if params.present? and params.last[0] == :block
      instance_variable_set(var, [block, eval("proc {|c, s, a, b| c.(s, *a, &b)}", block.binding)])
    else
      instance_variable_set(var, block)
    end
  end

  define_method render_bang, &rendering_block

  define_method render do |*args, &block|
    if cont_block = instance_variable_get(var)
      if cont_block.is_a? Array
        view.capture(cont_block[0], self, args, block, &cont_block[1])
      else
        view.capture(self, *args, &cont_block)
      end
    else
      send(render_bang, *args, &block)
    end
  end
end