Design Patterns Ruby

module Observable
  def initialize
    @observers=[]
  end
  def add_observer(&observer)
    @observers << observer
  end
  def delete_observer(observer)
    @observers.delete(observer)
  end
  def notify_observers
    @observers.each do |observer|
      observer.call(self)
    end
  end
end
class Employee
  include Observable
  attr_accessor :name, :title, :salary
  def initialize( name, title, salary )
    super()
    @name = name
    @title = title
    @salary = salary
  end
  def salary=(new_salary)
    @salary = new_salary
    notify_observers
  end
end
fred = Employee.new('Fred', 'Crane Operator', 30000)
fred.add_observer do |changed_employee|
    puts("Cut a new check for #{changed_employee.name}!")
    puts("His salary is now #{changed_employee.salary}!")
end