class Address # Our custom, embedded-value type
  accessor :address => String
  accessor :address_2 => String
  accessor :city => String
  accessor :state => String
  accessor :zip_code => String

  orm.map_type do |signature, types|
    signature.from [self]
    signature.typecast_left method(:__load__)
    signature.to [types.string, types.string, types.string, types.string, types.string]
    signature.typecast_right method(:__dump__)
  end
end

class Zoo
  accessor :id => Integer
  accessor :name => String
  accessor :address => Address

  orm.map(self, "zoos") do |zoos, type|
    zoos.field :id,      type.serial
    zoos.field :name,    type.string(200)
    zoos.field :address, type.string(200, "address_address_1"),
                         type.string(100, "address_address_2"),
                         type.string(100, "address_city"),
                         type.string(50, "address_state"),
                         type.string(50, "address_zip_code")
  end
end