Sha256: 4e1b4adbbd72fce2b215011f997891a444a987deca954bafb9130901e3841e61

Contents?: true

Size: 1.84 KB

Versions: 34

Compression:

Stored size: 1.84 KB

Contents

module Cuboid
module Support
module Mixins

# Provides a flexible way to make any object observable for multiple events.
#
# The observable classes use:
#
#    * `notify_<event>( *args )`
#
# to notify observers of events.
#
# The observers request notifications using:
#
#    * `observable.<event>( &block )`
#
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
module Observable
    include UI::Output
    include Utilities

    include MonitorMixin

    def self.included( base )
        base.extend ClassMethods
    end

    module ClassMethods
        def advertise( *ad_events )
            ad_events.each do |event|
                define_method event do |&block|
                    add_observer( event, &block )
                end

                define_method "notify_#{event}" do |*args|
                    notify_observers( event, *args )
                end

                private "notify_#{event}"
            end

            nil
        end
    end

    def initialize
        super

        @__observers = {}
    end

    private

    def observers
        @__observers
    end

    def add_observer( event, &block )
        fail ArgumentError, 'Missing block' if !block
        synchronize do
            observers_for( event ) << block
        end

        self
    end

    def notify_observers( event, *args )
        synchronize do
            observers_for( event ).each do |block|
                exception_jail( false ) { block.call( *args ) }
            end
        end

        nil
    end

    def dup_observers
        observers.inject({}) { |h, (k, v)| h[k] = v.dup; h }
    end

    def set_observers( obs )
        @__observers = obs
    end

    def observers_for( event )
        observers[event.to_sym] ||= []
    end

    def clear_observers
        synchronize do
            observers.clear
        end
    end

end

end
end
end

Version data entries

34 entries across 34 versions & 1 rubygems

Version Path
cuboid-0.2.13 lib/cuboid/support/mixins/observable.rb
cuboid-0.2.12 lib/cuboid/support/mixins/observable.rb
cuboid-0.2.11 lib/cuboid/support/mixins/observable.rb
cuboid-0.2.10 lib/cuboid/support/mixins/observable.rb
cuboid-0.2.9 lib/cuboid/support/mixins/observable.rb
cuboid-0.2.8 lib/cuboid/support/mixins/observable.rb
cuboid-0.2.7 lib/cuboid/support/mixins/observable.rb
cuboid-0.2.6 lib/cuboid/support/mixins/observable.rb
cuboid-0.2.5 lib/cuboid/support/mixins/observable.rb
cuboid-0.2.4.2 lib/cuboid/support/mixins/observable.rb
cuboid-0.2.4.1 lib/cuboid/support/mixins/observable.rb
cuboid-0.2.4 lib/cuboid/support/mixins/observable.rb
cuboid-0.2.3 lib/cuboid/support/mixins/observable.rb
cuboid-0.2.2 lib/cuboid/support/mixins/observable.rb
cuboid-0.2.1 lib/cuboid/support/mixins/observable.rb
cuboid-0.2 lib/cuboid/support/mixins/observable.rb
cuboid-0.1.9.1 lib/cuboid/support/mixins/observable.rb
cuboid-0.1.9 lib/cuboid/support/mixins/observable.rb
cuboid-0.1.8 lib/cuboid/support/mixins/observable.rb
cuboid-0.1.7 lib/cuboid/support/mixins/observable.rb