motion/core/kvo.rb in bubble-wrap-1.4.0 vs motion/core/kvo.rb in bubble-wrap-1.5.0.rc1

- old
+ new

@@ -19,16 +19,30 @@ module BubbleWrap module KVO COLLECTION_OPERATIONS = [ NSKeyValueChangeInsertion, NSKeyValueChangeRemoval, NSKeyValueChangeReplacement ] DEFAULT_OPTIONS = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld - def observe(target, key_path, &block) + def observe(*arguments, &block) + unless [1,2].include?(arguments.length) + raise ArgumentError, "wrong number of arguments (#{arguments.length} for 1 or 2)" + end + + key_path = arguments.pop + target = arguments.pop || self + target.addObserver(self, forKeyPath:key_path, options:DEFAULT_OPTIONS, context:nil) unless registered?(target, key_path) add_observer_block(target, key_path, &block) end - def unobserve(target, key_path) + def unobserve(*arguments) + unless [1,2].include?(arguments.length) + raise ArgumentError, "wrong number of arguments (#{arguments.length} for 1 or 2)" + end + + key_path = arguments.pop + target = arguments.pop || self + return unless registered?(target, key_path) target.removeObserver(self, forKeyPath:key_path) remove_observer_block(target, key_path) end @@ -51,9 +65,11 @@ !@targets.nil? && !@targets[target].nil? && @targets[target].has_key?(key_path.to_s) end def add_observer_block(target, key_path, &block) return if target.nil? || key_path.nil? || block.nil? + + block.weak! if BubbleWrap.use_weak_callbacks? @targets ||= {} @targets[target] ||= {} @targets[target][key_path.to_s] ||= [] @targets[target][key_path.to_s] << block