glimmer 0.1.0.0 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. data/.rvmrc +1 -0
  2. data/Gemfile +9 -0
  3. data/LICENSE.txt +20 -0
  4. data/README.markdown +54 -0
  5. data/Rakefile +54 -0
  6. data/VERSION +1 -0
  7. data/bin/glimmer +132 -0
  8. data/glimmer.gemspec +145 -0
  9. data/images/Bitter-sweet.jpg +0 -0
  10. data/{src → lib}/command_handler.rb +7 -10
  11. data/{src → lib}/command_handler_chain_factory.rb +29 -22
  12. data/{src → lib}/command_handler_chain_link.rb +19 -22
  13. data/{src → lib}/command_handlers.rb +29 -26
  14. data/{src → lib}/command_handlers/bind_command_handler.rb +25 -28
  15. data/lib/command_handlers/combo_selection_data_binding_command_handler.rb +39 -0
  16. data/{src → lib}/command_handlers/data_binding_command_handler.rb +61 -64
  17. data/lib/command_handlers/list_selection_data_binding_command_handler.rb +42 -0
  18. data/lib/command_handlers/models/list_observer.rb +31 -0
  19. data/{src → lib}/command_handlers/models/model_observer.rb +28 -25
  20. data/{src → lib}/command_handlers/models/observable_array.rb +53 -46
  21. data/lib/command_handlers/models/observable_model.rb +61 -0
  22. data/{src → lib}/command_handlers/models/r_runnable.rb +11 -14
  23. data/{src → lib}/command_handlers/models/r_shell.rb +23 -26
  24. data/lib/command_handlers/models/r_tab_item_composite.rb +25 -0
  25. data/{src → lib}/command_handlers/models/r_widget.rb +16 -14
  26. data/lib/command_handlers/models/r_widget_listener.rb +9 -0
  27. data/{src → lib}/command_handlers/models/r_widget_packages.rb +5 -8
  28. data/{src → lib}/command_handlers/models/table_items_updater.rb +38 -39
  29. data/{src → lib}/command_handlers/models/widget_observer.rb +4 -6
  30. data/{src → lib}/command_handlers/shell_command_handler.rb +14 -17
  31. data/{src → lib}/command_handlers/swt_constant_command_handler.rb +18 -21
  32. data/lib/command_handlers/tab_item_command_handler.rb +22 -0
  33. data/{src → lib}/command_handlers/table_column_properties_data_binding_command_handler.rb +20 -23
  34. data/{src → lib}/command_handlers/table_items_data_binding_command_handler.rb +26 -29
  35. data/{src → lib}/command_handlers/widget_command_handler.rb +22 -25
  36. data/{src → lib}/command_handlers/widget_listener_command_handler.rb +36 -34
  37. data/{src → lib}/command_handlers/widget_method_command_handler.rb +18 -21
  38. data/{src → lib}/glimmer.rb +52 -45
  39. data/lib/parent.rb +5 -0
  40. data/{src → lib}/shine.rb +21 -24
  41. data/{src → lib}/xml_command_handlers.rb +15 -18
  42. data/{src → lib}/xml_command_handlers/html_command_handler.rb +45 -49
  43. data/{src → lib}/xml_command_handlers/models/depth_first_search_iterator.rb +17 -20
  44. data/{src → lib}/xml_command_handlers/models/name_space_visitor.rb +17 -20
  45. data/{src → lib}/xml_command_handlers/models/node.rb +80 -83
  46. data/{src → lib}/xml_command_handlers/models/node_visitor.rb +8 -11
  47. data/{src → lib}/xml_command_handlers/models/xml_visitor.rb +58 -61
  48. data/{src → lib}/xml_command_handlers/xml_command_handler.rb +18 -22
  49. data/{src → lib}/xml_command_handlers/xml_name_space_command_handler.rb +31 -34
  50. data/{src → lib}/xml_command_handlers/xml_tag_command_handler.rb +23 -26
  51. data/{src → lib}/xml_command_handlers/xml_text_command_handler.rb +19 -22
  52. data/samples/contactmanager/contact.rb +0 -3
  53. data/samples/contactmanager/contact_manager.rb +1 -4
  54. data/samples/contactmanager/contact_manager_presenter.rb +0 -3
  55. data/samples/contactmanager/contact_repository.rb +0 -3
  56. data/samples/hello_combo.rb +32 -0
  57. data/samples/hello_world.rb +1 -4
  58. data/samples/login.rb +1 -4
  59. data/samples/tictactoe/tic_tac_toe.rb +2 -5
  60. data/samples/tictactoe/tic_tac_toe_board.rb +0 -3
  61. data/test/glimmer_combo_data_binding_test.rb +131 -0
  62. data/test/glimmer_constant_test.rb +6 -11
  63. data/test/glimmer_data_binding_test.rb +16 -16
  64. data/test/glimmer_list_data_binding_test.rb +223 -0
  65. data/test/glimmer_listeners_test.rb +6 -6
  66. data/test/glimmer_shine_data_binding_test.rb +7 -6
  67. data/test/glimmer_tab_item_test.rb +61 -0
  68. data/test/glimmer_table_data_binding_test.rb +7 -20
  69. data/test/glimmer_test.rb +18 -13
  70. data/test/helper.rb +21 -0
  71. data/test/observable_model_test.rb +2 -4
  72. data/test/r_widget_test.rb +5 -5
  73. data/test/samples/contactmanager/contact_manager_presenter_test.rb +1 -4
  74. data/test/samples/tictactoe/tic_tac_toe_test.rb +1 -4
  75. data/test/xml/glimmer_xml_test.rb +43 -43
  76. metadata +210 -105
  77. data/COPYING.LGPL +0 -504
  78. data/README +0 -27
  79. data/src/command_handlers/models/observable_model.rb +0 -35
  80. data/src/command_handlers/models/r_widget_listener.rb +0 -12
  81. data/src/parent.rb +0 -8
  82. data/src/swt.rb +0 -10
  83. data/src/xml.rb +0 -10
@@ -1,23 +1,30 @@
1
- # Copyright (C) 2007-2008 Annas Al Maleh
2
- # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
-
4
- require File.dirname(__FILE__) + "/command_handler_chain_link"
5
-
6
- class CommandHandlerChainFactory
7
- @@last_chain_link = nil
8
- @@chain = nil
9
-
10
- def self.set_command_handlers(*command_handler_array)
11
- command_handler_array.each do |command_handler|
12
- puts "Loading #{command_handler.class.to_s}..."
13
- chain_link = CommandHandlerChainLink.new(command_handler)
14
- @@last_chain_link.chain_to(chain_link) if @@last_chain_link
15
- @@last_chain_link = chain_link
16
- @@chain = chain_link unless @@chain
17
- end
18
- end
19
-
20
- def self.chain
21
- @@chain
22
- end
1
+ require File.dirname(__FILE__) + "/command_handler_chain_link"
2
+
3
+ class CommandHandlerChainFactory
4
+ @@dsls = {}
5
+
6
+ def self.def_dsl(dsl, *command_handler_array)
7
+ @@last_chain_link = nil
8
+ @@chain = nil
9
+ command_handler_array.each do |command_handler|
10
+ puts "Loading #{command_handler.class.to_s}..."
11
+ chain_link = CommandHandlerChainLink.new(command_handler)
12
+ @@last_chain_link.chain_to(chain_link) if @@last_chain_link
13
+ @@last_chain_link = chain_link
14
+ @@chain = chain_link unless @@chain
15
+ end
16
+ @@dsls[dsl] = {
17
+ :last_chain_link => @@last_chain_link,
18
+ :chain => @@chain
19
+ }
20
+ end
21
+
22
+ def self.select_dsl(dsl)
23
+ @@last_chain_link = @@dsls[dsl][:last_chain_link]
24
+ @@chain = @@dsls[dsl][:chain]
25
+ end
26
+
27
+ def self.chain
28
+ @@chain
29
+ end
23
30
  end
@@ -1,22 +1,19 @@
1
- # Copyright (C) 2007-2008 Annas Al Maleh
2
- # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
-
4
- class CommandHandlerChainLink
5
- def initialize(command_handler)
6
- @command_handler = command_handler
7
- end
8
- def chain_to(next_chain_link)
9
- @next_chain_link = next_chain_link
10
- end
11
- def handle(parent, command_symbol, *args, &block)
12
- if (@command_handler.can_handle?(parent, command_symbol, *args, &block))
13
- puts "#{@command_handler.class.to_s} will handle command: #{command_symbol} with arguments #{args}"
14
- return @command_handler.do_handle(parent, command_symbol, *args, &block)
15
- elsif @next_chain_link
16
- return @next_chain_link.handle(parent, command_symbol, *args, &block)
17
- else
18
- puts "Command: #{command_symbol} cannot be handled!"
19
- return nil
20
- end
21
- end
22
- end
1
+ class CommandHandlerChainLink
2
+ def initialize(command_handler)
3
+ @command_handler = command_handler
4
+ end
5
+ def chain_to(next_chain_link)
6
+ @next_chain_link = next_chain_link
7
+ end
8
+ def handle(parent, command_symbol, *args, &block)
9
+ if (@command_handler.can_handle?(parent, command_symbol, *args, &block))
10
+ puts "#{@command_handler.class.to_s} will handle command: #{command_symbol} with arguments #{args}"
11
+ return @command_handler.do_handle(parent, command_symbol, *args, &block)
12
+ elsif @next_chain_link
13
+ return @next_chain_link.handle(parent, command_symbol, *args, &block)
14
+ else
15
+ puts "Command: #{command_symbol} cannot be handled!"
16
+ return nil
17
+ end
18
+ end
19
+ end
@@ -1,26 +1,29 @@
1
- # Copyright (C) 2007-2008 Annas Al Maleh
2
- # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
-
4
- require File.dirname(__FILE__) + "/command_handler_chain_factory"
5
- require File.dirname(__FILE__) + "/command_handlers/shell_command_handler"
6
- require File.dirname(__FILE__) + "/command_handlers/widget_listener_command_handler"
7
- require File.dirname(__FILE__) + "/command_handlers/bind_command_handler"
8
- require File.dirname(__FILE__) + "/command_handlers/table_items_data_binding_command_handler"
9
- require File.dirname(__FILE__) + "/command_handlers/table_column_properties_data_binding_command_handler"
10
- require File.dirname(__FILE__) + "/command_handlers/data_binding_command_handler"
11
- require File.dirname(__FILE__) + "/command_handlers/widget_method_command_handler"
12
- require File.dirname(__FILE__) + "/command_handlers/widget_command_handler"
13
- require File.dirname(__FILE__) + "/command_handlers/swt_constant_command_handler"
14
-
15
- # edit to add more command handlers and extend Glimmer
16
- CommandHandlerChainFactory.set_command_handlers(
17
- ShellCommandHandler.new,
18
- WidgetListenerCommandHandler.new,
19
- BindCommandHandler.new,
20
- TableItemsDataBindingCommandHandler.new,
21
- TableColumnPropertiesDataBindingCommandHandler.new,
22
- DataBindingCommandHandler.new,
23
- WidgetMethodCommandHandler.new,
24
- WidgetCommandHandler.new,
25
- SwtConstantCommandHandler.new #at the bottom to avoid stealing commands from other command handlers
26
- )
1
+ require File.dirname(__FILE__) + "/command_handler_chain_factory"
2
+ require File.dirname(__FILE__) + "/command_handlers/shell_command_handler"
3
+ require File.dirname(__FILE__) + "/command_handlers/widget_listener_command_handler"
4
+ require File.dirname(__FILE__) + "/command_handlers/bind_command_handler"
5
+ require File.dirname(__FILE__) + "/command_handlers/tab_item_command_handler"
6
+ require File.dirname(__FILE__) + "/command_handlers/combo_selection_data_binding_command_handler"
7
+ require File.dirname(__FILE__) + "/command_handlers/list_selection_data_binding_command_handler"
8
+ require File.dirname(__FILE__) + "/command_handlers/table_items_data_binding_command_handler"
9
+ require File.dirname(__FILE__) + "/command_handlers/table_column_properties_data_binding_command_handler"
10
+ require File.dirname(__FILE__) + "/command_handlers/data_binding_command_handler"
11
+ require File.dirname(__FILE__) + "/command_handlers/widget_method_command_handler"
12
+ require File.dirname(__FILE__) + "/command_handlers/widget_command_handler"
13
+ require File.dirname(__FILE__) + "/command_handlers/swt_constant_command_handler"
14
+
15
+ # edit to add more command handlers and extend Glimmer
16
+ CommandHandlerChainFactory.def_dsl(:swt,
17
+ ShellCommandHandler.new,
18
+ WidgetListenerCommandHandler.new,
19
+ BindCommandHandler.new,
20
+ TabItemCommandHandler.new,
21
+ ComboSelectionDataBindingCommandHandler.new,
22
+ ListSelectionDataBindingCommandHandler.new,
23
+ TableItemsDataBindingCommandHandler.new,
24
+ TableColumnPropertiesDataBindingCommandHandler.new,
25
+ DataBindingCommandHandler.new,
26
+ WidgetMethodCommandHandler.new,
27
+ WidgetCommandHandler.new,
28
+ SwtConstantCommandHandler.new #at the bottom to avoid stealing commands from other command handlers
29
+ )
@@ -1,29 +1,26 @@
1
- # Copyright (C) 2007-2008 Annas Al Maleh
2
- # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
-
4
- require File.dirname(__FILE__) + "/../command_handler"
5
- require File.dirname(__FILE__) + "/models/r_widget"
6
- require File.dirname(__FILE__) + "/models/model_observer"
7
-
8
- class BindCommandHandler
9
- include CommandHandler
10
-
11
- include_package 'org.eclipse.swt.widgets'
12
-
13
- def can_handle?(parent, command_symbol, *args, &block)
14
- parent.is_a?(RWidget) and
15
- command_symbol.to_s == "bind" and
16
- (((args.size == 2) and
17
- (args[1].is_a?(Symbol) or args[1].is_a?(String))) or
18
- ((args.size == 3) and
19
- (args[1].is_a?(Symbol) or args[1].is_a?(String)) and
20
- (args[2].is_a?(Symbol) or args[2].is_a?(String)))) and
21
- block == nil
22
- end
23
-
24
- def do_handle(parent, command_symbol, *args, &block)
25
- property_type = args[2] if (args.size == 3)
26
- ModelObserver.new(args[0], args[1].to_s, property_type)
27
- end
28
-
1
+ require File.dirname(__FILE__) + "/../command_handler"
2
+ require File.dirname(__FILE__) + "/models/r_widget"
3
+ require File.dirname(__FILE__) + "/models/model_observer"
4
+
5
+ class BindCommandHandler
6
+ include CommandHandler
7
+
8
+ include_package 'org.eclipse.swt.widgets'
9
+
10
+ def can_handle?(parent, command_symbol, *args, &block)
11
+ parent.is_a?(RWidget) and
12
+ command_symbol.to_s == "bind" and
13
+ (((args.size == 2) and
14
+ (args[1].is_a?(Symbol) or args[1].is_a?(String))) or
15
+ ((args.size == 3) and
16
+ (args[1].is_a?(Symbol) or args[1].is_a?(String)) and
17
+ (args[2].is_a?(Symbol) or args[2].is_a?(String)))) and
18
+ block == nil
19
+ end
20
+
21
+ def do_handle(parent, command_symbol, *args, &block)
22
+ property_type = args[2] if (args.size == 3)
23
+ ModelObserver.new(args[0], args[1].to_s, property_type)
24
+ end
25
+
29
26
  end
@@ -0,0 +1,39 @@
1
+ require File.dirname(__FILE__) + "/../command_handler"
2
+ require File.dirname(__FILE__) + "/models/r_widget"
3
+
4
+ class ComboSelectionDataBindingCommandHandler
5
+ include CommandHandler
6
+ include Glimmer
7
+
8
+ include_package 'org.eclipse.swt.widgets'
9
+
10
+ def can_handle?(parent, command_symbol, *args, &block)
11
+ parent.is_a?(RWidget) and
12
+ parent.widget.is_a?(Combo) and
13
+ command_symbol.to_s == "selection" and
14
+ args.size == 1 and
15
+ args[0].is_a?(ModelObserver) and
16
+ args[0].evaluate_options_property.is_a?(Array) and
17
+ block == nil
18
+ end
19
+
20
+ def do_handle(parent, command_symbol, *args, &block)
21
+ model_observer = args[0]
22
+ widget_observer = WidgetObserver.new(parent, "items")
23
+ widget_observer.update(model_observer.evaluate_options_property)
24
+ model = model_observer.model
25
+ model.extend ObservableModel unless model.is_a?(ObservableModel)
26
+ model.add_observer(model_observer.options_property_name, widget_observer)
27
+
28
+ widget_observer = WidgetObserver.new(parent, "text")
29
+ widget_observer.update(model_observer.evaluate_property)
30
+ model.add_observer(model_observer.property_name, widget_observer)
31
+
32
+ add_contents(parent) {
33
+ on_widget_selected {
34
+ model_observer.update(widget_observer.evaluate_property)
35
+ }
36
+ }
37
+ end
38
+
39
+ end
@@ -1,64 +1,61 @@
1
- # Copyright (C) 2007-2008 Annas Al Maleh
2
- # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
-
4
- require File.dirname(__FILE__) + "/../command_handler"
5
- require File.dirname(__FILE__) + "/models/r_widget"
6
- require File.dirname(__FILE__) + "/models/observable_model"
7
- require File.dirname(__FILE__) + "/models/model_observer"
8
- require File.dirname(__FILE__) + "/models/widget_observer"
9
-
10
- class DataBindingCommandHandler
11
- extend Glimmer
12
- include CommandHandler
13
-
14
- include_package 'org.eclipse.swt.widgets'
15
-
16
- @@widget_data_binders = {
17
- Java::OrgEclipseSwtWidgets::Text => {
18
- :text => Proc.new do |rwidget, model_observer|
19
- add_contents(rwidget) {
20
- on_modify_text { |modify_event|
21
- model_observer.update(rwidget.widget.getText)
22
- }
23
- }
24
- end,
25
- },
26
- Java::OrgEclipseSwtWidgets::Button => {
27
- :selection => Proc.new do |rwidget, model_observer|
28
- add_contents(rwidget) {
29
- on_widget_selected { |selection_event|
30
- model_observer.update(rwidget.widget.getSelection)
31
- }
32
- }
33
- end
34
- },
35
- Java::OrgEclipseSwtWidgets::Spinner => {
36
- :selection => Proc.new do |rwidget, model_observer|
37
- add_contents(rwidget) {
38
- on_widget_selected { |selection_event|
39
- model_observer.update(rwidget.widget.getSelection)
40
- }
41
- }
42
- end
43
- }
44
- }
45
-
46
- def can_handle?(parent, command_symbol, *args, &block)
47
- parent.is_a?(RWidget) and
48
- args.size == 1 and
49
- args[0].is_a?(ModelObserver)
50
- end
51
-
52
- def do_handle(parent, command_symbol, *args, &block)
53
- model_observer = args[0]
54
- widget_observer = WidgetObserver.new(parent, command_symbol.to_s)
55
- widget_observer.update(model_observer.evaluate_property)
56
- model = model_observer.model
57
- model.extend ObservableModel unless model.is_a?(ObservableModel)
58
- model.add_observer(model_observer.property_name, widget_observer)
59
- widget_data_binder_map = @@widget_data_binders[parent.widget.class]
60
- widget_data_binder = widget_data_binder_map[command_symbol.to_s.to_sym] if widget_data_binder_map
61
- widget_data_binder.call(parent, model_observer) if widget_data_binder
62
- end
63
-
64
- end
1
+ require File.dirname(__FILE__) + "/../command_handler"
2
+ require File.dirname(__FILE__) + "/models/r_widget"
3
+ require File.dirname(__FILE__) + "/models/observable_model"
4
+ require File.dirname(__FILE__) + "/models/model_observer"
5
+ require File.dirname(__FILE__) + "/models/widget_observer"
6
+
7
+ class DataBindingCommandHandler
8
+ extend Glimmer
9
+ include CommandHandler
10
+
11
+ include_package 'org.eclipse.swt.widgets'
12
+
13
+ @@widget_data_binders = {
14
+ Java::OrgEclipseSwtWidgets::Text => {
15
+ :text => Proc.new do |rwidget, model_observer|
16
+ add_contents(rwidget) {
17
+ on_modify_text { |modify_event|
18
+ model_observer.update(rwidget.widget.getText)
19
+ }
20
+ }
21
+ end,
22
+ },
23
+ Java::OrgEclipseSwtWidgets::Button => {
24
+ :selection => Proc.new do |rwidget, model_observer|
25
+ add_contents(rwidget) {
26
+ on_widget_selected { |selection_event|
27
+ model_observer.update(rwidget.widget.getSelection)
28
+ }
29
+ }
30
+ end
31
+ },
32
+ Java::OrgEclipseSwtWidgets::Spinner => {
33
+ :selection => Proc.new do |rwidget, model_observer|
34
+ add_contents(rwidget) {
35
+ on_widget_selected { |selection_event|
36
+ model_observer.update(rwidget.widget.getSelection)
37
+ }
38
+ }
39
+ end
40
+ }
41
+ }
42
+
43
+ def can_handle?(parent, command_symbol, *args, &block)
44
+ parent.is_a?(RWidget) and
45
+ args.size == 1 and
46
+ args[0].is_a?(ModelObserver)
47
+ end
48
+
49
+ def do_handle(parent, command_symbol, *args, &block)
50
+ model_observer = args[0]
51
+ widget_observer = WidgetObserver.new(parent, command_symbol.to_s)
52
+ widget_observer.update(model_observer.evaluate_property)
53
+ model = model_observer.model
54
+ model.extend ObservableModel unless model.is_a?(ObservableModel)
55
+ model.add_observer(model_observer.property_name, widget_observer)
56
+ widget_data_binder_map = @@widget_data_binders[parent.widget.class]
57
+ widget_data_binder = widget_data_binder_map[command_symbol.to_s.to_sym] if widget_data_binder_map
58
+ widget_data_binder.call(parent, model_observer) if widget_data_binder
59
+ end
60
+
61
+ end
@@ -0,0 +1,42 @@
1
+ require File.dirname(__FILE__) + "/../command_handler"
2
+ require File.dirname(__FILE__) + "/models/r_widget"
3
+ require File.dirname(__FILE__) + "/models/list_observer"
4
+
5
+ class ListSelectionDataBindingCommandHandler
6
+ include CommandHandler
7
+ include Glimmer
8
+
9
+ include_package 'org.eclipse.swt.widgets'
10
+
11
+ def can_handle?(parent, command_symbol, *args, &block)
12
+ parent.is_a?(RWidget) and
13
+ parent.widget.is_a?(List) and
14
+ command_symbol.to_s == "selection" and
15
+ args.size == 1 and
16
+ args[0].is_a?(ModelObserver) and
17
+ args[0].evaluate_options_property.is_a?(Array) and
18
+ block == nil
19
+ end
20
+
21
+ def do_handle(parent, command_symbol, *args, &block)
22
+ model_observer = args[0]
23
+ widget_observer = WidgetObserver.new(parent, "items")
24
+ widget_observer.update(model_observer.evaluate_options_property)
25
+ model = model_observer.model
26
+ model.extend ObservableModel unless model.is_a?(ObservableModel)
27
+ model.add_observer(model_observer.options_property_name, widget_observer)
28
+
29
+ property_type = :string
30
+ property_type = :array if parent.has_style?(multi)
31
+ list_observer = ListObserver.new(parent, property_type)
32
+ list_observer.update(model_observer.evaluate_property)
33
+ model.add_observer(model_observer.property_name, list_observer)
34
+
35
+ add_contents(parent) {
36
+ on_widget_selected {
37
+ model_observer.update(list_observer.evaluate_property)
38
+ }
39
+ }
40
+ end
41
+
42
+ end
@@ -0,0 +1,31 @@
1
+ class ListObserver
2
+ attr_reader :widget
3
+ @@property_type_updaters = {
4
+ :string => lambda { |widget, value| widget.widget.select(widget.widget.index_of(value.to_s)) },
5
+ :array => lambda { |widget, value| widget.widget.selection=((value or []).to_java :string) }
6
+ }
7
+ @@property_evaluators = {
8
+ :string => lambda do |selection_array|
9
+ return nil if selection_array.empty?
10
+ selection_array[0]
11
+ end,
12
+ :array => lambda do |selection_array|
13
+ selection_array
14
+ end
15
+ }
16
+ def initialize(widget, property_type)
17
+ property_type = :string if property_type.nil? or property_type == :undefined
18
+ @widget = widget
19
+ @property_type = property_type
20
+ end
21
+ def update(value)
22
+ raise "hell" if value == ["Canada"]
23
+ @@property_type_updaters[@property_type].call(@widget, value) unless evaluate_property == value
24
+ end
25
+ def evaluate_property
26
+ selection_array = @widget.widget.send("selection").to_a
27
+ property_value = @@property_evaluators[@property_type].call(selection_array)
28
+ return property_value
29
+ end
30
+ end
31
+