[macruby-changes] [721] MacRuby/trunk/lib/hotcocoa/kvo_accessors.rb

source_changes at macosforge.org source_changes at macosforge.org
Fri Nov 7 21:06:26 PST 2008


Revision: 721
          http://trac.macosforge.org/projects/ruby/changeset/721
Author:   ben at tanjero.com
Date:     2008-11-07 21:06:25 -0800 (Fri, 07 Nov 2008)
Log Message:
-----------
Support for KVO set accessors

We had arrays, now let's have sets, too. Refactored out the base redefinition code to make the set case easy to add.

Modified Paths:
--------------
    MacRuby/trunk/lib/hotcocoa/kvo_accessors.rb

Modified: MacRuby/trunk/lib/hotcocoa/kvo_accessors.rb
===================================================================
--- MacRuby/trunk/lib/hotcocoa/kvo_accessors.rb	2008-11-08 05:00:39 UTC (rev 720)
+++ MacRuby/trunk/lib/hotcocoa/kvo_accessors.rb	2008-11-08 05:06:25 UTC (rev 721)
@@ -2,29 +2,42 @@
 
     def self.kvo_array(key, &b)
         capitalized_key = key.to_s.capitalize
-        signatures = {:size      => { selector: :"countOf#{capitalized_key}",                  type_signature: "i@:",   flip: false },
-                      :[]        => { selector: :"objectIn#{capitalized_key}AtIndex:",         type_signature: "@@:i",  flip: false },
-                      :insert    => { selector: :"insertObject:in#{capitalized_key}AtIndex:",  type_signature: "v@:@i", flip: true  },
-                      :delete_at => { selector: :"removeObjectFrom#{capitalized_key}AtIndex:", type_signature: "v@:i",  flip: false }
+        signatures = { :size      => { selector: :"countOf#{capitalized_key}",                  type_signature: "i@:",   flip: false },
+                       :[]        => { selector: :"objectIn#{capitalized_key}AtIndex:",         type_signature: "@@:i",  flip: false },
+                       :insert    => { selector: :"insertObject:in#{capitalized_key}AtIndex:",  type_signature: "v@:@i", flip: true  },
+                       :delete_at => { selector: :"removeObjectFrom#{capitalized_key}AtIndex:", type_signature: "v@:i",  flip: false }
         }
+        define_methods_with_signatures(signatures, &b)
+    end
 
+    def self.kvo_set(key, &b)
+        capitalized_key = key.to_s.capitalize
+        signatures = { :add       => { selector: :"add#{capitalized_key}Object:",    type_signature: "v@:@", flip: false },
+                       :delete    => { selector: :"remove#{capitalized_key}Object:", type_signature: "v@:@", flip: false},
+                       :merge     => { selector: :"add#{capitalized_key}:",          type_signature: "v@:@", flip: false },
+                       :subtract  => { selector: :"remove#{capitalized_key}:",       type_signature: "v@:@", flip: false },
+                       :set       => { selector: :"#{key}",                          type_signature: "@@:",  flip: false }
+        }
+        define_methods_with_signatures(signatures, &b)
+    end
+
+    private
+    def self.define_methods_with_signatures(signatures, &b)
         c = Module.new
         c.module_eval &b
         c.instance_methods.each do |m|
             signature = signatures[m]
             if signature
-                method = c.instance_method(m)
-                if signature[:flip]
-                    method = Proc.new { |a, b| method.bind(self).call(b, a)}
-                end
-                c.send(:define_method, signature[:selector], method)
-                c.send(:remove_method, m)
-                c.send(:method_signature, signature[:selector], signature[:type_signature])
-
+		method = c.instance_method(m)
+		if signature[:flip]
+		    method = Proc.new { |a, b| method.bind(self).call(b, a)}
+		end
+		c.send(:define_method, signature[:selector], method)
+		c.send(:remove_method, m)
+		c.send(:method_signature, signature[:selector], signature[:type_signature])
             elsif not Module.instance_methods.include?(m)
-                raise ArgumentError, "Method `#{m}' isn't a KVO array accessor"
+                raise ArgumentError, "Method `#{m}' isn't a KVO accessor"
             end
-
         end
 
         include c
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20081107/5d9a909e/attachment.html>


More information about the macruby-changes mailing list