A modest presenter

modest_presenter is a fairly simple base class for objects that you want to act as a Presenter for an arbitrary templating language. It should be fairly templating language agnostic–though the supplied example works in ERB.

I extracted this from a couple of projects where I’ve found myself writing this very same thing.

Example

Person = Struct.new(:first_name, :last_name, :age)
InsanePerson = Class.new(Person)
Nerd = Class.new(Person)

evan = Nerd.new("Evan", "Light", 38)
ed = Nerd.new("Ed", "Kim", 27)
# Seems a bit generous calling this guy a Person
w = InsanePerson.new("George W.", "Bush", 66)

class PersonPresenter < ModestPresenters::ModestPresenter
  def name
    "#{first_name} #{last_name}"
  end

  def title
  end
end

evan = Nerd.new("Evan", "Light", 38)
ed = Nerd.new("Ed", "Kim", 27)

# Seems a bit generous calling this guy a Person
w = InsanePerson.new("George W.", "Bush", 66)

class PersonPresenter < ModestPresenters::ModestPresenter
  def name
    "#{first_name} #{last_name}"
  end

  def title
  end
end

class NerdPresenter < PersonPresenter
  def name
    "#{super} is a nerd."
  end
end

class InsanePersonPresenter < PersonPresenter
  def name
    "#{super} wastes oxygen better used by nerds."
  end

  def title
    "President "
  end
end

def present(model, context, &block)
  Object.const_get("#{model.class}Presenter")
        .new(model, context)
        .present(&block)
end

people = [evan, ed, w]

ERB_TEMPLATE = <<-ERB
  <ul>
    <% people.each do |person| %>
      <% present(person, self) do %>
        <li>
          <%= title %><%= name %>
        </li>
      <% end %>
    <% end %>
  </ul>
  <p>Yes, only insane people are President</p>
ERB

require 'erb'
puts ERB.new(ERB_TEMPLATE).result(binding)

# OUTPUTS:
# <ul>
#   <li>
#     Evan Light is a nerd.
#   </li>
#   <li>
#     Ed Kim is a nerd.
#   </li>
#   <li>
#     President George W. Bush wastes oxygen better used by nerds.
#   </li>
# </ul>
# <p>Yes, only insane people are President</p>

Copyright © 2012 Evan Light. MIT Licensed.