Sha256: aa0c5c70c450596106168956a4b42288789ed87e3fc8ab5f0d89437338202e1a

Contents?: true

Size: 1.98 KB

Versions: 4

Compression:

Stored size: 1.98 KB

Contents

module Cloudfuji
  class Data #:nodoc:
    @@observers = []

    class << self
      def add_observer(observer)
        puts "Subscribing #{observer} to Cloudfuji data calls"
        @@observers << observer
      end

      # Returns an array of the unique instance methods defined
      # for all observers, except #catch_all
      def observed_events
        if Cloudfuji::Platform.on_cloudfuji?
          @@observers.map {|observer|
            observer.class.instance_methods - Cloudfuji::EventObserver.instance_methods
          }.flatten.uniq - [:catch_all]
        else
          # Return some dummy events if in development
          %w(dummy_event app_claimed app_destroyed user_added email_opened).map(&:to_sym)
        end
      end

      def fire(data, event)
        puts "Cloudfuji Hooks Firing #{event} with => #{data.inspect}"

        halted = false
        # Test if each observer responds to the named event, or #catch_all
        [event, :catch_all].each do |method|
          @@observers.each do |observer|
            # Process observer if event propagation isn't halted,
            # or we are trying the #catch_all method
            # (All #catch_all methods should be processed regardless of
            #  halted status)
            if !halted || method == :catch_all
              puts "#{observer}.respond_to?(#{method}) => #{observer.respond_to?(method)}"

              if observer.respond_to?(method)
                # Make a copy of the data so it's not mutated as the events
                # pass through the observers
                observer.instance_variable_set("@params", data.dup)

                result = observer.send(method)

                # Allow an observer to halt event propagation for
                # other named event methods
                if result == :halt
                  puts "Observer #{observer} halted event propagation"
                  halted = true
                end
              end
            end
          end
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
cloudfuji-0.0.46 lib/cloudfuji/data.rb
cloudfuji-0.0.45 lib/cloudfuji/data.rb
cloudfuji-0.0.44 lib/cloudfuji/data.rb
cloudfuji-0.0.43 lib/cloudfuji/data.rb