class Encrypter

  # Je nutné zadat seznam atributů,
  # které by se měly v databázi ukládat zašifrované 
  def initialize(attrs_to_manage)
    @attrs_to_manage = attrs_to_manage
  end

  # Před uložení nebo aktualizací zašifruje pole pomocí 
  # super bezpečnou posuvnou šifrou
  def before_save(model)
    @attrs_to_manage.each do |field|
      model[field].tr!("a-z", "b-za")
    end
  end

  # Po uložení pole zase dešifruje 
  def after_save(model)
    @attrs_to_manage.each do |field|
      model[field].tr!("b-za", "a-z")
    end
  end

  # To samé provede i po vyhledání stávajícího záznamu
  alias_method :after_find, :after_save
end


class ActiveRecord::Base
  def self.encrypt(*attr_names)
    encrypter = Encrypter.new(attr_names)

    before_save encrypter
    after_save  encrypter
    after_find  encrypter

    define_method(:after_find) { }
  end
end


class Order < ActiveRecord::Base
  encrypt(:name, :email)
end


o = Order.new
o.name = "Jakub Dunda"
o.address = "123 The Street"
o.email = "jakub@nekde.cz"
o.save
puts o.name

o = Order.find(o.id)
puts o.name
