Home - equivalent/simple_listener GitHub Wiki

example 1: Rails

app/models/concerns/generic_listener_concern.rb
module GenericListenerConcern
  extend ActiveSupport::Concern

  included do
    around_save :notify_listeners
  end

  def notify_listeners
    is_create_save   = !persisted?

    if is_create_save
      call_listeners(:before_create)
    else
      call_listeners(:before_update)
    end

    yield

    if is_create_save
      call_listeners(:on_create)
    else
      call_listeners(:on_update)
    end
  end
end
# app/models/membership.rb
class Membership < ActiveRecord::Base
  include SimpleListener
  include GenericListenerConcern
end
# app/listeners/last_moderator_listener.rb
class LastModeratorListener
  def initialize(current_user)
    @current_user
  end

  def on_update(record)
    record.moderator = @current_user
    record.save
  end
end
# app/controllers/memberships_controller.rb
class MembershipsController < ApplicationController
  # ...
  def update
     @membership = Membership.find(:id)
     @membership.add_listener(LastModeratorListener.new(current_user))
     @membership.update(params[:user])
     # ...
  end
end