wee 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. data/TODO +31 -0
  2. data/benchmark.rb +37 -0
  3. data/demo.ru +11 -0
  4. data/doc/rdoc/classes/Array.html +22 -26
  5. data/doc/rdoc/classes/Hash.html +22 -26
  6. data/doc/rdoc/classes/Object.html +21 -26
  7. data/doc/rdoc/classes/String.html +19 -87
  8. data/doc/rdoc/classes/Struct.html +22 -26
  9. data/doc/rdoc/classes/Wee.html +75 -206
  10. data/doc/rdoc/classes/Wee/AnswerDecoration.html +35 -66
  11. data/doc/rdoc/classes/Wee/AnswerDecoration/Answer.html +28 -46
  12. data/doc/rdoc/classes/Wee/Application.html +63 -114
  13. data/doc/rdoc/classes/Wee/Application/SessionCache.html +30 -44
  14. data/doc/rdoc/classes/Wee/Brush.html +52 -101
  15. data/doc/rdoc/classes/Wee/Brush/ActionInputTag.html +29 -51
  16. data/doc/rdoc/classes/Wee/Brush/AnchorTag.html +44 -101
  17. data/doc/rdoc/classes/Wee/Brush/CheckboxTag.html +43 -76
  18. data/doc/rdoc/classes/Wee/Brush/FileUploadTag.html +29 -46
  19. data/doc/rdoc/classes/Wee/Brush/FormTag.html +48 -110
  20. data/doc/rdoc/classes/Wee/Brush/GenericEncodedTextBrush.html +30 -42
  21. data/doc/rdoc/classes/Wee/Brush/GenericSingleTagBrush.html +37 -58
  22. data/doc/rdoc/classes/Wee/Brush/GenericTagBrush.html +93 -210
  23. data/doc/rdoc/classes/Wee/Brush/GenericTextBrush.html +38 -63
  24. data/doc/rdoc/classes/Wee/Brush/HiddenInputTag.html +29 -45
  25. data/doc/rdoc/classes/Wee/Brush/ImageButtonTag.html +35 -52
  26. data/doc/rdoc/classes/Wee/Brush/ImageTag.html +28 -61
  27. data/doc/rdoc/classes/Wee/Brush/InputTag.html +34 -107
  28. data/doc/rdoc/classes/Wee/Brush/JavascriptTag.html +28 -54
  29. data/doc/rdoc/classes/Wee/Brush/Page.html +39 -73
  30. data/doc/rdoc/classes/Wee/Brush/PasswordInputTag.html +29 -45
  31. data/doc/rdoc/classes/Wee/Brush/RadioButtonTag.html +54 -98
  32. data/doc/rdoc/classes/Wee/Brush/RadioGroup.html +46 -84
  33. data/doc/rdoc/classes/Wee/Brush/SelectListTag.html +87 -187
  34. data/doc/rdoc/classes/Wee/Brush/SelectOptionTag.html +29 -56
  35. data/doc/rdoc/classes/Wee/Brush/SubmitButtonTag.html +29 -45
  36. data/doc/rdoc/classes/Wee/Brush/TableDataTag.html +28 -55
  37. data/doc/rdoc/classes/Wee/Brush/TableHeaderTag.html +28 -55
  38. data/doc/rdoc/classes/Wee/Brush/TableRowTag.html +56 -113
  39. data/doc/rdoc/classes/Wee/Brush/TableTag.html +27 -58
  40. data/doc/rdoc/classes/Wee/Brush/TextAreaTag.html +48 -140
  41. data/doc/rdoc/classes/Wee/Brush/TextInputTag.html +29 -45
  42. data/doc/rdoc/classes/Wee/CallAnswerMixin.html +51 -79
  43. data/doc/rdoc/classes/Wee/CallbackMixin.html +44 -77
  44. data/doc/rdoc/classes/Wee/CallbackRegistry.html +69 -125
  45. data/doc/rdoc/classes/Wee/Callbacks.html +43 -82
  46. data/doc/rdoc/classes/Wee/Component.html +142 -292
  47. data/doc/rdoc/classes/Wee/Decoration.html +85 -141
  48. data/doc/rdoc/classes/Wee/DecorationMixin.html +111 -118
  49. data/doc/rdoc/classes/Wee/Delegate.html +72 -115
  50. data/doc/rdoc/classes/Wee/DupReplaceSnapshotMixin.html +37 -54
  51. data/doc/rdoc/classes/Wee/ErrorResponse.html +31 -48
  52. data/doc/rdoc/classes/Wee/FormDecoration.html +32 -46
  53. data/doc/rdoc/classes/Wee/GenericResponse.html +30 -50
  54. data/doc/rdoc/classes/Wee/HtmlCanvas.html +209 -562
  55. data/doc/rdoc/classes/Wee/HtmlDocument.html +51 -91
  56. data/doc/rdoc/classes/Wee/HtmlWriter.html +76 -156
  57. data/doc/rdoc/classes/Wee/IdGenerator.html +28 -44
  58. data/doc/rdoc/classes/Wee/IdGenerator/Secure.html +53 -95
  59. data/doc/rdoc/classes/Wee/IdGenerator/Sequential.html +37 -63
  60. data/doc/rdoc/classes/Wee/JQuery.html +36 -64
  61. data/doc/rdoc/classes/Wee/LRUCache.html +94 -189
  62. data/doc/rdoc/classes/Wee/LRUCache/Item.html +30 -42
  63. data/doc/rdoc/classes/Wee/ObjectSnapshotMixin.html +37 -54
  64. data/doc/rdoc/classes/Wee/PageDecoration.html +48 -79
  65. data/doc/rdoc/classes/Wee/Presenter.html +86 -143
  66. data/doc/rdoc/classes/Wee/RedirectResponse.html +31 -49
  67. data/doc/rdoc/classes/Wee/RefreshResponse.html +34 -48
  68. data/doc/rdoc/classes/Wee/Renderer.html +56 -125
  69. data/doc/rdoc/classes/Wee/Request.html +57 -115
  70. data/doc/rdoc/classes/Wee/Response.html +24 -26
  71. data/doc/rdoc/classes/Wee/Session.html +137 -292
  72. data/doc/rdoc/classes/Wee/Session/AbortCallbackProcessing.html +29 -46
  73. data/doc/rdoc/classes/Wee/Session/MutexSerializer.html +29 -42
  74. data/doc/rdoc/classes/Wee/Session/Page.html +22 -21
  75. data/doc/rdoc/classes/Wee/Session/ThreadSerializer.html +36 -60
  76. data/doc/rdoc/classes/Wee/State.html +57 -105
  77. data/doc/rdoc/classes/Wee/State/Snapshot.html +22 -21
  78. data/doc/rdoc/classes/Wee/State/SnapshotIVars.html +22 -21
  79. data/doc/rdoc/classes/Wee/StructSnapshotMixin.html +37 -54
  80. data/doc/rdoc/classes/Wee/WrapperDecoration.html +42 -68
  81. data/doc/rdoc/created.rid +1 -1
  82. data/doc/rdoc/files/README_rdoc.html +26 -17
  83. data/doc/rdoc/files/lib/wee/application_rb.html +25 -19
  84. data/doc/rdoc/files/lib/wee/call_answer_rb.html +23 -12
  85. data/doc/rdoc/files/lib/wee/callback_rb.html +23 -12
  86. data/doc/rdoc/files/lib/wee/component_rb.html +25 -19
  87. data/doc/rdoc/files/lib/wee/decoration_rb.html +23 -15
  88. data/doc/rdoc/files/lib/wee/html_brushes_rb.html +23 -12
  89. data/doc/rdoc/files/lib/wee/html_canvas_rb.html +23 -15
  90. data/doc/rdoc/files/lib/wee/html_document_rb.html +23 -15
  91. data/doc/rdoc/files/lib/wee/html_writer_rb.html +23 -15
  92. data/doc/rdoc/files/lib/wee/id_generator_rb.html +24 -17
  93. data/doc/rdoc/files/lib/wee/jquery/jquery_rb.html +23 -12
  94. data/doc/rdoc/files/lib/wee/jquery_rb.html +23 -15
  95. data/doc/rdoc/files/lib/wee/lru_cache_rb.html +23 -12
  96. data/doc/rdoc/files/lib/wee/presenter_rb.html +23 -12
  97. data/doc/rdoc/files/lib/wee/renderer_rb.html +23 -12
  98. data/doc/rdoc/files/lib/wee/request_rb.html +23 -15
  99. data/doc/rdoc/files/lib/wee/response_rb.html +24 -17
  100. data/doc/rdoc/files/lib/wee/session_rb.html +26 -21
  101. data/doc/rdoc/files/lib/wee/state_rb.html +23 -12
  102. data/doc/rdoc/files/lib/wee_rb.html +37 -47
  103. data/doc/rdoc/fr_class_index.html +12 -86
  104. data/doc/rdoc/fr_file_index.html +12 -30
  105. data/doc/rdoc/fr_method_index.html +242 -473
  106. data/doc/rdoc/index.html +8 -5
  107. data/doc/rdoc/rdoc-style.css +119 -210
  108. data/examples/ObjectSpaceBrowser.rb +4 -4
  109. data/examples/TODO +21 -0
  110. data/examples/ajax.rb +6 -4
  111. data/examples/blog.rb +42 -0
  112. data/examples/demo.rb +5 -3
  113. data/examples/demo/calculator.rb +3 -3
  114. data/examples/demo/calendar.rb +4 -4
  115. data/examples/demo/counter.rb +2 -2
  116. data/examples/demo/editable_counter.rb +2 -2
  117. data/examples/demo/example.rb +25 -16
  118. data/examples/demo/window.rb +10 -3
  119. data/examples/hw2.rb +17 -0
  120. data/examples/recipe/description.rb +170 -0
  121. data/examples/recipe/migrations/001_create_recipes.rb +13 -0
  122. data/examples/recipe/model.rb +27 -0
  123. data/examples/recipe/models/recipe.rb +18 -0
  124. data/examples/recipe/recipe_editor.rb +28 -0
  125. data/lib/wee.rb +1 -7
  126. data/lib/wee/component.rb +37 -74
  127. data/lib/wee/decoration.rb +16 -15
  128. data/lib/wee/html_brushes.rb +16 -17
  129. data/lib/wee/presenter.rb +2 -1
  130. data/lib/wee/response.rb +4 -4
  131. data/lib/wee/session.rb +2 -2
  132. data/lib/wee/state.rb +2 -2
  133. data/test/t.rb +67 -0
  134. data/wee.gemspec +1 -1
  135. metadata +157 -167
@@ -0,0 +1,13 @@
1
+ class CreateRecipes < Sequel::Migration
2
+ def up
3
+ create_table :recipes do
4
+ primary_key :id
5
+ text :title
6
+ text :instructions
7
+ end
8
+ end
9
+
10
+ def down
11
+ drop_table :recipes
12
+ end
13
+ end
@@ -0,0 +1,27 @@
1
+ require 'rubygems'
2
+ require 'sequel'
3
+ $LOAD_PATH.unshift "../../lib"
4
+ require 'wee'
5
+
6
+ DB = Sequel.postgres :database => 'cookbook', :user => 'mneumann',
7
+ :password => '', :host => '/var/run/postgresql'
8
+
9
+ require 'models/recipe'
10
+ require 'recipe_editor'
11
+
12
+ Sequel::Migrator.apply(DB, 'migrations')
13
+
14
+ class MainPage < Wee::Component
15
+ def initialize
16
+ super()
17
+ @child = add_child RecipeEditor.new(Recipe.new)
18
+ end
19
+
20
+ def render(r)
21
+ r.page.title('Recipes').with {
22
+ r.render @child
23
+ }
24
+ end
25
+ end
26
+
27
+ Wee.run(MainPage)
@@ -0,0 +1,18 @@
1
+ class Recipe < Sequel::Model(:recipes)
2
+
3
+ describe :title, String
4
+ describe :instructions, String
5
+
6
+ =begin
7
+ def self.describe_title
8
+ StringDescription.new(SymbolAccessor.new(:title, :title=))
9
+ end
10
+
11
+ def self.describe_instructions
12
+ StringDescription.new
13
+ end
14
+
15
+ def self.describe_self
16
+ end
17
+ =end
18
+ end
@@ -0,0 +1,28 @@
1
+ class RecipeEditor < Wee::Component
2
+ def initialize(instance)
3
+ super()
4
+ @instance = instance
5
+ end
6
+
7
+ def render(r)
8
+ if @instance.new?
9
+ r.h1("New #{@instance.class}")
10
+ else
11
+ r.h1("Edit #{@instance.class}")
12
+ end
13
+
14
+ r.form do
15
+ r.text "Title"
16
+ r.break
17
+ r.text_input.value(@instance.title || '').callback{|v| @instance.title = v}
18
+ r.paragraph
19
+
20
+ r.text "Instructions"
21
+ r.break
22
+ r.text_area.callback{|v| @instance.instructions = v}.with(@instance.instructions || '')
23
+ r.paragraph
24
+
25
+ r.submit_button.value(@instance.new? ? 'Create' : 'Update').callback { @instance.save }
26
+ end
27
+ end
28
+ end
data/lib/wee.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Wee
2
- Version = "2.0.0"
2
+ Version = "2.1.0"
3
3
  end
4
4
 
5
5
  require 'rack'
@@ -25,12 +25,6 @@ if RUBY_VERSION >= "1.9"
25
25
  require 'continuation'
26
26
  rescue LoadError
27
27
  end
28
- unless String.instance_methods.include?(:each)
29
- # required by Rack
30
- class String
31
- def each() yield self end
32
- end
33
- end
34
28
  end
35
29
 
36
30
  Wee::DefaultRenderer = Wee::HtmlCanvas
@@ -13,12 +13,7 @@ module Wee
13
13
  #
14
14
  # Initializes a newly created component.
15
15
  #
16
- # Call this method from your own components' <i>initialize</i> method using
17
- # +super+, before setting up anything else!
18
- #
19
- def initialize() # :notnew:
20
- @decoration = self
21
- @children = nil
16
+ def initialize
22
17
  end
23
18
 
24
19
  #
@@ -33,26 +28,6 @@ module Wee
33
28
  def render(r)
34
29
  end
35
30
 
36
- #
37
- # Process and invoke all callbacks specified for this component and all of
38
- # it's child components.
39
- #
40
- def process_callbacks(callbacks)
41
- callbacks.input_callbacks.each_triggered(self) do |callback, value|
42
- callback.call(value)
43
- end
44
-
45
- # process callbacks of all children
46
- each_child do |child|
47
- child.decoration.process_callbacks(callbacks)
48
- end
49
-
50
- callbacks.action_callbacks.each_triggered(self) do |callback, value|
51
- callback.call
52
- session.send_response(nil) # prematurely end callback processing
53
- end
54
- end
55
-
56
31
  #
57
32
  # Take snapshots of objects that should correctly be backtracked.
58
33
  #
@@ -65,72 +40,60 @@ module Wee
65
40
  # <i>marshal_load</i>). Overwrite them if you want to define special
66
41
  # behaviour.
67
42
  #
68
- # For example if you dynamically add children to your component, you might
69
- # want to backtrack the children array:
70
- #
71
- # def backtrack(state)
72
- # super
73
- # backtrack_children(state)
74
- # end
75
- #
76
43
  # By default only the decoration chain is backtracked. This is
77
44
  # required to correctly backtrack called components. To disable
78
45
  # backtracking of the decorations, change method
79
- # Component#backtrack_decoration to a no-operation:
46
+ # Component#state_decoration to a no-operation:
80
47
  #
81
- # def backtrack_decoration(state)
48
+ # def state_decoration(s)
82
49
  # # nothing here
83
50
  # end
84
51
  #
85
- # [+state+]
52
+ # [+s+]
86
53
  # An object of class State
87
54
  #
88
- def backtrack(state)
89
- backtrack_decoration(state)
90
- each_child do |child|
91
- child.decoration.backtrack(state)
55
+ def state(s)
56
+ state_decoration(s)
57
+ for child in self.children
58
+ child.decoration.state(s)
92
59
  end
93
60
  end
94
61
 
95
- protected
96
-
97
- def backtrack_decoration(state)
98
- state.add_ivar(self, :@decoration, @decoration)
99
- end
100
-
101
- def backtrack_children(state)
102
- state.add_ivar(self, :@children, (@children and @children.dup))
103
- end
104
-
62
+ NO_CHILDREN = [].freeze
63
+ #
64
+ # Return all child components.
105
65
  #
106
- # Iterates over all direct child components.
66
+ # *OVERWRITE* this method and return all child components
67
+ # collected in an array.
107
68
  #
108
- def each_child(&block)
109
- @children.each(&block) if @children
69
+ def children
70
+ return NO_CHILDREN
110
71
  end
111
72
 
112
73
  #
113
- # Add a child to the component. Example:
114
- #
115
- # class YourComponent < Wee::Component
116
- # def initialize
117
- # super()
118
- # add_child ChildComponent.new
119
- # end
120
- # end
121
- #
122
- # If you dynamically add child components to a component at run-time (not in
123
- # initialize), then you should consider to backtrack the children array (of
124
- # course only if you want backtracking at all):
125
- #
126
- # def backtrack(state)
127
- # super
128
- # state.add(self.children)
129
- # end
74
+ # Process and invoke all callbacks specified for this component and all of
75
+ # it's child components.
130
76
  #
131
- def add_child(child)
132
- (@children ||= []) << child
133
- child
77
+ def process_callbacks(callbacks)
78
+ callbacks.input_callbacks.each_triggered(self) do |callback, value|
79
+ callback.call(value)
80
+ end
81
+
82
+ # process callbacks of all children
83
+ for child in self.children
84
+ child.decoration.process_callbacks(callbacks)
85
+ end
86
+
87
+ callbacks.action_callbacks.each_triggered(self) do |callback, value|
88
+ callback.call
89
+ session.send_response(nil) # prematurely end callback processing
90
+ end
91
+ end
92
+
93
+ protected
94
+
95
+ def state_decoration(s)
96
+ s.add_ivar(self, :@decoration, @decoration)
134
97
  end
135
98
 
136
99
  include Wee::DecorationMixin
@@ -4,7 +4,7 @@ module Wee
4
4
 
5
5
  #
6
6
  # Abstract base class of all decorations. Forwards the methods
7
- # #process_callbacks, #render_on and #backtrack to the next decoration in
7
+ # #process_callbacks, #render_on and #state to the next decoration in
8
8
  # the chain. Subclasses should provide special behaviour in these methods,
9
9
  # otherwise the decoration does not make sense.
10
10
  #
@@ -62,16 +62,17 @@ module Wee
62
62
  # answer-decoration has the advantage to be able to call a component more
63
63
  # than once!
64
64
  #
65
- def backtrack(state)
66
- @next.backtrack(state)
67
- state.add_ivar(self, :@next, @next)
65
+ def state(s)
66
+ @next.state(s)
67
+ s.add_ivar(self, :@next, @next)
68
68
  end
69
69
 
70
70
  end # class Decoration
71
71
 
72
72
  module DecorationMixin
73
73
 
74
- attr_accessor :decoration
74
+ def decoration=(d) @decoration = d end
75
+ def decoration() @decoration || self end
75
76
 
76
77
  #
77
78
  # Iterates over all decorations (note that the component itself is excluded).
@@ -95,8 +96,8 @@ module Wee
95
96
  #
96
97
  def add_decoration(d)
97
98
  if d.global?
98
- d.next = @decoration
99
- @decoration = d
99
+ d.next = self.decoration
100
+ self.decoration = d
100
101
  else
101
102
  last_global = nil
102
103
  each_decoration {|i|
@@ -108,8 +109,8 @@ module Wee
108
109
  }
109
110
  if last_global.nil?
110
111
  # no global decorations specified -> add in front
111
- d.next = @decoration
112
- @decoration = d
112
+ d.next = self.decoration
113
+ self.decoration = d
113
114
  else
114
115
  # add after last_global
115
116
  d.next = last_global.next
@@ -127,10 +128,10 @@ module Wee
127
128
  # decoration chain.
128
129
  #
129
130
  def remove_decoration(d)
130
- if d == @decoration # 'd' is in front
131
- @decoration = d.next
131
+ if d == self.decoration # 'd' is in front
132
+ self.decoration = d.next
132
133
  else
133
- last_decoration = @decoration
134
+ last_decoration = self.decoration
134
135
  next_decoration = nil
135
136
  loop do
136
137
  return nil if last_decoration == self or last_decoration.nil?
@@ -161,7 +162,7 @@ module Wee
161
162
 
162
163
  #
163
164
  # A Wee::Delegate breaks the decoration chain and forwards the methods
164
- # #process_callbacks, #render_on and #backtrack to the corresponding *chain*
165
+ # #process_callbacks, #render_on and #state to the corresponding *chain*
165
166
  # method of it's _delegate_ component (a Wee::Component).
166
167
  #
167
168
  class Delegate < Decoration
@@ -191,9 +192,9 @@ module Wee
191
192
  # _delegate_ component. We also take snapshots of all non-visible
192
193
  # components, thus we follow the @next decoration (via super).
193
194
  #
194
- def backtrack(state)
195
+ def state(s)
195
196
  super
196
- @delegate.decoration.backtrack(state)
197
+ @delegate.decoration.state(s)
197
198
  end
198
199
 
199
200
  end # class Delegate
@@ -554,27 +554,26 @@ module Wee
554
554
  # A callback was specified. We have to wrap it inside another
555
555
  # callback, as we want to perform some additional actions.
556
556
  #
557
- name(@canvas.register_callback(:input, proc {|input|
558
- input = [input] unless input.kind_of?(Array)
559
- choosen = input.map {|idx| get_item(idx) }
560
-
561
- if @attributes.has_key?(:multiple)
562
- @callback.call(choosen)
563
- elsif choosen.size > 1
564
- raise "more than one element was choosen from a not-multiple SelectListTag"
565
- else
566
- @callback.call(choosen.first)
567
- end
568
- }))
557
+ name(@canvas.register_callback(:input, method(:handler)) + "[]")
569
558
  end
570
559
 
571
- def get_item(idx)
572
- idx = Integer(idx)
573
- raise IndexError if idx < 0 or idx > @items.size
574
- @items[idx]
560
+ def handler(input)
561
+ choosen = input.map {|idx|
562
+ idx = Integer(idx)
563
+ raise IndexError if idx < 0 or idx > @items.size
564
+ @items[idx]
565
+ }
566
+
567
+ if @attributes.has_key?(:multiple)
568
+ @callback.call(choosen)
569
+ elsif choosen.size > 1
570
+ raise "more than one element was choosen from a not-multiple SelectListTag"
571
+ else
572
+ @callback.call(choosen.first)
573
+ end
575
574
  end
576
575
 
577
- protected :get_item
576
+ protected :handler
578
577
 
579
578
  def with
580
579
  @labels ||= @items.collect {|i| i.to_s}
@@ -14,7 +14,8 @@ module Wee
14
14
  end
15
15
 
16
16
  def render(r); raise end
17
- def backtrack(state); raise end
17
+ def state(s); raise end
18
+
18
19
  def process_callbacks(callbacks); raise end
19
20
 
20
21
  #
@@ -17,7 +17,7 @@ module Wee
17
17
  end
18
18
  end
19
19
 
20
- class RedirectResponse < GenericResponse
20
+ class RedirectResponse < Response
21
21
  LOCATION_HEADER = 'Location'.freeze
22
22
 
23
23
  def initialize(location)
@@ -27,9 +27,9 @@ module Wee
27
27
  end
28
28
  end
29
29
 
30
- class RefreshResponse < GenericResponse
30
+ class RefreshResponse < Response
31
31
  def initialize(message, location, seconds=5)
32
- super(%[<html>
32
+ super([%[<html>
33
33
  <head>
34
34
  <meta http-equiv="REFRESH" content="#{seconds};URL=#{location}">
35
35
  <title>#{message}</title>
@@ -39,7 +39,7 @@ module Wee
39
39
  You are being redirected to <a href="#{location}">#{location}</a>
40
40
  in #{seconds} seconds.
41
41
  </body>
42
- </html>])
42
+ </html>]])
43
43
  end
44
44
  end
45
45
 
@@ -332,8 +332,8 @@ module Wee
332
332
  # and returns it.
333
333
  #
334
334
  def take_snapshot
335
- @root_component.decoration.backtrack(state = Wee::State.new)
336
- return state.freeze
335
+ @root_component.decoration.state(s = Wee::State.new)
336
+ return s.freeze
337
337
  end
338
338
 
339
339
  end # class Session
@@ -4,9 +4,9 @@ module Wee
4
4
  # This class is for backtracking the state of components (or
5
5
  # decorations/presenters). Components that want an undo-facility to be
6
6
  # implemented (triggered for example by a browsers back-button), have to
7
- # overwrite the Component#backtrack method. Class Wee::State simply
7
+ # overwrite the Component#state method. Class Wee::State simply
8
8
  # represents a collection of objects from which snapshots were taken via
9
- # methods take_snapshot.
9
+ # methods take_snapshot.
10
10
  #
11
11
  class State
12
12
  class Snapshot < Struct.new(:object, :snapshot); end