Revision
605
Author
rich@infoether.com
Date
2008-09-18 18:17:43 -0700 (Thu, 18 Sep 2008)

Log Message

enable delegate methods to be required before setting the delegate on the control

Modified Paths

Diff

Modified: MacRuby/trunk/lib/hotcocoa/delegate_builder.rb (604 => 605)


--- MacRuby/trunk/lib/hotcocoa/delegate_builder.rb	2008-09-19 01:17:07 UTC (rev 604)
+++ MacRuby/trunk/lib/hotcocoa/delegate_builder.rb	2008-09-19 01:17:43 UTC (rev 605)
@@ -2,10 +2,11 @@
     
   class DelegateBuilder
     
-    attr_reader :control, :delegate, :method_count
+    attr_reader :control, :delegate, :method_count, :required_methods
     
-    def initialize(control)
+    def initialize(control, required_methods)
       @control = control
+      @required_methods = required_methods
       @method_count = 0
       @delegate = Object.new
     end
@@ -15,7 +16,7 @@
       increment_method_count
       bind_block_to_delegate_instance_variable(block)
       create_delegate_method(selector_name, parameters)
-      set_delegate
+      set_delegate if required_methods.empty?
     end
     
     private 
@@ -29,6 +30,7 @@
       end
       
       def create_delegate_method(selector_name, parameters)
+        required_methods.delete(selector_name)
         eval %{
           def delegate.#{parameterize_selector_name(selector_name)}
             #{block_instance_variable}.call(#{parameter_values_for_mapping(selector_name, parameters)})

Modified: MacRuby/trunk/lib/hotcocoa/mapper.rb (604 => 605)


--- MacRuby/trunk/lib/hotcocoa/mapper.rb	2008-09-19 01:17:07 UTC (rev 604)
+++ MacRuby/trunk/lib/hotcocoa/mapper.rb	2008-09-19 01:17:43 UTC (rev 605)
@@ -121,12 +121,16 @@
     def delegate_module_for_control_class
       return Mapper.delegate_modules[control_class] if Mapper.delegate_modules.has_key?(control_class)
       delegate_module = Module.new
+      required_methods = []
       inherited_delegate_methods.each do |delegate_method, mapping|
+        required_methods << delegate_method if mapping[:required]
+      end
+      inherited_delegate_methods.each do |delegate_method, mapping|
         parameters = mapping[:parameters] ? ", "+mapping[:parameters].map {|param| %{"#{param}"} }.join(",") : ""
         delegate_module.module_eval %{
           def #{mapping[:to]}(&block)
             raise "Must pass in a block to use this delegate method" unless block_given?
-            @_delegate_builder ||= HotCocoa::DelegateBuilder.new(self)
+            @_delegate_builder ||= HotCocoa::DelegateBuilder.new(self, #{required_methods.inspect})
             @_delegate_builder.add_delegated_method(block, "#{delegate_method}" #{parameters})
           end
         }