[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