The purpose of this project it to examine how callbacks and observers can be created in a convenient re-usable form.
-
Add Callbacks with Observing for certain operations
require 'auto-observer' class Client include AutoObserver attr_accessor :before_visit, :after_visit auto_observer_callbacks :tickle, :only => [:after, :before] def tickle "giggle" end before_tickle :pre_tickle_processing after_tickle :post_tickle_processing def before_visit @before_visit ||= [ ] end def after_visit @after_visit ||= [ ] end def pre_tickle_processing before_visit << :pre_tickle_processing end def post_tickle_processing after_visit << :post_tickle_processing end include AutoObserver::AliasMethodBind end
This generates before_tickle, and after_tickle class methods that wrap your tickle instance method by wrapping define_model_callback with auto_observer_callbacks class helper.
This also initializes Client with observing functionality, hooking up notifications to observer classes that are registered with this Class.
The include AutoObserver::AliasMethodBind alias_method_chains each of the callback methods.
-
Observer registration
class ClientObserver < ActiveModel::Observer def before_tickle(client) client.before_visit << :before_tickle end end class AnotherClientObserver < ActiveModel::Observer observe :client def before_tickle(client) client.before_visit << :before_another_tickle end def after_tickle(client) client.after_visit << :after_another_tickle end end
-
Register with Client and initialize
Client.observers = :client_observer, :another_client_observer Client.instantiate_observers
-
In use
client = Client.new client.before_visit == [] #=> true client.after_visit == [] #=> true client.tickle #=> "giggle" client.before_visit == [ :before_tickle, :before_another_tickle, :pre_tickle_processing ] #=> true client.after_visit == [ :post_tickle_processing, :after_another_tickle ] #=> true