Sha256: eb34918a9b188c0351c2e97cba4223b7ec726912839b1f87f661f32a28a9d1b1

Contents?: true

Size: 779 Bytes

Versions: 9

Compression:

Stored size: 779 Bytes

Contents

module Hyperstack
  module Internal
    module Store
      class Observable
        def initialize(value, on_change = nil, &block)
          @value = value
          @on_change = on_change || block
        end

        def method_missing(method_sym, *args, &block)
          @value.send(method_sym, *args, &block).tap { |result| @on_change.call @value }
        end

        def respond_to?(method, *args)
          if [:call, :to_proc].include? method
            true
          else
            @value.respond_to? method, *args
          end
        end

        def call(new_value)
          @on_change.call new_value
          @value = new_value
        end

        def to_proc
          lambda { |arg = @value| @on_change.call arg }
        end
      end
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
hyper-store-1.0.alpha1.8 lib/hyperstack/internal/store/observable.rb
hyper-store-1.0.alpha1.7 lib/hyperstack/internal/store/observable.rb
hyper-store-1.0.alpha1.6 lib/hyperstack/internal/store/observable.rb
hyper-store-1.0.alpha1.5 lib/hyperstack/internal/store/observable.rb
hyper-store-1.0.alpha1.4 lib/hyperstack/internal/store/observable.rb
hyper-store-1.0.alpha1.3 lib/hyperstack/internal/store/observable.rb
hyper-store-1.0.alpha1.2 lib/hyperstack/internal/store/observable.rb
hyper-store-1.0.alpha1.1 lib/hyperstack/internal/store/observable.rb
hyper-store-1.0.alpha1 lib/hyperstack/internal/store/observable.rb