Sha256: 617b4af644a176e763d7134fca9df6258c47a24a4652669837bca41053125881

Contents?: true

Size: 1.09 KB

Versions: 1

Compression:

Stored size: 1.09 KB

Contents

# frozen_string_literal: true

module Micro
  module Observers

    class Manager
      EMPTY_HASH = {}.freeze

      def self.for(subject)
        new(subject)
      end

      def initialize(subject, list = nil)
        @subject = subject
        @list = (list.kind_of?(Array) ? list : []).flatten.tap(&:compact!)
      end

      def attach(observer, options = EMPTY_HASH)
        if options[:allow_duplication] || @list.none? { |obs, _data| obs == observer }
          @list << [observer, options[:data]]
        end

        self
      end

      def detach(observer)
        @list.delete_if { |obs, _data| obs == observer }

        self
      end

      def call(action: :call)
        @list.each do |observer, data|
          next unless observer.respond_to?(action)

          handler = observer.method(action)

          case handler.arity
          when 2 then handler.call(@subject, data)
          when 1 then handler.call(@subject)
          else raise NotImplementedError
          end
        end

        self
      end

      alias notify call

      private_constant :EMPTY_HASH
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
u-observers-0.2.0 lib/micro/observers/manager.rb