Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module EventSourcing
- module EventPublisher
- @@subscribers=[]
- def self.add_subscriber(subscriber)
- @@subscribers << subscriber
- end
- def self.delete_subscriber(subscripber)
- @@subscribers.delete(subscriber)
- end
- def self.get_subscribers
- @@subscribers
- end
- def self.publish(event)
- @@subscribers.each do |subscriber|
- subscriber.handle(event) if subscriber.is_subscribet_to? event
- end
- end
- end
- module AggregateRoot
- def initialize
- @events = []
- super()
- end
- def save
- # Persist the entity
- publish_events
- clear_events
- end
- def publish_events()
- @events.each do |event|
- EventSourcing::EventPublisher.publish(event)
- end
- end
- private
- def record_event(event)
- @events << event
- end
- def clear_events
- @events = []
- end
- end
- end
- class Employee
- include EventSourcing::AggregateRoot
- attr_reader :name, :title
- attr_reader :salary
- def initialize( name, title, salary)
- super()
- @name = name
- @title = title
- @salary = salary
- end
- def salary=(new_salary)
- @salary = new_salary
- record_event( SalaryHasChangedEvent.new(self) )
- end
- end
- class SalaryHasChangedEvent
- attr_reader :employee
- def initialize(employee)
- @employee = employee
- end
- end
- class CongratulateEmployeeSubscriber
- def is_subscribet_to?(event)
- event.class == SalaryHasChangedEvent
- end
- def handle(event)
- puts "Cogratulations #{event.employee.name}!!!!"
- end
- end
- EventSourcing::EventPublisher.add_subscriber(CongratulateEmployeeSubscriber.new)
- fred = Employee.new("Fred Flintstone", "Crane Operator", 30000.0)
- fred.salary=35000.0
- fred.save
- barney = Employee.new("Barney Rubble", "Crane Operator", 10000.0)
- barney.save
Add Comment
Please, Sign In to add comment