cachetastic 1.5.0 → 1.6.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 (56) hide show
  1. data/doc/classes/ActiveRecord/Base.html +188 -0
  2. data/doc/classes/CGI/Session/CachetasticStore.html +124 -0
  3. data/doc/classes/Cachetastic/Adapters/Base.html +331 -0
  4. data/doc/classes/Cachetastic/Adapters/Drb.html +332 -0
  5. data/doc/classes/Cachetastic/Adapters/File.html +248 -0
  6. data/doc/classes/Cachetastic/Adapters/FileBase.html +309 -0
  7. data/doc/classes/Cachetastic/Adapters/HtmlFile.html +224 -0
  8. data/doc/classes/Cachetastic/Adapters/LocalMemory.html +346 -0
  9. data/doc/classes/Cachetastic/Adapters/Memcache.html +498 -0
  10. data/doc/classes/Cachetastic/Cacheable.html +264 -0
  11. data/doc/classes/Cachetastic/Cacheable/ClassAndInstanceMethods.html +287 -0
  12. data/doc/classes/Cachetastic/Cacheable/ClassOnlyMethods.html +200 -0
  13. data/doc/classes/Cachetastic/Caches/Base.html +672 -0
  14. data/doc/classes/Cachetastic/Caches/Base/RegisteredCaches.html +179 -0
  15. data/doc/classes/Cachetastic/Caches/MackSessionCache.html +119 -0
  16. data/doc/classes/Cachetastic/Caches/PageCache.html +121 -0
  17. data/doc/classes/Cachetastic/Caches/RailsSessionCache.html +154 -0
  18. data/doc/classes/Cachetastic/Connection.html +212 -0
  19. data/doc/classes/Cachetastic/Errors/UnsupportedAdapter.html +146 -0
  20. data/doc/classes/Cachetastic/Logger.html +189 -0
  21. data/doc/classes/Object.html +152 -0
  22. data/doc/created.rid +1 -0
  23. data/doc/files/README.html +207 -0
  24. data/doc/files/lib/adapters/cachetastic_adapters_base_rb.html +139 -0
  25. data/doc/files/lib/adapters/cachetastic_adapters_drb_rb.html +115 -0
  26. data/doc/files/lib/adapters/cachetastic_adapters_file_base_rb.html +109 -0
  27. data/doc/files/lib/adapters/cachetastic_adapters_file_rb.html +121 -0
  28. data/doc/files/lib/adapters/cachetastic_adapters_html_file_rb.html +137 -0
  29. data/doc/files/lib/adapters/cachetastic_adapters_local_memory_rb.html +109 -0
  30. data/doc/files/lib/adapters/cachetastic_adapters_memcache_rb.html +127 -0
  31. data/doc/files/lib/adapters/cachetastic_adapters_store_object_rb.html +101 -0
  32. data/doc/files/lib/caches/cachetastic_caches_base_rb.html +108 -0
  33. data/doc/files/lib/caches/cachetastic_caches_mack_session_cache_rb.html +107 -0
  34. data/doc/files/lib/caches/cachetastic_caches_page_cache_rb.html +109 -0
  35. data/doc/files/lib/caches/cachetastic_caches_rails_session_cache_rb.html +107 -0
  36. data/doc/files/lib/cachetastic_cacheable_rb.html +101 -0
  37. data/doc/files/lib/cachetastic_connection_rb.html +107 -0
  38. data/doc/files/lib/cachetastic_logger_rb.html +107 -0
  39. data/doc/files/lib/cachetastic_rb.html +222 -0
  40. data/doc/files/lib/errors/cachetastic_errors_unsupported_adapter_rb.html +101 -0
  41. data/doc/files/lib/rails_extensions/cachetastic_active_record_base_rb.html +101 -0
  42. data/doc/files/lib/rails_extensions/cgi_session_cachetastic_store_rb.html +109 -0
  43. data/doc/files/lib/ruby_extensions/object_rb.html +101 -0
  44. data/doc/fr_class_index.html +47 -0
  45. data/doc/fr_file_index.html +47 -0
  46. data/doc/fr_method_index.html +100 -0
  47. data/doc/index.html +24 -0
  48. data/doc/rdoc-style.css +208 -0
  49. data/lib/cachetastic.rb +21 -23
  50. data/lib/cachetastic_cacheable.rb +202 -0
  51. data/lib/rails_extensions/cachetastic_active_record_base.rb +12 -39
  52. data/lib/ruby_extensions/object.rb +8 -0
  53. data/test/active_record_test.rb +8 -8
  54. data/test/cacheable_test.rb +72 -0
  55. metadata +52 -2
  56. data/lib/helpers/cachetastic_helpers_active_record.rb +0 -46
@@ -0,0 +1,200 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Module: Cachetastic::Cacheable::ClassOnlyMethods</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Module</strong></td>
53
+ <td class="class-name-in-header">Cachetastic::Cacheable::ClassOnlyMethods</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../../../files/lib/cachetastic_cacheable_rb.html">
59
+ lib/cachetastic_cacheable.rb
60
+ </a>
61
+ <br />
62
+ </td>
63
+ </tr>
64
+
65
+ </table>
66
+ </div>
67
+ <!-- banner header -->
68
+
69
+ <div id="bodyContent">
70
+
71
+
72
+
73
+ <div id="contextContent">
74
+
75
+
76
+
77
+ </div>
78
+
79
+ <div id="method-list">
80
+ <h3 class="section-bar">Methods</h3>
81
+
82
+ <div class="name-list">
83
+ <a href="#M000053">delete_from_cache</a>&nbsp;&nbsp;
84
+ <a href="#M000052">get_from_cache</a>&nbsp;&nbsp;
85
+ <a href="#M000054">set_into_cache</a>&nbsp;&nbsp;
86
+ </div>
87
+ </div>
88
+
89
+ </div>
90
+
91
+
92
+ <!-- if includes -->
93
+
94
+ <div id="section">
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+ <!-- if method_list -->
104
+ <div id="methods">
105
+ <h3 class="section-bar">Public Instance methods</h3>
106
+
107
+ <div id="method-M000053" class="method-detail">
108
+ <a name="M000053"></a>
109
+
110
+ <div class="method-heading">
111
+ <a href="#M000053" class="method-signature">
112
+ <span class="method-name">delete_from_cache</span><span class="method-args">(key)</span>
113
+ </a>
114
+ </div>
115
+
116
+ <div class="method-description">
117
+ <p>
118
+ Deletes an object from the cache for a given key.
119
+ </p>
120
+ <p><a class="source-toggle" href="#"
121
+ onclick="toggleCode('M000053-source');return false;">[Source]</a></p>
122
+ <div class="method-source-code" id="M000053-source">
123
+ <pre>
124
+ <span class="ruby-comment cmt"># File lib/cachetastic_cacheable.rb, line 191</span>
125
+ 191: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">delete_from_cache</span>(<span class="ruby-identifier">key</span>)
126
+ 192: <span class="ruby-identifier">cache_class</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">key</span>)
127
+ 193: <span class="ruby-keyword kw">end</span>
128
+ </pre>
129
+ </div>
130
+ </div>
131
+ </div>
132
+
133
+ <div id="method-M000052" class="method-detail">
134
+ <a name="M000052"></a>
135
+
136
+ <div class="method-heading">
137
+ <a href="#M000052" class="method-signature">
138
+ <span class="method-name">get_from_cache</span><span class="method-args">(key, &amp;block)</span>
139
+ </a>
140
+ </div>
141
+
142
+ <div class="method-description">
143
+ <p>
144
+ Returns an object from the cache for a given key. If the object returned is
145
+ nil and the self_populate parameter is true then the key will be used to
146
+ try and find the object in the database, set the object into the cache, and
147
+ then return the object.
148
+ </p>
149
+ <p><a class="source-toggle" href="#"
150
+ onclick="toggleCode('M000052-source');return false;">[Source]</a></p>
151
+ <div class="method-source-code" id="M000052-source">
152
+ <pre>
153
+ <span class="ruby-comment cmt"># File lib/cachetastic_cacheable.rb, line 186</span>
154
+ 186: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">get_from_cache</span>(<span class="ruby-identifier">key</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
155
+ 187: <span class="ruby-identifier">cache_class</span>.<span class="ruby-identifier">get</span>(<span class="ruby-identifier">key</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
156
+ 188: <span class="ruby-keyword kw">end</span>
157
+ </pre>
158
+ </div>
159
+ </div>
160
+ </div>
161
+
162
+ <div id="method-M000054" class="method-detail">
163
+ <a name="M000054"></a>
164
+
165
+ <div class="method-heading">
166
+ <a href="#M000054" class="method-signature">
167
+ <span class="method-name">set_into_cache</span><span class="method-args">(key, value, expiry = 0)</span>
168
+ </a>
169
+ </div>
170
+
171
+ <div class="method-description">
172
+ <p>
173
+ Sets an object into the cache for a given key.
174
+ </p>
175
+ <p><a class="source-toggle" href="#"
176
+ onclick="toggleCode('M000054-source');return false;">[Source]</a></p>
177
+ <div class="method-source-code" id="M000054-source">
178
+ <pre>
179
+ <span class="ruby-comment cmt"># File lib/cachetastic_cacheable.rb, line 196</span>
180
+ 196: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">set_into_cache</span>(<span class="ruby-identifier">key</span>, <span class="ruby-identifier">value</span>, <span class="ruby-identifier">expiry</span> = <span class="ruby-value">0</span>)
181
+ 197: <span class="ruby-identifier">cache_class</span>.<span class="ruby-identifier">set</span>(<span class="ruby-identifier">key</span>, <span class="ruby-identifier">value</span>, <span class="ruby-identifier">expiry</span>)
182
+ 198: <span class="ruby-keyword kw">end</span>
183
+ </pre>
184
+ </div>
185
+ </div>
186
+ </div>
187
+
188
+
189
+ </div>
190
+
191
+
192
+ </div>
193
+
194
+
195
+ <div id="validator-badges">
196
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
197
+ </div>
198
+
199
+ </body>
200
+ </html>
@@ -0,0 +1,672 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Class: Cachetastic::Caches::Base</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Class</strong></td>
53
+ <td class="class-name-in-header">Cachetastic::Caches::Base</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../../../files/lib/caches/cachetastic_caches_base_rb.html">
59
+ lib/caches/cachetastic_caches_base.rb
60
+ </a>
61
+ <br />
62
+ </td>
63
+ </tr>
64
+
65
+ <tr class="top-aligned-row">
66
+ <td><strong>Parent:</strong></td>
67
+ <td>
68
+ <a href="../../Object.html">
69
+ Object
70
+ </a>
71
+ </td>
72
+ </tr>
73
+ </table>
74
+ </div>
75
+ <!-- banner header -->
76
+
77
+ <div id="bodyContent">
78
+
79
+
80
+
81
+ <div id="contextContent">
82
+
83
+ <div id="description">
84
+ <p>
85
+ When creating a new &#8216;Cache&#8217; this class should be extended. Once
86
+ extended you&#8216;ll only need to override just the methods that are
87
+ different for your cache.
88
+ </p>
89
+ <pre>
90
+ class MyAwesomeCache &lt; Cachetastic::Caches::Base
91
+ end
92
+ MyAwesomeCache.set(1, &quot;One&quot;)
93
+ MyAwesomeCache.get(1) # =&gt; &quot;One&quot;
94
+ MyAwesomeCache.update(1, &quot;One!!&quot;)
95
+ MyAwesomeCache.get(1) # =&gt; &quot;One!!&quot;
96
+ MyAwesomeCache.delete(1)
97
+ MyAwesomeCache.get(1) # =&gt; nil
98
+
99
+ class MyAwesomeCache &lt; Cachetastic::Caches::Base
100
+ class &lt;&lt; self
101
+ def get(key)
102
+ super(key) do
103
+ set(key, key * 10)
104
+ end
105
+ end
106
+ end
107
+ end
108
+ MyAwesomeCache.set(1, &quot;One&quot;)
109
+ MyAwesomeCache.get(1) # =&gt; &quot;One&quot;
110
+ MyAwesomeCache.delete(1)
111
+ MyAwesomeCache.get(1) # =&gt; 10
112
+ </pre>
113
+
114
+ </div>
115
+
116
+
117
+ </div>
118
+
119
+ <div id="method-list">
120
+ <h3 class="section-bar">Methods</h3>
121
+
122
+ <div class="name-list">
123
+ <a href="#M000064">adapter</a>&nbsp;&nbsp;
124
+ <a href="#M000067">adapter_supported?</a>&nbsp;&nbsp;
125
+ <a href="#M000056">all_registered_caches</a>&nbsp;&nbsp;
126
+ <a href="#M000063">cache_name</a>&nbsp;&nbsp;
127
+ <a href="#M000070">calculate_expiry_time</a>&nbsp;&nbsp;
128
+ <a href="#M000059">delete</a>&nbsp;&nbsp;
129
+ <a href="#M000060">expire_all</a>&nbsp;&nbsp;
130
+ <a href="#M000057">get</a>&nbsp;&nbsp;
131
+ <a href="#M000065">logger</a>&nbsp;&nbsp;
132
+ <a href="#M000068">marshall</a>&nbsp;&nbsp;
133
+ <a href="#M000061">populate_all</a>&nbsp;&nbsp;
134
+ <a href="#M000058">set</a>&nbsp;&nbsp;
135
+ <a href="#M000062">stats</a>&nbsp;&nbsp;
136
+ <a href="#M000069">unmarshall</a>&nbsp;&nbsp;
137
+ <a href="#M000066">unsupported_adapters</a>&nbsp;&nbsp;
138
+ </div>
139
+ </div>
140
+
141
+ </div>
142
+
143
+
144
+ <!-- if includes -->
145
+
146
+ <div id="section">
147
+
148
+ <div id="class-list">
149
+ <h3 class="section-bar">Classes and Modules</h3>
150
+
151
+ Class <a href="Base/RegisteredCaches.html" class="link">Cachetastic::Caches::Base::RegisteredCaches</a><br />
152
+
153
+ </div>
154
+
155
+
156
+ <div id="aliases-list">
157
+ <h3 class="section-bar">External Aliases</h3>
158
+
159
+ <div class="name-list">
160
+ <table summary="aliases">
161
+ <tr class="top-aligned-row context-row">
162
+ <td class="context-item-name">set</td>
163
+ <td>-&gt;</td>
164
+ <td class="context-item-value">put</td>
165
+ </tr>
166
+ </table>
167
+ </div>
168
+ </div>
169
+
170
+
171
+
172
+
173
+
174
+ <!-- if method_list -->
175
+ <div id="methods">
176
+ <h3 class="section-bar">Public Class methods</h3>
177
+
178
+ <div id="method-M000064" class="method-detail">
179
+ <a name="M000064"></a>
180
+
181
+ <div class="method-heading">
182
+ <a href="#M000064" class="method-signature">
183
+ <span class="method-name">adapter</span><span class="method-args">()</span>
184
+ </a>
185
+ </div>
186
+
187
+ <div class="method-description">
188
+ <p>
189
+ Returns the underlying <a
190
+ href="../Adapters/Base.html">Cachetastic::Adapters::Base</a> for this
191
+ cache.
192
+ </p>
193
+ <p><a class="source-toggle" href="#"
194
+ onclick="toggleCode('M000064-source');return false;">[Source]</a></p>
195
+ <div class="method-source-code" id="M000064-source">
196
+ <pre>
197
+ <span class="ruby-comment cmt"># File lib/caches/cachetastic_caches_base.rb, line 141</span>
198
+ 141: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">adapter</span>
199
+ 142: <span class="ruby-identifier">a</span> = <span class="ruby-identifier">cache_conn_instance</span>.<span class="ruby-identifier">get</span>(<span class="ruby-identifier">cache_name</span>)
200
+ 143: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">adapter_supported?</span>(<span class="ruby-identifier">a</span>.<span class="ruby-identifier">class</span>)
201
+ 144: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">a</span>
202
+ 145: <span class="ruby-keyword kw">else</span>
203
+ 146: <span class="ruby-identifier">raise</span> <span class="ruby-constant">Cachetastic</span><span class="ruby-operator">::</span><span class="ruby-constant">Errors</span><span class="ruby-operator">::</span><span class="ruby-constant">UnsupportedAdapter</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">cache_name</span>, <span class="ruby-identifier">a</span>.<span class="ruby-identifier">class</span>)
204
+ 147: <span class="ruby-keyword kw">end</span>
205
+ 148: <span class="ruby-keyword kw">end</span>
206
+ </pre>
207
+ </div>
208
+ </div>
209
+ </div>
210
+
211
+ <div id="method-M000067" class="method-detail">
212
+ <a name="M000067"></a>
213
+
214
+ <div class="method-heading">
215
+ <a href="#M000067" class="method-signature">
216
+ <span class="method-name">adapter_supported?</span><span class="method-args">(a = cache_conn_instance.get(cache_name).class)</span>
217
+ </a>
218
+ </div>
219
+
220
+ <div class="method-description">
221
+ <p>
222
+ Returns true/false on whether the <a href="Base.html#M000064">adapter</a>
223
+ you want to use is supported for the cache.
224
+ </p>
225
+ <p><a class="source-toggle" href="#"
226
+ onclick="toggleCode('M000067-source');return false;">[Source]</a></p>
227
+ <div class="method-source-code" id="M000067-source">
228
+ <pre>
229
+ <span class="ruby-comment cmt"># File lib/caches/cachetastic_caches_base.rb, line 163</span>
230
+ 163: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">adapter_supported?</span>(<span class="ruby-identifier">a</span> = <span class="ruby-identifier">cache_conn_instance</span>.<span class="ruby-identifier">get</span>(<span class="ruby-identifier">cache_name</span>).<span class="ruby-identifier">class</span>)
231
+ 164: <span class="ruby-keyword kw">return</span> <span class="ruby-operator">!</span><span class="ruby-identifier">unsupported_adapters</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">a</span>)
232
+ 165: <span class="ruby-keyword kw">end</span>
233
+ </pre>
234
+ </div>
235
+ </div>
236
+ </div>
237
+
238
+ <div id="method-M000056" class="method-detail">
239
+ <a name="M000056"></a>
240
+
241
+ <div class="method-heading">
242
+ <a href="#M000056" class="method-signature">
243
+ <span class="method-name">all_registered_caches</span><span class="method-args">()</span>
244
+ </a>
245
+ </div>
246
+
247
+ <div class="method-description">
248
+ <p>
249
+ Returns a list of all registered caches in the system.
250
+ </p>
251
+ <p><a class="source-toggle" href="#"
252
+ onclick="toggleCode('M000056-source');return false;">[Source]</a></p>
253
+ <div class="method-source-code" id="M000056-source">
254
+ <pre>
255
+ <span class="ruby-comment cmt"># File lib/caches/cachetastic_caches_base.rb, line 48</span>
256
+ 48: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">all_registered_caches</span>
257
+ 49: <span class="ruby-constant">RegisteredCaches</span>.<span class="ruby-identifier">instance</span>.<span class="ruby-identifier">list</span>
258
+ 50: <span class="ruby-keyword kw">end</span>
259
+ </pre>
260
+ </div>
261
+ </div>
262
+ </div>
263
+
264
+ <div id="method-M000063" class="method-detail">
265
+ <a name="M000063"></a>
266
+
267
+ <div class="method-heading">
268
+ <a href="#M000063" class="method-signature">
269
+ <span class="method-name">cache_name</span><span class="method-args">()</span>
270
+ </a>
271
+ </div>
272
+
273
+ <div class="method-description">
274
+ <p>
275
+ Returns a &#8216;methodize&#8217; version of the cache&#8216;s class name.
276
+ This gets used in logging, namespacing, and as the key in the <a
277
+ href="../Connection.html">Cachetastic::Connection</a> class.
278
+ </p>
279
+ <pre>
280
+ MyAwesomeCache.cache # =&gt; &quot;my_awesome_cache&quot;
281
+ Cachetastic::Caches::Base # =&gt; &quot;cachetastic_caches_base&quot;
282
+ </pre>
283
+ <p><a class="source-toggle" href="#"
284
+ onclick="toggleCode('M000063-source');return false;">[Source]</a></p>
285
+ <div class="method-source-code" id="M000063-source">
286
+ <pre>
287
+ <span class="ruby-comment cmt"># File lib/caches/cachetastic_caches_base.rb, line 136</span>
288
+ 136: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">cache_name</span>
289
+ 137: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">name</span>.<span class="ruby-identifier">methodize</span>
290
+ 138: <span class="ruby-keyword kw">end</span>
291
+ </pre>
292
+ </div>
293
+ </div>
294
+ </div>
295
+
296
+ <div id="method-M000059" class="method-detail">
297
+ <a name="M000059"></a>
298
+
299
+ <div class="method-heading">
300
+ <a href="#M000059" class="method-signature">
301
+ <span class="method-name">delete</span><span class="method-args">(key, delay = 0)</span>
302
+ </a>
303
+ </div>
304
+
305
+ <div class="method-description">
306
+ <p>
307
+ Deletes an object from the cache. The optional delay parameter sets an
308
+ offset, in seconds, for when the object should <a
309
+ href="Base.html#M000057">get</a> deleted. The default of 0 means the object
310
+ gets deleted right away.
311
+ </p>
312
+ <p><a class="source-toggle" href="#"
313
+ onclick="toggleCode('M000059-source');return false;">[Source]</a></p>
314
+ <div class="method-source-code" id="M000059-source">
315
+ <pre>
316
+ <span class="ruby-comment cmt"># File lib/caches/cachetastic_caches_base.rb, line 108</span>
317
+ 108: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">delete</span>(<span class="ruby-identifier">key</span>, <span class="ruby-identifier">delay</span> = <span class="ruby-value">0</span>)
318
+ 109: <span class="ruby-identifier">do_with_logging</span>(<span class="ruby-identifier">:delete</span>, <span class="ruby-identifier">key</span>) <span class="ruby-keyword kw">do</span>
319
+ 110: <span class="ruby-identifier">adapter</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">key</span>.<span class="ruby-identifier">to_s</span>, <span class="ruby-identifier">delay</span>)
320
+ 111: <span class="ruby-keyword kw">end</span>
321
+ 112: <span class="ruby-keyword kw">end</span>
322
+ </pre>
323
+ </div>
324
+ </div>
325
+ </div>
326
+
327
+ <div id="method-M000060" class="method-detail">
328
+ <a name="M000060"></a>
329
+
330
+ <div class="method-heading">
331
+ <a href="#M000060" class="method-signature">
332
+ <span class="method-name">expire_all</span><span class="method-args">()</span>
333
+ </a>
334
+ </div>
335
+
336
+ <div class="method-description">
337
+ <p>
338
+ Expires all objects for this cache.
339
+ </p>
340
+ <p><a class="source-toggle" href="#"
341
+ onclick="toggleCode('M000060-source');return false;">[Source]</a></p>
342
+ <div class="method-source-code" id="M000060-source">
343
+ <pre>
344
+ <span class="ruby-comment cmt"># File lib/caches/cachetastic_caches_base.rb, line 115</span>
345
+ 115: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">expire_all</span>
346
+ 116: <span class="ruby-identifier">adapter</span>.<span class="ruby-identifier">expire_all</span>
347
+ 117: <span class="ruby-identifier">logger</span>.<span class="ruby-identifier">info</span>(<span class="ruby-value str">''</span>, <span class="ruby-value str">''</span>, <span class="ruby-identifier">:expired</span>, <span class="ruby-identifier">cache_name</span>)
348
+ 118: <span class="ruby-keyword kw">end</span>
349
+ </pre>
350
+ </div>
351
+ </div>
352
+ </div>
353
+
354
+ <div id="method-M000057" class="method-detail">
355
+ <a name="M000057"></a>
356
+
357
+ <div class="method-heading">
358
+ <a href="#M000057" class="method-signature">
359
+ <span class="method-name">get</span><span class="method-args">(key) {|key if block_given?| ...}</span>
360
+ </a>
361
+ </div>
362
+
363
+ <div class="method-description">
364
+ <p>
365
+ Returns an object from the cache for a given key. If the object comes back
366
+ as nil and a block is given that block will be run and the results of the
367
+ block will be run. This can be used to JIT caches, just make sure in the
368
+ block to call the <a href="Base.html#M000058">set</a> method because the
369
+ results of the block are not automatically cached.
370
+ </p>
371
+ <p><a class="source-toggle" href="#"
372
+ onclick="toggleCode('M000057-source');return false;">[Source]</a></p>
373
+ <div class="method-source-code" id="M000057-source">
374
+ <pre>
375
+ <span class="ruby-comment cmt"># File lib/caches/cachetastic_caches_base.rb, line 58</span>
376
+ 58: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">get</span>(<span class="ruby-identifier">key</span>)
377
+ 59: <span class="ruby-identifier">res</span> = <span class="ruby-keyword kw">nil</span>
378
+ 60: <span class="ruby-identifier">do_with_logging</span>(<span class="ruby-identifier">:get</span>, <span class="ruby-identifier">key</span>) <span class="ruby-keyword kw">do</span>
379
+ 61: <span class="ruby-identifier">retryable</span>(<span class="ruby-identifier">:on</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-constant">ArgumentError</span>) <span class="ruby-keyword kw">do</span>
380
+ 62: <span class="ruby-keyword kw">begin</span>
381
+ 63: <span class="ruby-identifier">res</span> = <span class="ruby-identifier">adapter</span>.<span class="ruby-identifier">get</span>(<span class="ruby-identifier">key</span>.<span class="ruby-identifier">to_s</span>)
382
+ 64: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">res</span>.<span class="ruby-identifier">nil?</span>
383
+ 65: <span class="ruby-identifier">res</span> = <span class="ruby-keyword kw">yield</span> <span class="ruby-identifier">key</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">block_given?</span>
384
+ 66: <span class="ruby-keyword kw">else</span>
385
+ 67: <span class="ruby-identifier">res</span> = <span class="ruby-identifier">unmarshall</span>(<span class="ruby-identifier">res</span>)
386
+ 68: <span class="ruby-keyword kw">end</span>
387
+ 69: <span class="ruby-identifier">res</span>
388
+ 70: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">ArgumentError</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
389
+ 71: <span class="ruby-identifier">m</span> = <span class="ruby-identifier">e</span>.<span class="ruby-identifier">message</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp re">/class\/module .*/</span>)
390
+ 72: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">m</span>
391
+ 73: <span class="ruby-identifier">m</span> = <span class="ruby-identifier">m</span>.<span class="ruby-identifier">to_s</span>
392
+ 74: <span class="ruby-identifier">m</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-value str">&quot;class/module&quot;</span>, <span class="ruby-value str">''</span>)
393
+ 75: <span class="ruby-identifier">m</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-value str">&quot;(ArgumentError)&quot;</span>, <span class="ruby-value str">''</span>)
394
+ 76: <span class="ruby-identifier">require</span> <span class="ruby-identifier">m</span>.<span class="ruby-identifier">strip</span>.<span class="ruby-identifier">underscore</span>
395
+ 77: <span class="ruby-identifier">raise</span> <span class="ruby-identifier">e</span>
396
+ 78: <span class="ruby-keyword kw">end</span>
397
+ 79: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
398
+ 80: <span class="ruby-identifier">raise</span> <span class="ruby-identifier">e</span>
399
+ 81: <span class="ruby-keyword kw">end</span>
400
+ 82: <span class="ruby-keyword kw">end</span>
401
+ 83: <span class="ruby-keyword kw">end</span>
402
+ 84: <span class="ruby-identifier">res</span>
403
+ 85: <span class="ruby-keyword kw">end</span>
404
+ </pre>
405
+ </div>
406
+ </div>
407
+ </div>
408
+
409
+ <div id="method-M000065" class="method-detail">
410
+ <a name="M000065"></a>
411
+
412
+ <div class="method-heading">
413
+ <a href="#M000065" class="method-signature">
414
+ <span class="method-name">logger</span><span class="method-args">()</span>
415
+ </a>
416
+ </div>
417
+
418
+ <div class="method-description">
419
+ <p>
420
+ Returns the <a href="../Logger.html">Cachetastic::Logger</a> for the
421
+ underlying <a href="../Adapters/Base.html">Cachetastic::Adapters::Base</a>.
422
+ </p>
423
+ <p><a class="source-toggle" href="#"
424
+ onclick="toggleCode('M000065-source');return false;">[Source]</a></p>
425
+ <div class="method-source-code" id="M000065-source">
426
+ <pre>
427
+ <span class="ruby-comment cmt"># File lib/caches/cachetastic_caches_base.rb, line 151</span>
428
+ 151: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">logger</span>
429
+ 152: <span class="ruby-identifier">adapter</span>.<span class="ruby-identifier">logger</span>
430
+ 153: <span class="ruby-keyword kw">end</span>
431
+ </pre>
432
+ </div>
433
+ </div>
434
+ </div>
435
+
436
+ <div id="method-M000068" class="method-detail">
437
+ <a name="M000068"></a>
438
+
439
+ <div class="method-heading">
440
+ <a href="#M000068" class="method-signature">
441
+ <span class="method-name">marshall</span><span class="method-args">(value)</span>
442
+ </a>
443
+ </div>
444
+
445
+ <div class="method-description">
446
+ <p><a class="source-toggle" href="#"
447
+ onclick="toggleCode('M000068-source');return false;">[Source]</a></p>
448
+ <div class="method-source-code" id="M000068-source">
449
+ <pre>
450
+ <span class="ruby-comment cmt"># File lib/caches/cachetastic_caches_base.rb, line 167</span>
451
+ 167: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">marshall</span>(<span class="ruby-identifier">value</span>)
452
+ 168: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">value</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">value</span>.<span class="ruby-identifier">nil?</span>
453
+ 169: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">adapter</span>.<span class="ruby-identifier">all_options</span>[<span class="ruby-value str">&quot;marshall_method&quot;</span>]
454
+ 170: <span class="ruby-keyword kw">when</span> <span class="ruby-value str">&quot;yaml&quot;</span>
455
+ 171: <span class="ruby-constant">YAML</span>.<span class="ruby-identifier">dump</span>(<span class="ruby-identifier">value</span>)
456
+ 172: <span class="ruby-keyword kw">when</span> <span class="ruby-value str">&quot;ruby&quot;</span>
457
+ 173: <span class="ruby-constant">Marshal</span>.<span class="ruby-identifier">dump</span>(<span class="ruby-identifier">value</span>)
458
+ 174: <span class="ruby-keyword kw">else</span>
459
+ 175: <span class="ruby-identifier">value</span>
460
+ 176: <span class="ruby-keyword kw">end</span>
461
+ 177: <span class="ruby-keyword kw">end</span>
462
+ </pre>
463
+ </div>
464
+ </div>
465
+ </div>
466
+
467
+ <div id="method-M000061" class="method-detail">
468
+ <a name="M000061"></a>
469
+
470
+ <div class="method-heading">
471
+ <a href="#M000061" class="method-signature">
472
+ <span class="method-name">populate_all</span><span class="method-args">()</span>
473
+ </a>
474
+ </div>
475
+
476
+ <div class="method-description">
477
+ <p>
478
+ Raises a MethodNotImplemented exception. This method should be overridden
479
+ in the child class to enable a populating the cache with all things that
480
+ should be in there.
481
+ </p>
482
+ <p><a class="source-toggle" href="#"
483
+ onclick="toggleCode('M000061-source');return false;">[Source]</a></p>
484
+ <div class="method-source-code" id="M000061-source">
485
+ <pre>
486
+ <span class="ruby-comment cmt"># File lib/caches/cachetastic_caches_base.rb, line 123</span>
487
+ 123: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">populate_all</span>
488
+ 124: <span class="ruby-identifier">raise</span> <span class="ruby-constant">MethodNotImplemented</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">&quot;populate_all&quot;</span>)
489
+ 125: <span class="ruby-keyword kw">end</span>
490
+ </pre>
491
+ </div>
492
+ </div>
493
+ </div>
494
+
495
+ <div id="method-M000058" class="method-detail">
496
+ <a name="M000058"></a>
497
+
498
+ <div class="method-heading">
499
+ <a href="#M000058" class="method-signature">
500
+ <span class="method-name">set</span><span class="method-args">(key, value, expiry = (adapter.all_options[&quot;default_expiry&quot;] || 0))</span>
501
+ </a>
502
+ </div>
503
+
504
+ <div class="method-description">
505
+ <p>
506
+ Set a particular object info the cache for the given key. An optional third
507
+ parameter sets the expiry time for the object in the cache. The default for
508
+ this expiry is <a href="Base.html#M000058">set</a> as either 0, meaning it
509
+ never expires, or if there&#8216;s a default_expiry time <a
510
+ href="Base.html#M000058">set</a> in the config file, that file will be
511
+ used. If there is an expiry_swing <a href="Base.html#M000058">set</a> in
512
+ the config file it will be +/- to the expiry time. See also: <a
513
+ href="Base.html#M000070">calculate_expiry_time</a>
514
+ </p>
515
+ <p><a class="source-toggle" href="#"
516
+ onclick="toggleCode('M000058-source');return false;">[Source]</a></p>
517
+ <div class="method-source-code" id="M000058-source">
518
+ <pre>
519
+ <span class="ruby-comment cmt"># File lib/caches/cachetastic_caches_base.rb, line 94</span>
520
+ 94: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">set</span>(<span class="ruby-identifier">key</span>, <span class="ruby-identifier">value</span>, <span class="ruby-identifier">expiry</span> = (<span class="ruby-identifier">adapter</span>.<span class="ruby-identifier">all_options</span>[<span class="ruby-value str">&quot;default_expiry&quot;</span>] <span class="ruby-operator">||</span> <span class="ruby-value">0</span>))
521
+ 95: <span class="ruby-identifier">do_with_logging</span>(<span class="ruby-identifier">:set</span>, <span class="ruby-identifier">key</span>) <span class="ruby-keyword kw">do</span>
522
+ 96: <span class="ruby-identifier">expiry</span> = <span class="ruby-identifier">calculate_expiry_time</span>(<span class="ruby-identifier">expiry</span>)
523
+ 97: <span class="ruby-identifier">adapter</span>.<span class="ruby-identifier">set</span>(<span class="ruby-identifier">key</span>.<span class="ruby-identifier">to_s</span>, <span class="ruby-identifier">marshall</span>(<span class="ruby-identifier">value</span>), <span class="ruby-identifier">expiry</span>.<span class="ruby-identifier">to_i</span>)
524
+ 98: <span class="ruby-identifier">logger</span>.<span class="ruby-identifier">info</span>(<span class="ruby-value str">''</span>, <span class="ruby-value str">''</span>, <span class="ruby-identifier">:expiry</span>, <span class="ruby-identifier">cache_name</span>, <span class="ruby-identifier">key</span>, <span class="ruby-identifier">expiry</span>.<span class="ruby-identifier">to_i</span>)
525
+ 99: <span class="ruby-identifier">value</span>
526
+ 100: <span class="ruby-keyword kw">end</span>
527
+ 101: <span class="ruby-keyword kw">end</span>
528
+ </pre>
529
+ </div>
530
+ </div>
531
+ </div>
532
+
533
+ <div id="method-M000062" class="method-detail">
534
+ <a name="M000062"></a>
535
+
536
+ <div class="method-heading">
537
+ <a href="#M000062" class="method-signature">
538
+ <span class="method-name">stats</span><span class="method-args">()</span>
539
+ </a>
540
+ </div>
541
+
542
+ <div class="method-description">
543
+ <p>
544
+ A convenience method that returns statistics for the underlying <a
545
+ href="../Adapters/Base.html">Cachetastic::Adapters::Base</a> for the cache.
546
+ </p>
547
+ <p><a class="source-toggle" href="#"
548
+ onclick="toggleCode('M000062-source');return false;">[Source]</a></p>
549
+ <div class="method-source-code" id="M000062-source">
550
+ <pre>
551
+ <span class="ruby-comment cmt"># File lib/caches/cachetastic_caches_base.rb, line 128</span>
552
+ 128: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">stats</span>
553
+ 129: <span class="ruby-identifier">adapter</span>.<span class="ruby-identifier">stats</span>
554
+ 130: <span class="ruby-keyword kw">end</span>
555
+ </pre>
556
+ </div>
557
+ </div>
558
+ </div>
559
+
560
+ <div id="method-M000069" class="method-detail">
561
+ <a name="M000069"></a>
562
+
563
+ <div class="method-heading">
564
+ <a href="#M000069" class="method-signature">
565
+ <span class="method-name">unmarshall</span><span class="method-args">(value)</span>
566
+ </a>
567
+ </div>
568
+
569
+ <div class="method-description">
570
+ <p><a class="source-toggle" href="#"
571
+ onclick="toggleCode('M000069-source');return false;">[Source]</a></p>
572
+ <div class="method-source-code" id="M000069-source">
573
+ <pre>
574
+ <span class="ruby-comment cmt"># File lib/caches/cachetastic_caches_base.rb, line 179</span>
575
+ 179: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">unmarshall</span>(<span class="ruby-identifier">value</span>)
576
+ 180: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">value</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">value</span>.<span class="ruby-identifier">nil?</span>
577
+ 181: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">adapter</span>.<span class="ruby-identifier">all_options</span>[<span class="ruby-value str">&quot;marshall_method&quot;</span>]
578
+ 182: <span class="ruby-keyword kw">when</span> <span class="ruby-value str">&quot;yaml&quot;</span>
579
+ 183: <span class="ruby-constant">YAML</span>.<span class="ruby-identifier">load</span>(<span class="ruby-identifier">value</span>)
580
+ 184: <span class="ruby-keyword kw">when</span> <span class="ruby-value str">&quot;ruby&quot;</span>
581
+ 185: <span class="ruby-constant">Marshal</span>.<span class="ruby-identifier">load</span>(<span class="ruby-identifier">value</span>)
582
+ 186: <span class="ruby-keyword kw">else</span>
583
+ 187: <span class="ruby-identifier">value</span>
584
+ 188: <span class="ruby-keyword kw">end</span>
585
+ 189: <span class="ruby-keyword kw">end</span>
586
+ </pre>
587
+ </div>
588
+ </div>
589
+ </div>
590
+
591
+ <div id="method-M000066" class="method-detail">
592
+ <a name="M000066"></a>
593
+
594
+ <div class="method-heading">
595
+ <a href="#M000066" class="method-signature">
596
+ <span class="method-name">unsupported_adapters</span><span class="method-args">()</span>
597
+ </a>
598
+ </div>
599
+
600
+ <div class="method-description">
601
+ <p>
602
+ Returns an array of unsupported adapters for this cache. Defaults to an
603
+ empty array which will let any <a href="Base.html#M000064">adapter</a> be
604
+ used by the cache. Override in your specific cache to prevent certain
605
+ adapters.
606
+ </p>
607
+ <p><a class="source-toggle" href="#"
608
+ onclick="toggleCode('M000066-source');return false;">[Source]</a></p>
609
+ <div class="method-source-code" id="M000066-source">
610
+ <pre>
611
+ <span class="ruby-comment cmt"># File lib/caches/cachetastic_caches_base.rb, line 158</span>
612
+ 158: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">unsupported_adapters</span>
613
+ 159: []
614
+ 160: <span class="ruby-keyword kw">end</span>
615
+ </pre>
616
+ </div>
617
+ </div>
618
+ </div>
619
+
620
+ <h3 class="section-bar">Private Class methods</h3>
621
+
622
+ <div id="method-M000070" class="method-detail">
623
+ <a name="M000070"></a>
624
+
625
+ <div class="method-heading">
626
+ <a href="#M000070" class="method-signature">
627
+ <span class="method-name">calculate_expiry_time</span><span class="method-args">(expiry)</span>
628
+ </a>
629
+ </div>
630
+
631
+ <div class="method-description">
632
+ <p>
633
+ If the expiry time is <a href="Base.html#M000058">set</a> to 60 minutes and
634
+ the expiry_swing time is <a href="Base.html#M000058">set</a> to 15 minutes,
635
+ this method will return a number between 45 minutes and 75 minutes.
636
+ </p>
637
+ <p><a class="source-toggle" href="#"
638
+ onclick="toggleCode('M000070-source');return false;">[Source]</a></p>
639
+ <div class="method-source-code" id="M000070-source">
640
+ <pre>
641
+ <span class="ruby-comment cmt"># File lib/caches/cachetastic_caches_base.rb, line 194</span>
642
+ 194: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">calculate_expiry_time</span>(<span class="ruby-identifier">expiry</span>) <span class="ruby-comment cmt"># :doc:</span>
643
+ 195: <span class="ruby-identifier">exp_swing</span> = <span class="ruby-identifier">adapter</span>.<span class="ruby-identifier">all_options</span>[<span class="ruby-value str">&quot;expiry_swing&quot;</span>]
644
+ 196: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">exp_swing</span>
645
+ 197: <span class="ruby-identifier">swing</span> = <span class="ruby-identifier">rand</span>(<span class="ruby-identifier">exp_swing</span>.<span class="ruby-identifier">to_i</span>)
646
+ 198: <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">rand</span>(<span class="ruby-value">2</span>)
647
+ 199: <span class="ruby-keyword kw">when</span> <span class="ruby-value">0</span>
648
+ 200: <span class="ruby-identifier">expiry</span> = (<span class="ruby-identifier">expiry</span>.<span class="ruby-identifier">to_i</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">swing</span>)
649
+ 201: <span class="ruby-keyword kw">when</span> <span class="ruby-value">1</span>
650
+ 202: <span class="ruby-identifier">expiry</span> = (<span class="ruby-identifier">expiry</span>.<span class="ruby-identifier">to_i</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">swing</span>)
651
+ 203: <span class="ruby-keyword kw">end</span>
652
+ 204: <span class="ruby-keyword kw">end</span>
653
+ 205: <span class="ruby-identifier">expiry</span>
654
+ 206: <span class="ruby-keyword kw">end</span>
655
+ </pre>
656
+ </div>
657
+ </div>
658
+ </div>
659
+
660
+
661
+ </div>
662
+
663
+
664
+ </div>
665
+
666
+
667
+ <div id="validator-badges">
668
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
669
+ </div>
670
+
671
+ </body>
672
+ </html>