[macruby-changes] [720] MacRuby/trunk/lib

source_changes at macosforge.org source_changes at macosforge.org
Fri Nov 7 21:00:40 PST 2008


Revision: 720
          http://trac.macosforge.org/projects/ruby/changeset/720
Author:   ben at tanjero.com
Date:     2008-11-07 21:00:39 -0800 (Fri, 07 Nov 2008)
Log Message:
-----------
Added KVO array accessors

These changes let you write methods for KVO accessing using natural Ruby syntax:

class T
kvo_array :squares do
 def size
   10
 end
 def [](i)
   i * i
 end
end
end

>> T.new.valueForKey('squares')
=> [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

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

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

Added: MacRuby/trunk/lib/hotcocoa/kvo_accessors.rb
===================================================================
--- MacRuby/trunk/lib/hotcocoa/kvo_accessors.rb	                        (rev 0)
+++ MacRuby/trunk/lib/hotcocoa/kvo_accessors.rb	2008-11-08 05:00:39 UTC (rev 720)
@@ -0,0 +1,33 @@
+class Object
+
+    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 }
+        }
+
+        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])
+
+            elsif not Module.instance_methods.include?(m)
+                raise ArgumentError, "Method `#{m}' isn't a KVO array accessor"
+            end
+
+        end
+
+        include c
+    end
+
+end

Modified: MacRuby/trunk/lib/hotcocoa.rb
===================================================================
--- MacRuby/trunk/lib/hotcocoa.rb	2008-11-08 03:17:50 UTC (rev 719)
+++ MacRuby/trunk/lib/hotcocoa.rb	2008-11-08 05:00:39 UTC (rev 720)
@@ -17,5 +17,6 @@
 require 'hotcocoa/data_sources/combo_box_data_source'
 require 'hotcocoa/kernel_ext'
 require 'hotcocoa/plist'
+require 'hotcocoa/kvo_accessors'
 
 HotCocoa::Mappings.reload
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20081107/3baf024e/attachment.html>


More information about the macruby-changes mailing list