Skip to content

LukeHammond/auto-observer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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
    

About

Create callbacks and observers automagically

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages