Sha256: c98387b9588aef83e9f1d6f0038cdad34e530b346b9b70eeae76973182f354cd

Contents?: true

Size: 1007 Bytes

Versions: 5

Compression:

Stored size: 1007 Bytes

Contents

module Rubydora
  ##
  # This is an attempt to implement an Array-like
  # object that calls a method after data is modified
  class ArrayWithCallback < Array
    ##
    # FIXME: It would be nice to use Rubydora::Callbacks here,
    # however, this method requires instance-level callbacks

    [:<<, :collect!, :map!, :compact!, :concat, :delete, :delete_at, :delete_if, :pop, :push, :reject!, :replace, :select!, :[]=, :slice!, :uniq! ].each do |method|
      class_eval <<-RUBY
        def #{method.to_s} *args, &blk
          old = self.dup
          res = super(*args, &blk)
          call_on_change({:+ => self - old, :- => old - self})
          res
        end
      RUBY
    end

    # duck-typing Rubydora::Callbacks @hooks and accessor
    def on_change
      @hooks ||= {}
      @hooks[:on_change] ||= []
    end

    # duck-typing Rubydora::Callbacks call_* methods
    def call_on_change(changes = {})
      self.on_change.each do |h|
        h.call(self, changes)
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
rubydora-2.2.0 lib/rubydora/array_with_callback.rb
rubydora-2.1.0 lib/rubydora/array_with_callback.rb
rubydora-2.0.0 lib/rubydora/array_with_callback.rb
rubydora-1.9.1 lib/rubydora/array_with_callback.rb
rubydora-1.9.0 lib/rubydora/array_with_callback.rb