ovto 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.gitmodules +3 -0
  4. data/CHANGELOG.md +22 -0
  5. data/Gemfile +7 -0
  6. data/Gemfile.lock +57 -0
  7. data/LICENSE.txt +44 -0
  8. data/README.md +84 -0
  9. data/Rakefile +41 -0
  10. data/book/README.md +1 -0
  11. data/book/SUMMARY.md +13 -0
  12. data/book/api/actions.md +77 -0
  13. data/book/api/app.md +86 -0
  14. data/book/api/component.md +175 -0
  15. data/book/api/fetch.md +42 -0
  16. data/book/api/state.md +97 -0
  17. data/book/guides/debugging.md +23 -0
  18. data/book/guides/development.md +11 -0
  19. data/book/guides/tutorial.md +288 -0
  20. data/book/screenshot.png +0 -0
  21. data/docs/api/Ovto/Actions.html +135 -0
  22. data/docs/api/Ovto/App.html +531 -0
  23. data/docs/api/Ovto/Component/MoreThanOneNode.html +135 -0
  24. data/docs/api/Ovto/Component.html +350 -0
  25. data/docs/api/Ovto/Runtime.html +315 -0
  26. data/docs/api/Ovto/State/MissingValue.html +135 -0
  27. data/docs/api/Ovto/State/UnknownKey.html +135 -0
  28. data/docs/api/Ovto/State.html +699 -0
  29. data/docs/api/Ovto/WiredActions.html +343 -0
  30. data/docs/api/Ovto.html +319 -0
  31. data/docs/api/_index.html +229 -0
  32. data/docs/api/actions.html +398 -0
  33. data/docs/api/app.html +411 -0
  34. data/docs/api/class_list.html +51 -0
  35. data/docs/api/component.html +469 -0
  36. data/docs/api/css/common.css +1 -0
  37. data/docs/api/css/full_list.css +58 -0
  38. data/docs/api/css/style.css +499 -0
  39. data/docs/api/file.README.html +162 -0
  40. data/docs/api/file_list.html +56 -0
  41. data/docs/api/frames.html +17 -0
  42. data/docs/api/index.html +162 -0
  43. data/docs/api/js/app.js +248 -0
  44. data/docs/api/js/full_list.js +216 -0
  45. data/docs/api/js/jquery.js +4 -0
  46. data/docs/api/method_list.html +243 -0
  47. data/docs/api/state.html +430 -0
  48. data/docs/api/top-level-namespace.html +110 -0
  49. data/docs/gitbook/fonts/fontawesome/FontAwesome.otf +0 -0
  50. data/docs/gitbook/fonts/fontawesome/fontawesome-webfont.eot +0 -0
  51. data/docs/gitbook/fonts/fontawesome/fontawesome-webfont.svg +685 -0
  52. data/docs/gitbook/fonts/fontawesome/fontawesome-webfont.ttf +0 -0
  53. data/docs/gitbook/fonts/fontawesome/fontawesome-webfont.woff +0 -0
  54. data/docs/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 +0 -0
  55. data/docs/gitbook/gitbook-plugin-fontsettings/fontsettings.js +240 -0
  56. data/docs/gitbook/gitbook-plugin-fontsettings/website.css +291 -0
  57. data/docs/gitbook/gitbook-plugin-highlight/ebook.css +135 -0
  58. data/docs/gitbook/gitbook-plugin-highlight/website.css +434 -0
  59. data/docs/gitbook/gitbook-plugin-lunr/lunr.min.js +7 -0
  60. data/docs/gitbook/gitbook-plugin-lunr/search-lunr.js +59 -0
  61. data/docs/gitbook/gitbook-plugin-search/lunr.min.js +7 -0
  62. data/docs/gitbook/gitbook-plugin-search/search-engine.js +50 -0
  63. data/docs/gitbook/gitbook-plugin-search/search.css +35 -0
  64. data/docs/gitbook/gitbook-plugin-search/search.js +213 -0
  65. data/docs/gitbook/gitbook-plugin-sharing/buttons.js +90 -0
  66. data/docs/gitbook/gitbook.js +4 -0
  67. data/docs/gitbook/images/apple-touch-icon-precomposed-152.png +0 -0
  68. data/docs/gitbook/images/favicon.ico +0 -0
  69. data/docs/gitbook/style.css +9 -0
  70. data/docs/gitbook/theme.js +4 -0
  71. data/docs/guides/debugging.html +355 -0
  72. data/docs/guides/development.html +361 -0
  73. data/docs/guides/tutorial.html +571 -0
  74. data/docs/index.html +422 -0
  75. data/docs/screenshot.png +0 -0
  76. data/docs/search_index.json +1 -0
  77. data/example/sinatra/Gemfile +6 -0
  78. data/example/sinatra/Gemfile.lock +59 -0
  79. data/example/sinatra/README.md +21 -0
  80. data/example/sinatra/app.rb +18 -0
  81. data/example/sinatra/config.ru +30 -0
  82. data/example/sinatra/ovto/app.rb +171 -0
  83. data/example/sinatra/public/style.css +4 -0
  84. data/example/sinatra/public/todomvc-app-css_index.css +376 -0
  85. data/example/sinatra/public/todomvc-common_base.css +141 -0
  86. data/example/sinatra/views/index.erb +21 -0
  87. data/example/static/Gemfile +3 -0
  88. data/example/static/Gemfile.lock +30 -0
  89. data/example/static/README.md +10 -0
  90. data/example/static/Rakefile +4 -0
  91. data/example/static/app.js +24808 -0
  92. data/example/static/app.rb +43 -0
  93. data/example/static/index.html +11 -0
  94. data/lib/ovto/actions.rb +10 -0
  95. data/lib/ovto/app.rb +58 -0
  96. data/lib/ovto/component.rb +191 -0
  97. data/lib/ovto/fetch.rb +53 -0
  98. data/lib/ovto/runtime.rb +388 -0
  99. data/lib/ovto/state.rb +69 -0
  100. data/lib/ovto/version.rb +3 -0
  101. data/lib/ovto/wired_actions.rb +33 -0
  102. data/lib/ovto.rb +50 -0
  103. data/ovto.gemspec +22 -0
  104. data/screenshot.png +0 -0
  105. metadata +161 -0
@@ -0,0 +1,243 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
5
+ <meta charset="utf-8" />
6
+
7
+ <link rel="stylesheet" href="css/full_list.css" type="text/css" media="screen" charset="utf-8" />
8
+
9
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
10
+
11
+
12
+
13
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
14
+
15
+ <script type="text/javascript" charset="utf-8" src="js/full_list.js"></script>
16
+
17
+
18
+ <title>Method List</title>
19
+ <base id="base_target" target="_parent" />
20
+ </head>
21
+ <body>
22
+ <div id="content">
23
+ <div class="fixed_header">
24
+ <h1 id="full_list_header">Method List</h1>
25
+ <div id="full_list_nav">
26
+
27
+ <span><a target="_self" href="class_list.html">
28
+ Classes
29
+ </a></span>
30
+
31
+ <span><a target="_self" href="method_list.html">
32
+ Methods
33
+ </a></span>
34
+
35
+ <span><a target="_self" href="file_list.html">
36
+ Files
37
+ </a></span>
38
+
39
+ </div>
40
+
41
+ <div id="search">Search: <input type="text" /></div>
42
+ </div>
43
+
44
+ <ul id="full_list" class="method">
45
+
46
+
47
+ <li class="odd ">
48
+ <div class="item">
49
+ <span class='object_link'><a href="Ovto/State.html#[]-instance_method" title="Ovto::State#[] (method)">#[]</a></span>
50
+ <small>Ovto::State</small>
51
+ </div>
52
+ </li>
53
+
54
+
55
+ <li class="even ">
56
+ <div class="item">
57
+ <span class='object_link'><a href="Ovto/App.html#_set_state-instance_method" title="Ovto::App#_set_state (method)">#_set_state</a></span>
58
+ <small>Ovto::App</small>
59
+ </div>
60
+ </li>
61
+
62
+
63
+ <li class="odd ">
64
+ <div class="item">
65
+ <span class='object_link'><a href="Ovto/Component.html#hash_to_js_obj-class_method" title="Ovto::Component.hash_to_js_obj (method)">hash_to_js_obj</a></span>
66
+ <small>Ovto::Component</small>
67
+ </div>
68
+ </li>
69
+
70
+
71
+ <li class="even ">
72
+ <div class="item">
73
+ <span class='object_link'><a href="Ovto/State.html#inherited-class_method" title="Ovto::State.inherited (method)">inherited</a></span>
74
+ <small>Ovto::State</small>
75
+ </div>
76
+ </li>
77
+
78
+
79
+ <li class="odd ">
80
+ <div class="item">
81
+ <span class='object_link'><a href="Ovto/App.html#initialize-instance_method" title="Ovto::App#initialize (method)">#initialize</a></span>
82
+ <small>Ovto::App</small>
83
+ </div>
84
+ </li>
85
+
86
+
87
+ <li class="even ">
88
+ <div class="item">
89
+ <span class='object_link'><a href="Ovto/State.html#initialize-instance_method" title="Ovto::State#initialize (method)">#initialize</a></span>
90
+ <small>Ovto::State</small>
91
+ </div>
92
+ </li>
93
+
94
+
95
+ <li class="odd ">
96
+ <div class="item">
97
+ <span class='object_link'><a href="Ovto/Component.html#initialize-instance_method" title="Ovto::Component#initialize (method)">#initialize</a></span>
98
+ <small>Ovto::Component</small>
99
+ </div>
100
+ </li>
101
+
102
+
103
+ <li class="even ">
104
+ <div class="item">
105
+ <span class='object_link'><a href="Ovto/Runtime.html#initialize-instance_method" title="Ovto::Runtime#initialize (method)">#initialize</a></span>
106
+ <small>Ovto::Runtime</small>
107
+ </div>
108
+ </li>
109
+
110
+
111
+ <li class="odd ">
112
+ <div class="item">
113
+ <span class='object_link'><a href="Ovto/WiredActions.html#initialize-instance_method" title="Ovto::WiredActions#initialize (method)">#initialize</a></span>
114
+ <small>Ovto::WiredActions</small>
115
+ </div>
116
+ </li>
117
+
118
+
119
+ <li class="even ">
120
+ <div class="item">
121
+ <span class='object_link'><a href="Ovto.html#inspect-class_method" title="Ovto.inspect (method)">inspect</a></span>
122
+ <small>Ovto</small>
123
+ </div>
124
+ </li>
125
+
126
+
127
+ <li class="odd ">
128
+ <div class="item">
129
+ <span class='object_link'><a href="Ovto/State.html#inspect-instance_method" title="Ovto::State#inspect (method)">#inspect</a></span>
130
+ <small>Ovto::State</small>
131
+ </div>
132
+ </li>
133
+
134
+
135
+ <li class="even ">
136
+ <div class="item">
137
+ <span class='object_link'><a href="Ovto/State.html#item-class_method" title="Ovto::State.item (method)">item</a></span>
138
+ <small>Ovto::State</small>
139
+ </div>
140
+ </li>
141
+
142
+
143
+ <li class="odd ">
144
+ <div class="item">
145
+ <span class='object_link'><a href="Ovto/State.html#item_specs-class_method" title="Ovto::State.item_specs (method)">item_specs</a></span>
146
+ <small>Ovto::State</small>
147
+ </div>
148
+ </li>
149
+
150
+
151
+ <li class="even ">
152
+ <div class="item">
153
+ <span class='object_link'><a href="Ovto.html#log_error-class_method" title="Ovto.log_error (method)">log_error</a></span>
154
+ <small>Ovto</small>
155
+ </div>
156
+ </li>
157
+
158
+
159
+ <li class="odd ">
160
+ <div class="item">
161
+ <span class='object_link'><a href="Ovto/State.html#merge-instance_method" title="Ovto::State#merge (method)">#merge</a></span>
162
+ <small>Ovto::State</small>
163
+ </div>
164
+ </li>
165
+
166
+
167
+ <li class="even ">
168
+ <div class="item">
169
+ <span class='object_link'><a href="Ovto/WiredActions.html#method_missing-instance_method" title="Ovto::WiredActions#method_missing (method)">#method_missing</a></span>
170
+ <small>Ovto::WiredActions</small>
171
+ </div>
172
+ </li>
173
+
174
+
175
+ <li class="odd ">
176
+ <div class="item">
177
+ <span class='object_link'><a href="Ovto/Component.html#render-instance_method" title="Ovto::Component#render (method)">#render</a></span>
178
+ <small>Ovto::Component</small>
179
+ </div>
180
+ </li>
181
+
182
+
183
+ <li class="even ">
184
+ <div class="item">
185
+ <span class='object_link'><a href="Ovto/WiredActions.html#respond_to%3F-instance_method" title="Ovto::WiredActions#respond_to? (method)">#respond_to?</a></span>
186
+ <small>Ovto::WiredActions</small>
187
+ </div>
188
+ </li>
189
+
190
+
191
+ <li class="odd ">
192
+ <div class="item">
193
+ <span class='object_link'><a href="Ovto/App.html#run-instance_method" title="Ovto::App#run (method)">#run</a></span>
194
+ <small>Ovto::App</small>
195
+ </div>
196
+ </li>
197
+
198
+
199
+ <li class="even ">
200
+ <div class="item">
201
+ <span class='object_link'><a href="Ovto/Runtime.html#run-instance_method" title="Ovto::Runtime#run (method)">#run</a></span>
202
+ <small>Ovto::Runtime</small>
203
+ </div>
204
+ </li>
205
+
206
+
207
+ <li class="odd ">
208
+ <div class="item">
209
+ <span class='object_link'><a href="Ovto/App.html#run-class_method" title="Ovto::App.run (method)">run</a></span>
210
+ <small>Ovto::App</small>
211
+ </div>
212
+ </li>
213
+
214
+
215
+ <li class="even ">
216
+ <div class="item">
217
+ <span class='object_link'><a href="Ovto/Runtime.html#scheduleRender-instance_method" title="Ovto::Runtime#scheduleRender (method)">#scheduleRender</a></span>
218
+ <small>Ovto::Runtime</small>
219
+ </div>
220
+ </li>
221
+
222
+
223
+ <li class="odd ">
224
+ <div class="item">
225
+ <span class='object_link'><a href="Ovto/App.html#state-instance_method" title="Ovto::App#state (method)">#state</a></span>
226
+ <small>Ovto::App</small>
227
+ </div>
228
+ </li>
229
+
230
+
231
+ <li class="even ">
232
+ <div class="item">
233
+ <span class='object_link'><a href="Ovto/State.html#to_h-instance_method" title="Ovto::State#to_h (method)">#to_h</a></span>
234
+ <small>Ovto::State</small>
235
+ </div>
236
+ </li>
237
+
238
+
239
+
240
+ </ul>
241
+ </div>
242
+ </body>
243
+ </html>
@@ -0,0 +1,430 @@
1
+
2
+ <!DOCTYPE HTML>
3
+ <html lang="" >
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
7
+ <title>State · GitBook</title>
8
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
9
+ <meta name="description" content="">
10
+ <meta name="generator" content="GitBook 3.2.3">
11
+
12
+
13
+
14
+
15
+ <link rel="stylesheet" href="../gitbook/style.css">
16
+
17
+
18
+
19
+
20
+ <link rel="stylesheet" href="../gitbook/gitbook-plugin-highlight/website.css">
21
+
22
+
23
+
24
+ <link rel="stylesheet" href="../gitbook/gitbook-plugin-search/search.css">
25
+
26
+
27
+
28
+ <link rel="stylesheet" href="../gitbook/gitbook-plugin-fontsettings/website.css">
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+ <meta name="HandheldFriendly" content="true"/>
53
+ <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
54
+ <meta name="apple-mobile-web-app-capable" content="yes">
55
+ <meta name="apple-mobile-web-app-status-bar-style" content="black">
56
+ <link rel="apple-touch-icon-precomposed" sizes="152x152" href="../gitbook/images/apple-touch-icon-precomposed-152.png">
57
+ <link rel="shortcut icon" href="../gitbook/images/favicon.ico" type="image/x-icon">
58
+
59
+
60
+ <link rel="next" href="actions.html" />
61
+
62
+
63
+ <link rel="prev" href="app.html" />
64
+
65
+
66
+ </head>
67
+ <body>
68
+
69
+ <div class="book">
70
+ <div class="book-summary">
71
+
72
+
73
+ <div id="book-search-input" role="search">
74
+ <input type="text" placeholder="Type to search" />
75
+ </div>
76
+
77
+
78
+ <nav role="navigation">
79
+
80
+
81
+
82
+ <ul class="summary">
83
+
84
+
85
+
86
+
87
+
88
+
89
+
90
+
91
+
92
+ <li class="chapter " data-level="1.1" data-path="../">
93
+
94
+ <a href="../">
95
+
96
+
97
+ Introduction
98
+
99
+ </a>
100
+
101
+
102
+
103
+ </li>
104
+
105
+ <li class="chapter " data-level="1.2" data-path="../guides/tutorial.html">
106
+
107
+ <a href="../guides/tutorial.html">
108
+
109
+
110
+ Getting Started
111
+
112
+ </a>
113
+
114
+
115
+
116
+ </li>
117
+
118
+ <li class="chapter " data-level="1.3" >
119
+
120
+ <span>
121
+
122
+
123
+ API
124
+
125
+ </span>
126
+
127
+
128
+
129
+ <ul class="articles">
130
+
131
+
132
+ <li class="chapter " data-level="1.3.1" data-path="app.html">
133
+
134
+ <a href="app.html">
135
+
136
+
137
+ App
138
+
139
+ </a>
140
+
141
+
142
+
143
+ </li>
144
+
145
+ <li class="chapter active" data-level="1.3.2" data-path="state.html">
146
+
147
+ <a href="state.html">
148
+
149
+
150
+ State
151
+
152
+ </a>
153
+
154
+
155
+
156
+ </li>
157
+
158
+ <li class="chapter " data-level="1.3.3" data-path="actions.html">
159
+
160
+ <a href="actions.html">
161
+
162
+
163
+ Actions
164
+
165
+ </a>
166
+
167
+
168
+
169
+ </li>
170
+
171
+ <li class="chapter " data-level="1.3.4" data-path="component.html">
172
+
173
+ <a href="component.html">
174
+
175
+
176
+ Component
177
+
178
+ </a>
179
+
180
+
181
+
182
+ </li>
183
+
184
+
185
+ </ul>
186
+
187
+ </li>
188
+
189
+ <li class="chapter " data-level="1.4" >
190
+
191
+ <span>
192
+
193
+
194
+ Guides
195
+
196
+ </span>
197
+
198
+
199
+
200
+ <ul class="articles">
201
+
202
+
203
+ <li class="chapter " data-level="1.4.1" data-path="../guides/debugging.html">
204
+
205
+ <a href="../guides/debugging.html">
206
+
207
+
208
+ Debugging
209
+
210
+ </a>
211
+
212
+
213
+
214
+ </li>
215
+
216
+ <li class="chapter " data-level="1.4.2" data-path="../guides/development.html">
217
+
218
+ <a href="../guides/development.html">
219
+
220
+
221
+ Development
222
+
223
+ </a>
224
+
225
+
226
+
227
+ </li>
228
+
229
+
230
+ </ul>
231
+
232
+ </li>
233
+
234
+
235
+
236
+
237
+ <li class="divider"></li>
238
+
239
+ <li>
240
+ <a href="https://www.gitbook.com" target="blank" class="gitbook-link">
241
+ Published with GitBook
242
+ </a>
243
+ </li>
244
+ </ul>
245
+
246
+
247
+ </nav>
248
+
249
+
250
+ </div>
251
+
252
+ <div class="book-body">
253
+
254
+ <div class="body-inner">
255
+
256
+
257
+
258
+ <div class="book-header" role="navigation">
259
+
260
+
261
+ <!-- Title -->
262
+ <h1>
263
+ <i class="fa fa-circle-o-notch fa-spin"></i>
264
+ <a href=".." >State</a>
265
+ </h1>
266
+ </div>
267
+
268
+
269
+
270
+
271
+ <div class="page-wrapper" tabindex="-1" role="main">
272
+ <div class="page-inner">
273
+
274
+ <div id="book-search-results">
275
+ <div class="search-noresults">
276
+
277
+ <section class="normal markdown-section">
278
+
279
+ <h1 id="ovtostate">Ovto::State</h1>
280
+ <p><code>Ovto::State</code> is like a hash, but members are accessible with name rather than <code>[]</code>.</p>
281
+ <h2 id="example">Example</h2>
282
+ <pre><code class="lang-rb"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">State</span> &lt; Ovto::State</span>
283
+ item <span class="hljs-symbol">:foo</span>
284
+ item <span class="hljs-symbol">:bar</span>
285
+ <span class="hljs-keyword">end</span>
286
+
287
+ state = State.new(<span class="hljs-symbol">foo:</span> <span class="hljs-number">1</span>, <span class="hljs-symbol">bar:</span> <span class="hljs-number">2</span>)
288
+ state.foo <span class="hljs-comment">#=&gt; 1</span>
289
+ state.bar <span class="hljs-comment">#=&gt; 2</span>
290
+ </code></pre>
291
+ <h2 id="default-value">Default value</h2>
292
+ <pre><code class="lang-rb"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">State</span> &lt; Ovto::State</span>
293
+ item <span class="hljs-symbol">:foo</span>, <span class="hljs-symbol">default:</span> <span class="hljs-number">1</span>
294
+ item <span class="hljs-symbol">:bar</span>, <span class="hljs-symbol">default:</span> <span class="hljs-number">2</span>
295
+ <span class="hljs-keyword">end</span>
296
+
297
+ state = State.new
298
+ state.foo <span class="hljs-comment">#=&gt; 1</span>
299
+ state.bar <span class="hljs-comment">#=&gt; 2</span>
300
+ </code></pre>
301
+ <h2 id="immutable">Immutable</h2>
302
+ <p>State objects are immutable. i.e. you cannot update value of a key. Instead, use <code>State#merge</code>.</p>
303
+ <pre><code class="lang-rb">state = State.new(<span class="hljs-symbol">foo:</span> <span class="hljs-number">1</span>, <span class="hljs-symbol">bar:</span> <span class="hljs-number">2</span>)
304
+ new_state = state.merge(<span class="hljs-symbol">bar:</span> <span class="hljs-number">3</span>)
305
+ new_state.foo <span class="hljs-comment">#=&gt; 1</span>
306
+ new_state.bar <span class="hljs-comment">#=&gt; 3</span>
307
+ </code></pre>
308
+ <h2 id="nesting-state">Nesting state</h2>
309
+ <p>For practical apps, you can nest State like this.</p>
310
+ <pre><code class="lang-rb"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Book</span> &lt; Ovto::State</span>
311
+ item <span class="hljs-symbol">:title</span>
312
+ item <span class="hljs-symbol">:author</span>
313
+ <span class="hljs-keyword">end</span>
314
+
315
+ <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">State</span> &lt; Ovto::State</span>
316
+ item <span class="hljs-symbol">:books</span>, []
317
+ <span class="hljs-keyword">end</span>
318
+
319
+ book = Book.new(<span class="hljs-string">&apos;Hello world&apos;</span>, <span class="hljs-string">&apos;taro&apos;</span>)
320
+ state = State.new(<span class="hljs-symbol">books:</span> [book])
321
+ </code></pre>
322
+ <h2 id="defining-instance-methods-of-state">Defining instance methods of state</h2>
323
+ <p>You can define instance methods of state.</p>
324
+ <pre><code class="lang-rb"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Book</span> &lt; Ovto::State</span>
325
+ item <span class="hljs-symbol">:title</span>
326
+ item <span class="hljs-symbol">:author</span>
327
+
328
+ <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">to_text</span></span>
329
+ <span class="hljs-string">&quot;<span class="hljs-subst">#{<span class="hljs-keyword">self</span>.title}</span> (<span class="hljs-subst">#{<span class="hljs-keyword">self</span>.author}</span>)&quot;</span>
330
+ <span class="hljs-keyword">end</span>
331
+ <span class="hljs-keyword">end</span>
332
+
333
+ book = Book.new(<span class="hljs-string">&apos;Hello world&apos;</span>, <span class="hljs-string">&apos;taro&apos;</span>)
334
+ book.to_text <span class="hljs-comment">#=&gt; &quot;Hello world (taro)&quot;</span>
335
+ </code></pre>
336
+ <h2 id="defining-class-methods-of-state">Defining class methods of state</h2>
337
+ <p>Ovto does not have a class like <code>StateList</code>. Just use Array to represent a list of state.</p>
338
+ <p>You can define class methods to manipulate a list of state.</p>
339
+ <pre><code class="lang-rb"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Book</span> &lt; Ovto::State</span>
340
+ item <span class="hljs-symbol">:title</span>
341
+ item <span class="hljs-symbol">:author</span>
342
+
343
+ <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">self</span>.<span class="hljs-title">of_author</span><span class="hljs-params">(books, author)</span></span>
344
+ books.select{|x| x.author == author}
345
+ <span class="hljs-keyword">end</span>
346
+ <span class="hljs-keyword">end</span>
347
+
348
+ <span class="hljs-comment"># Example</span>
349
+ taro_books = Book.of_author(books, <span class="hljs-string">&quot;taro&quot;</span>)
350
+ </code></pre>
351
+
352
+
353
+ </section>
354
+
355
+ </div>
356
+ <div class="search-results">
357
+ <div class="has-results">
358
+
359
+ <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
360
+ <ul class="search-results-list"></ul>
361
+
362
+ </div>
363
+ <div class="no-results">
364
+
365
+ <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
366
+
367
+ </div>
368
+ </div>
369
+ </div>
370
+
371
+ </div>
372
+ </div>
373
+
374
+ </div>
375
+
376
+
377
+
378
+ <a href="app.html" class="navigation navigation-prev " aria-label="Previous page: App">
379
+ <i class="fa fa-angle-left"></i>
380
+ </a>
381
+
382
+
383
+ <a href="actions.html" class="navigation navigation-next " aria-label="Next page: Actions">
384
+ <i class="fa fa-angle-right"></i>
385
+ </a>
386
+
387
+
388
+
389
+ </div>
390
+
391
+ <script>
392
+ var gitbook = gitbook || [];
393
+ gitbook.push(function() {
394
+ gitbook.page.hasChanged({"page":{"title":"State","level":"1.3.2","depth":2,"next":{"title":"Actions","level":"1.3.3","depth":2,"path":"api/actions.md","ref":"api/actions.md","articles":[]},"previous":{"title":"App","level":"1.3.1","depth":2,"path":"api/app.md","ref":"api/app.md","articles":[]},"dir":"ltr"},"config":{"gitbook":"*","theme":"default","variables":{},"plugins":[],"pluginsConfig":{"highlight":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"}},"file":{"path":"api/state.md","mtime":"2018-05-11T06:21:35.000Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2018-06-01T12:07:18.151Z"},"basePath":"..","book":{"language":""}});
395
+ });
396
+ </script>
397
+ </div>
398
+
399
+
400
+ <script src="../gitbook/gitbook.js"></script>
401
+ <script src="../gitbook/theme.js"></script>
402
+
403
+
404
+ <script src="../gitbook/gitbook-plugin-search/search-engine.js"></script>
405
+
406
+
407
+
408
+ <script src="../gitbook/gitbook-plugin-search/search.js"></script>
409
+
410
+
411
+
412
+ <script src="../gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
413
+
414
+
415
+
416
+ <script src="../gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
417
+
418
+
419
+
420
+ <script src="../gitbook/gitbook-plugin-sharing/buttons.js"></script>
421
+
422
+
423
+
424
+ <script src="../gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
425
+
426
+
427
+
428
+ </body>
429
+ </html>
430
+