optiflag 0.6 → 0.6.5

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 (128) hide show
  1. data/ReleaseNotes.txt +35 -0
  2. data/doc/classes/OptiFlag.html +439 -0
  3. data/doc/classes/OptiFlag.src/M000001.html +49 -0
  4. data/doc/classes/OptiFlag.src/M000002.html +49 -0
  5. data/doc/classes/OptiFlag.src/M000003.html +30 -0
  6. data/doc/classes/OptiFlag/Flagset.html +459 -0
  7. data/doc/classes/OptiFlag/Flagset.src/M000003.html +45 -0
  8. data/doc/classes/OptiFlag/Flagset.src/M000004.html +45 -0
  9. data/doc/classes/OptiFlag/Flagset.src/M000005.html +18 -0
  10. data/doc/classes/OptiFlag/Flagset.src/M000006.html +20 -0
  11. data/doc/classes/OptiFlag/Flagset.src/M000007.html +35 -0
  12. data/doc/classes/OptiFlag/Flagset.src/M000008.html +23 -0
  13. data/doc/classes/OptiFlag/Flagset.src/M000009.html +24 -0
  14. data/doc/classes/OptiFlag/Flagset.src/M000010.html +28 -0
  15. data/doc/classes/OptiFlag/Flagset.src/M000011.html +20 -0
  16. data/doc/classes/OptiFlag/Flagset.src/M000012.html +24 -0
  17. data/doc/classes/OptiFlag/Flagset.src/M000013.html +24 -0
  18. data/doc/classes/OptiFlag/Flagset.src/M000014.html +32 -0
  19. data/doc/classes/OptiFlag/Flagset.src/M000015.html +25 -0
  20. data/doc/classes/OptiFlag/Flagset.src/M000016.html +53 -0
  21. data/doc/classes/OptiFlag/Flagset.src/M000017.html +53 -0
  22. data/doc/classes/OptiFlag/Flagset/EachFlag.html +930 -0
  23. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000024.html +36 -0
  24. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000025.html +18 -0
  25. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000026.html +36 -0
  26. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000027.html +36 -0
  27. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000028.html +18 -0
  28. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000029.html +18 -0
  29. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000030.html +19 -0
  30. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000031.html +19 -0
  31. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000032.html +18 -0
  32. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000033.html +18 -0
  33. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000034.html +18 -0
  34. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000035.html +22 -0
  35. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000036.html +19 -0
  36. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000037.html +18 -0
  37. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000038.html +18 -0
  38. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000039.html +18 -0
  39. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000040.html +18 -0
  40. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000041.html +18 -0
  41. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000042.html +18 -0
  42. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000043.html +19 -0
  43. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000044.html +18 -0
  44. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000045.html +19 -0
  45. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000046.html +18 -0
  46. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000047.html +18 -0
  47. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000048.html +18 -0
  48. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000049.html +18 -0
  49. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000050.html +18 -0
  50. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000051.html +18 -0
  51. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000052.html +20 -0
  52. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000053.html +18 -0
  53. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000054.html +18 -0
  54. data/doc/classes/OptiFlag/Flagset/EachFlag.src/M000055.html +22 -0
  55. data/doc/classes/OptiFlag/Flagset/Errors.html +192 -0
  56. data/doc/classes/OptiFlag/Flagset/Errors.src/M000021.html +18 -0
  57. data/doc/classes/OptiFlag/Flagset/Errors.src/M000022.html +19 -0
  58. data/doc/classes/OptiFlag/Flagset/Errors.src/M000023.html +18 -0
  59. data/doc/classes/OptiFlag/Flagset/Errors.src/M000024.html +18 -0
  60. data/doc/classes/OptiFlag/Flagset/Errors.src/M000025.html +19 -0
  61. data/doc/classes/OptiFlag/Flagset/Errors.src/M000026.html +36 -0
  62. data/doc/classes/OptiFlag/Flagset/Help.html +125 -0
  63. data/doc/classes/OptiFlag/Flagset/Help/Bundle.html +160 -0
  64. data/doc/classes/OptiFlag/Flagset/Help/Bundle.src/M000018.html +18 -0
  65. data/doc/classes/OptiFlag/Flagset/Help/Bundle.src/M000019.html +18 -0
  66. data/doc/classes/OptiFlag/Flagset/Help/StandardHelpBundle.html +118 -0
  67. data/doc/classes/OptiFlag/Flagset/NewInterface.html +296 -0
  68. data/doc/classes/OptiFlag/Flagset/NewInterface.src/M000017.html +18 -0
  69. data/doc/classes/OptiFlag/Flagset/NewInterface.src/M000018.html +18 -0
  70. data/doc/classes/OptiFlag/Flagset/NewInterface.src/M000019.html +18 -0
  71. data/doc/classes/OptiFlag/Flagset/NewInterface.src/M000020.html +18 -0
  72. data/doc/classes/OptiFlag/Flagset/NewInterface.src/M000021.html +18 -0
  73. data/doc/classes/OptiFlag/Flagset/NewInterface.src/M000022.html +18 -0
  74. data/doc/classes/OptiFlag/Flagset/NewInterface.src/M000023.html +18 -0
  75. data/doc/created.rid +1 -0
  76. data/doc/files/optiflag-help_rb.html +101 -0
  77. data/doc/files/optiflag-parse_rb.html +101 -0
  78. data/doc/files/optiflag_rb.html +167 -0
  79. data/doc/files/optiflag_rb.src/M000001.html +18 -0
  80. data/doc/fr_class_index.html +34 -0
  81. data/doc/fr_file_index.html +29 -0
  82. data/doc/fr_method_index.html +82 -0
  83. data/doc/index.html +24 -0
  84. data/doc/rdoc-style.css +208 -0
  85. data/examples/example_1.rb +21 -0
  86. data/examples/example_1_1.rb +21 -0
  87. data/{doc/example → examples}/example_1_2.rb +8 -8
  88. data/examples/example_2.rb +31 -0
  89. data/{doc/example → examples}/example_2_1.rb +4 -4
  90. data/{doc/example → examples}/example_2_2.rb +7 -5
  91. data/{doc/example → examples}/example_2_3.rb +9 -9
  92. data/{doc/example → examples}/example_2_4.rb +4 -4
  93. data/{doc/example → examples}/example_2_5.rb +4 -4
  94. data/{doc/example → examples}/example_2_6.rb +6 -6
  95. data/{doc/example → examples}/example_3.rb +7 -6
  96. data/examples/example_6.rb +20 -0
  97. data/{doc/example → examples}/example_7.rb +5 -4
  98. data/examples/example_8.rb +26 -0
  99. data/optiflag-help.rb +42 -0
  100. data/optiflag-parse.rb +281 -0
  101. data/optiflag.gemspec +4 -3
  102. data/optiflag.rb +972 -0
  103. data/quick.rb +12 -0
  104. data/{test → testcases}/tc_advanced_usage_helping.rb +4 -0
  105. data/{test → testcases}/tc_basic_alternate_forms.rb +0 -0
  106. data/{test → testcases}/tc_basic_char_flags.rb +12 -12
  107. data/{test → testcases}/tc_basic_optional_flag.rb +0 -0
  108. data/{test → testcases}/tc_basic_parsing.rb +0 -0
  109. data/{test → testcases}/tc_basic_usage_helping.rb +0 -0
  110. data/{test → testcases}/tc_basic_value_validation.rb +0 -0
  111. data/{test → testcases}/tc_bug_one.rb +0 -0
  112. data/{test → testcases}/tc_bug_two.rb +0 -0
  113. data/{test → testcases}/tc_change_symbols.rb +0 -0
  114. data/{test → testcases}/tc_enumerated_value_validation.rb +0 -0
  115. data/{test → testcases}/tc_flagall.rb +4 -0
  116. data/{test → testcases}/tc_flagless_arg.rb +0 -0
  117. data/{test → testcases}/tc_keyword.rb +0 -0
  118. data/testcases/tc_new_basic_parsing.rb +51 -0
  119. data/testcases/tc_poro_tester.rb +30 -0
  120. data/{test → testcases}/tc_values_as_hash.rb +0 -0
  121. metadata +152 -52
  122. data/doc/example/example_1.rb +0 -30
  123. data/doc/example/example_1_1.rb +0 -27
  124. data/doc/example/example_2.rb +0 -28
  125. data/doc/example/example_4.rb +0 -12
  126. data/doc/example/example_5.rb +0 -26
  127. data/doc/example/example_6.rb +0 -17
  128. data/lib/optiflag.rb +0 -860
data/ReleaseNotes.txt CHANGED
@@ -1,3 +1,38 @@
1
+ ---------------------------------------------------------------------------------
2
+ RELEASE 0.6.5 (Reuse PORO (Plain Old Ruby Object))
3
+ ---------------------------------------------------------------------------------
4
+ * added module convenience funtionality Optiflag.using_object()
5
+ -- made sure that this will travel up the inheritance
6
+ hierarchy up to but not including Object looking for
7
+ getter/setter pairs
8
+ * added alias :and_process! for :handle_errors_and_help (which is unweildy)
9
+ * started significant RDoc-ing of modules, classes and methods
10
+ * created alias :flags for :flag_value
11
+ (ARGV.flags.d is easier than ARGV.flag_value.d)
12
+ * re-arranged directory structure and created darcs repository
13
+ * read darcs repository now available at
14
+ http://daniel-eklund.com/repos/optiflag
15
+ * added a new convenience Constant called OptiFlagSet which makes
16
+ the standard rote extension a bit easier
17
+ * refactored the help bundle system
18
+ * changed the look and feel for the help messages
19
+ * changed the parse() function so that the module constant also now
20
+ has the flag values augmented onto the object
21
+ module MyArgs extend OptiFlagSet
22
+ ...
23
+ end
24
+ MyArgs.flags.dir?
25
+ * broke out a lot of functionality into separate files to make
26
+ maintenance a bit easier.. (first time optiflag.rb is no longer
27
+ the only source file)
28
+ * refactored the validation functionality to create a generic
29
+ 'validate_against' methods which takes a lambda. Old validation
30
+ methods value_in_set and value_matching use this method
31
+ * fixed a subtle bug with the help usage_flag not picking up
32
+ individual help when it was an alternate form and usage_flag
33
+ is called more than once
34
+
35
+
1
36
  ---------------------------------------------------------------------------------
2
37
  RELEASE 0.6 (Character Flags FINALLY)
3
38
  ---------------------------------------------------------------------------------
@@ -0,0 +1,439 @@
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: OptiFlag</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">OptiFlag</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../files/optiflag-help_rb.html">
59
+ optiflag-help.rb
60
+ </a>
61
+ <br />
62
+ <a href="../files/optiflag-parse_rb.html">
63
+ optiflag-parse.rb
64
+ </a>
65
+ <br />
66
+ <a href="../files/optiflag_rb.html">
67
+ optiflag.rb
68
+ </a>
69
+ <br />
70
+ </td>
71
+ </tr>
72
+
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
+ <a href="OptiFlag.html">OptiFlag</a> is the module that provides
86
+ namespacing for the entire optiflag functionality. For usage and examples,
87
+ see <a href="http://optiflag.rubyforge.org">optiflag.rubyforge.org</a>
88
+ </p>
89
+ <h1>Terminology</h1>
90
+ <p>
91
+ Please treat the following terminology as specific only to the <a
92
+ href="OptiFlag.html">OptiFlag</a> code suite. In the remaining RDoc, we
93
+ shall try to emphasize this consistent terminology with italics. If you see
94
+ an italicized phrase, chances are that it is defined here.
95
+ </p>
96
+ <h2>Flag Set Declaration</h2>
97
+ <p>
98
+ A <em>flag set declaration</em> is a set of flag declarations created by
99
+ the user of the <a href="OptiFlag.html">OptiFlag</a> suite and corresponds
100
+ to the following code snippet:
101
+ </p>
102
+ <pre>
103
+ module AppArgs extend OptiFlagSet
104
+ # individual flag declaration goes here ...
105
+ # ... and here
106
+ end
107
+ </pre>
108
+ <p>
109
+ In this case, the module <b>AppArgs</b> is a <em>flag set declaration</em>,
110
+ and all code within the module definition (i.e. up to the end of <b>end</b>
111
+ of the module) is either a <em>flag declaration</em> or a special command.
112
+ </p>
113
+ <p>
114
+ Another way to treat this declaration is as a demarcation between the
115
+ normal Ruby world and the mini-DSL (Domain Specific Language) that <a
116
+ href="OptiFlag.html">OptiFlag</a> offers. In this view, the declaration
117
+ provides a DSL-zone in which the DSL is allowed.
118
+ </p>
119
+ <pre>
120
+ module AppArgs extend OptiFlagSet
121
+ # DSL-zone
122
+ # DSL-zone (for declaring and modifying flags)
123
+ # DSL-zone
124
+ end
125
+ </pre>
126
+ <p>
127
+ the first line
128
+ </p>
129
+ <pre>
130
+ module AppArgs extend OptiFlagSet
131
+ </pre>
132
+ <p>
133
+ is really just rote.
134
+ </p>
135
+ <p>
136
+ Supply your own module argument name and make sure it extends this <a
137
+ href="OptiFlag/Flagset.html">OptiFlag::Flagset</a> as is written. You will
138
+ then have a scoped space to write in a command line DSL.
139
+ </p>
140
+ <h2>Flag Declaration</h2>
141
+ <p>
142
+ A <em>flag declaration</em> is placed within a <em>flag set
143
+ declaration</em> to indicate that one input parameter per declaration is
144
+ requested from the command line. A <em>flag declaration</em> is the
145
+ mini-DSL&#8216;s main programming construct. In the following code, four
146
+ <em>flag declarations</em> are placed within the overall <em>flag
147
+ <b>set</b> declaration</em> named AppArgs:
148
+ </p>
149
+ <pre>
150
+ module AppArgs extend OptiFlagSet
151
+ flag &quot;dir&quot;
152
+ flag &quot;log&quot;
153
+ flag &quot;username&quot;
154
+ flag &quot;password&quot;
155
+ end
156
+ </pre>
157
+ <p>
158
+ Please note that there are other <em>flag set declaration</em> nouns other
159
+ than flag. For instance in the following snippet:
160
+ </p>
161
+ <pre>
162
+ module Example extend OptiFlagSet
163
+ flag &quot;dir&quot; do
164
+ alternate_forms &quot;directory&quot;,&quot;D&quot;,&quot;d&quot;
165
+ description &quot;The Appliction Directory&quot;
166
+ end
167
+ optional_flag &quot;log&quot; do
168
+ description &quot;The directory in which to find the log files&quot;
169
+ long_form &quot;logging-directory&quot; # long form is keyed after the '--' symbol
170
+ end
171
+ flag &quot;username&quot;, :description =&gt; &quot;Database username.&quot; # alternate form
172
+ flag &quot;password&quot; do
173
+ description &quot;Database password.&quot;
174
+ end
175
+ usage_flag &quot;h&quot;,&quot;help&quot;,&quot;?&quot;
176
+ extended_help_flag &quot;superhelp&quot;
177
+
178
+ and_process!
179
+ end
180
+ </pre>
181
+ <p>
182
+ there are six <em>flag declarations</em> in total:
183
+ </p>
184
+ <ul>
185
+ <li>a flag named &quot;dir&quot;
186
+
187
+ </li>
188
+ <li>an optional flag named &quot;log&quot;
189
+
190
+ </li>
191
+ <li>a flag named &quot;username&quot;
192
+
193
+ </li>
194
+ <li>a flag named &quot;password&quot;
195
+
196
+ </li>
197
+ <li>a usage flag for summoning help on how to use the flags
198
+
199
+ </li>
200
+ <li>an extended help flag for summoning detailed usage for the flags
201
+
202
+ </li>
203
+ </ul>
204
+ <p>
205
+ Everything else is either a <em>clause level modifier</em> (e.g.
206
+ alternate_forms, description, etc.) or a <em>special command</em>.
207
+ </p>
208
+ <p>
209
+ <b>For a list of all <em>flag set declarations</em> and how to use them,
210
+ see the RDoc for the <a href="OptiFlag/Flagset.html">OptiFlag::Flagset</a>
211
+ module.</b>
212
+ </p>
213
+ <h2>Clause Level Modifier</h2>
214
+ <p>
215
+ As seen above, a <em>clause level modifier</em> is a word used to modify
216
+ the basic flag, usually within a nested do block. It it this nesting which
217
+ has inspired the use of the word clause. For instance:
218
+ </p>
219
+ <pre>
220
+ module Example extend OptiFlagSet
221
+ flag &quot;dir&quot; do
222
+ alternate_forms &quot;directory&quot;,&quot;D&quot;,&quot;d&quot;
223
+ description &quot;The Appliction Directory&quot;
224
+ end
225
+ end
226
+ </pre>
227
+ <p>
228
+ We could read this as a sentence: &#8216;Create a flag &quot;dir&quot;
229
+ which has three alternate forms &quot;directory&quot;, &quot;D&quot;, and
230
+ &quot;d&quot; and which has a description that reads &quot;The Application
231
+ Directory&#8217;.
232
+ </p>
233
+ <p>
234
+ For the most part, these <em>clause level modifiers</em> are nested within
235
+ a do-block, though <a href="OptiFlag.html">OptiFlag</a> allows us to
236
+ conserve vertical space by using symbol hashes. (It is recommended that one
237
+ only uses these in simple cases). For instance, the following two <em>flag
238
+ set declarations</em> are equivalent:
239
+ </p>
240
+ <pre>
241
+ module Example extend OptiFlagSet
242
+ flag &quot;username&quot;, :description =&gt; &quot;Database username.&quot; # alternate form
243
+
244
+ and_process!
245
+ end
246
+ </pre>
247
+ <p>
248
+ and
249
+ </p>
250
+ <pre>
251
+ module Example extend OptiFlagSet
252
+ flag &quot;username&quot; do
253
+ description &quot;Database username.&quot;
254
+ end
255
+
256
+ and_process!
257
+ end
258
+ </pre>
259
+ <p>
260
+ with the first being a syntactically friendly hash of the <em>clause level
261
+ modifier</em> as a symbol pointing to the value of the modification.
262
+ </p>
263
+ <p>
264
+ For a complete list of <em>clause level modifiers</em> see the RDoc for <a
265
+ href="OptiFlag/Flagset/EachFlag.html">OptiFlag::Flagset::EachFlag</a>
266
+ </p>
267
+
268
+ </div>
269
+
270
+
271
+ </div>
272
+
273
+ <div id="method-list">
274
+ <h3 class="section-bar">Methods</h3>
275
+
276
+ <div class="name-list">
277
+ <a href="#M000003">Flagset</a>&nbsp;&nbsp;
278
+ <a href="#M000002">using_object</a>&nbsp;&nbsp;
279
+ </div>
280
+ </div>
281
+
282
+ </div>
283
+
284
+
285
+ <!-- if includes -->
286
+
287
+ <div id="section">
288
+
289
+ <div id="class-list">
290
+ <h3 class="section-bar">Classes and Modules</h3>
291
+
292
+ Module <a href="OptiFlag/Flagset.html" class="link">OptiFlag::Flagset</a><br />
293
+
294
+ </div>
295
+
296
+ <div id="constants-list">
297
+ <h3 class="section-bar">Constants</h3>
298
+
299
+ <div class="name-list">
300
+ <table summary="Constants">
301
+ <tr class="top-aligned-row context-row">
302
+ <td class="context-item-name">VERSION</td>
303
+ <td>=</td>
304
+ <td class="context-item-value">&quot;0.7&quot;</td>
305
+ </tr>
306
+ </table>
307
+ </div>
308
+ </div>
309
+
310
+
311
+
312
+
313
+
314
+
315
+ <!-- if method_list -->
316
+ <div id="methods">
317
+ <h3 class="section-bar">Public Class methods</h3>
318
+
319
+ <div id="method-M000003" class="method-detail">
320
+ <a name="M000003"></a>
321
+
322
+ <div class="method-heading">
323
+ <a href="OptiFlag.src/M000003.html" target="Code" class="method-signature"
324
+ onclick="popupCode('OptiFlag.src/M000003.html');return false;">
325
+ <span class="method-name">Flagset</span><span class="method-args">(hash)</span>
326
+ </a>
327
+ </div>
328
+
329
+ <div class="method-description">
330
+ <p>
331
+ This is a method that looks like a module. It is an excellent example of
332
+ the syntactic tricks that ruby permits us. This method allows us to provide
333
+ code like the following:
334
+ </p>
335
+ <pre>
336
+ module Example extend OptiFlagSet(:flag_symbol =&gt; &quot;/&quot;)
337
+ flag &quot;dir&quot;
338
+ flag &quot;log&quot;
339
+ flag &quot;username&quot;
340
+ flag &quot;password&quot;
341
+
342
+ and_process!
343
+ end
344
+ </pre>
345
+ <p>
346
+ You will note that the top line looks a lot like the standard top line
347
+ </p>
348
+ <pre>
349
+ # our top line
350
+ module Example extend OptiFlagSet(:flag_symbol =&gt; &quot;/&quot;)
351
+ </pre>
352
+ <p>
353
+ versus
354
+ </p>
355
+ <pre>
356
+ # standard top line
357
+ module Example extend OptiFlagSet
358
+ </pre>
359
+ <p>
360
+ The difference is that while the latter (a standard top line) is a
361
+ reference to a module, the former is a call to this method, that
362
+ <b>returns</b> the <a href="OptiFlag/Flagset.html">OptiFlag::Flagset</a>
363
+ module with some defaults changed.
364
+ </p>
365
+ <p>
366
+ As of now the only symbol/method supported by this method that looks like a
367
+ module, is the &#8216;<a
368
+ href="OptiFlag/Flagset.html#M000005">OptiFlag::Flagset.flag_symbol</a>&#8217;
369
+ class method.
370
+ </p>
371
+ <p>
372
+ For those still not understanding the syntactic trick, or who find it odd,
373
+ consider that something similar to this is done in the ruby core language
374
+ using the proxy/delegate pattern. (See delegate.rb in the Ruby core
375
+ library)
376
+ </p>
377
+ <pre>
378
+ class Tempfile &lt; DelegateClass(File)
379
+ # ...
380
+ # ...
381
+ end
382
+ </pre>
383
+ <p>
384
+ You will note that the DelegateClass() is also a method that superficially
385
+ resembles a class that parameterizes itself. This can be done because Ruby
386
+ expects:
387
+ </p>
388
+ <pre>
389
+ class &lt;identifier&gt; &lt; &lt;expression&gt;
390
+ </pre>
391
+ <p>
392
+ and not
393
+ </p>
394
+ <pre>
395
+ class &lt;identifier&gt; &lt; &lt;identifier&gt;
396
+ </pre>
397
+ <p>
398
+ like some other languages. And likewise
399
+ </p>
400
+ <pre>
401
+ module &lt;identifier&gt; extend &lt;expression&gt;
402
+ </pre>
403
+ <p>
404
+ which allows us to create this method which has the exact same name as the
405
+ module. Clever ruby.
406
+ </p>
407
+ </div>
408
+ </div>
409
+
410
+ <div id="method-M000002" class="method-detail">
411
+ <a name="M000002"></a>
412
+
413
+ <div class="method-heading">
414
+ <a href="OptiFlag.src/M000002.html" target="Code" class="method-signature"
415
+ onclick="popupCode('OptiFlag.src/M000002.html');return false;">
416
+ <span class="method-name">using_object</span><span class="method-args">(a_single_object,&amp;the_block)</span>
417
+ </a>
418
+ </div>
419
+
420
+ <div class="method-description">
421
+ <p>
422
+ Special command (at the same level as a <em>flag declaration</em>)
423
+ </p>
424
+ </div>
425
+ </div>
426
+
427
+
428
+ </div>
429
+
430
+
431
+ </div>
432
+
433
+
434
+ <div id="validator-badges">
435
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
436
+ </div>
437
+
438
+ </body>
439
+ </html>