[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