facets 2.6.0 → 2.7.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 (321) hide show
  1. data/HISTORY.rdoc +331 -35
  2. data/MANIFEST +685 -826
  3. data/{doc/guide/notes.rd → NOTES} +0 -0
  4. data/README.rdoc +73 -25
  5. data/Rakefile +245 -2
  6. data/TODO +5 -0
  7. data/demo/hook.rd +47 -0
  8. data/demo/scenario_require.rd +9 -0
  9. data/doc/README.more +24 -6
  10. data/doc/manual/about.rb +47 -0
  11. data/doc/manual/annotations.rdoc +60 -0
  12. data/doc/manual/associations.rdoc +55 -0
  13. data/doc/manual/blockups.rdoc +101 -0
  14. data/doc/manual/capsule.rdoc +34 -0
  15. data/doc/manual/command.rdoc +177 -0
  16. data/doc/manual/core.rdoc +37 -0
  17. data/doc/manual/faq.rdoc +32 -0
  18. data/doc/manual/typecast.html +112 -0
  19. data/lib/core/facets.rb +359 -11
  20. data/lib/core/facets/array/combination.rb +3 -3
  21. data/lib/core/facets/array/index.rb +4 -1
  22. data/lib/core/facets/array/permutation.rb +2 -2
  23. data/lib/core/facets/array/product.rb +1 -1
  24. data/lib/core/facets/binding/eval.rb +1 -1
  25. data/lib/core/facets/denumerable.rb +76 -0
  26. data/lib/core/facets/duplicable.rb +34 -0
  27. data/lib/core/facets/enumerable/count.rb +10 -4
  28. data/lib/core/facets/enumerable/defer.rb +77 -0
  29. data/lib/core/facets/enumerable/each_by.rb +1 -1
  30. data/lib/core/facets/enumerable/every.rb +35 -0
  31. data/lib/{more/facets/elementwise.rb → core/facets/enumerable/ewise.rb} +0 -0
  32. data/lib/core/facets/enumerable/filter.rb +25 -0
  33. data/lib/core/facets/enumerable/group_by.rb +1 -1
  34. data/lib/core/facets/enumerable/none.rb +3 -2
  35. data/lib/core/facets/enumerable/one.rb +3 -2
  36. data/lib/core/facets/enumerable/per.rb +61 -0
  37. data/lib/core/facets/exception/raised.rb +14 -0
  38. data/lib/core/facets/integer/odd.rb +5 -1
  39. data/lib/core/facets/kernel/__dir__.rb +13 -3
  40. data/lib/core/facets/kernel/__here__.rb +14 -0
  41. data/lib/core/facets/kernel/__method__.rb +9 -3
  42. data/lib/core/facets/kernel/ask.rb +1 -0
  43. data/lib/core/facets/kernel/equate.rb +13 -0
  44. data/lib/core/facets/kernel/extension.rb +9 -0
  45. data/lib/core/facets/kernel/identical.rb +4 -0
  46. data/lib/core/facets/kernel/instance_exec.rb +2 -1
  47. data/lib/core/facets/kernel/method.rb +49 -0
  48. data/lib/core/facets/kernel/object_send.rb +2 -2
  49. data/lib/core/facets/kernel/{state.rb → object_state.rb} +23 -12
  50. data/lib/core/facets/kernel/require_all.rb +6 -1
  51. data/lib/core/facets/kernel/require_local.rb +8 -1
  52. data/lib/core/facets/kernel/require_relative.rb +52 -0
  53. data/lib/core/facets/kernel/source_location.rb +13 -0
  54. data/lib/core/facets/kernel/tap.rb +13 -6
  55. data/lib/core/facets/module/attr_setter.rb +57 -0
  56. data/lib/core/facets/module/instance_method.rb +24 -0
  57. data/lib/core/facets/module/module_load.rb +60 -44
  58. data/lib/core/facets/module/module_require.rb +1 -0
  59. data/lib/core/facets/nilclass/to_f.rb +1 -1
  60. data/lib/core/facets/objectspace/op_fetch.rb +3 -0
  61. data/lib/core/facets/proc/curry.rb +4 -3
  62. data/lib/core/facets/string/bytes.rb +10 -4
  63. data/lib/core/facets/string/camelcase.rb +6 -5
  64. data/lib/core/facets/string/chars.rb +5 -1
  65. data/lib/core/facets/string/each_char.rb +1 -1
  66. data/lib/core/facets/string/each_word.rb +1 -1
  67. data/lib/core/facets/string/lines.rb +11 -4
  68. data/lib/core/facets/string/start_with.rb +9 -2
  69. data/lib/core/facets/string/unfold.rb +27 -0
  70. data/lib/core/facets/symbol/succ.rb +3 -3
  71. data/lib/core/facets/symbol/thrown.rb +20 -0
  72. data/lib/core/facets/symbol/to_proc.rb +3 -2
  73. data/lib/core/facets/time/to_time.rb +1 -1
  74. data/lib/core/facets/to_hash.rb +41 -100
  75. data/lib/core/facets/unboundmethod/name.rb +20 -23
  76. data/lib/more/facets/ansicode.rb +1 -10
  77. data/lib/more/facets/autoarray.rb +3 -31
  78. data/lib/more/facets/basicobject.rb +73 -0
  79. data/lib/more/facets/blankslate.rb +2 -66
  80. data/lib/{lore → more}/facets/cgi.rb +0 -0
  81. data/lib/more/facets/class_extend.rb +1 -0
  82. data/lib/{lore → more}/facets/continuation.rb +0 -0
  83. data/lib/{lore → more}/facets/date.rb +3 -3
  84. data/lib/more/facets/enumargs.rb +192 -0
  85. data/lib/more/facets/enumerablepass.rb +2 -216
  86. data/lib/more/facets/enumerator.rb +62 -0
  87. data/lib/more/facets/{equatable.rb → equitable.rb} +11 -11
  88. data/lib/more/facets/expirable.rb +13 -41
  89. data/lib/{lore → more}/facets/fileutils.rb +0 -0
  90. data/lib/{lore → more}/facets/fileutils/head.rb +0 -0
  91. data/lib/{lore → more}/facets/fileutils/safe_ln.rb +0 -0
  92. data/lib/{lore → more}/facets/fileutils/slice.rb +0 -0
  93. data/lib/{lore → more}/facets/fileutils/tail.rb +0 -0
  94. data/lib/{lore → more}/facets/fileutils/wc.rb +0 -0
  95. data/lib/{lore → more}/facets/fileutils/whereis.rb +0 -0
  96. data/lib/{lore → more}/facets/fileutils/which.rb +0 -0
  97. data/lib/{lore → more}/facets/getoptlong.rb +0 -0
  98. data/lib/more/facets/hook.rb +2 -29
  99. data/lib/more/facets/inheritor.rb +2 -2
  100. data/lib/more/facets/instance_eval.rb +50 -0
  101. data/lib/more/facets/instance_function.rb +78 -0
  102. data/lib/more/facets/main.rb +20 -15
  103. data/lib/more/facets/memoize.rb +1 -113
  104. data/lib/more/facets/module/attr.rb +83 -0
  105. data/lib/more/facets/module/attr_tester.rb +44 -0
  106. data/lib/more/facets/module/attr_toggler.rb +59 -0
  107. data/lib/more/facets/module/attr_validator.rb +34 -0
  108. data/lib/more/facets/{class_extension.rb → module/class_extend.rb} +21 -13
  109. data/lib/more/facets/once.rb +59 -0
  110. data/lib/more/facets/openmodule.rb +1 -0
  111. data/lib/more/facets/orderedhash.rb +1 -33
  112. data/lib/{lore → more}/facets/ostruct.rb +0 -0
  113. data/lib/more/facets/ostructable.rb +1 -4
  114. data/lib/more/facets/partial.rb +18 -16
  115. data/lib/{lore → more}/facets/pathname.rb +0 -0
  116. data/lib/more/facets/preinitialize.rb +157 -0
  117. data/lib/{lore → more}/facets/rbconfig.rb +0 -0
  118. data/lib/more/facets/recorder.rb +1 -2
  119. data/lib/{lore → more}/facets/set.rb +0 -0
  120. data/lib/{lore → more}/facets/shellwords.rb +0 -0
  121. data/lib/{lore → more}/facets/uri.rb +0 -0
  122. data/lib/{lore → more}/facets/yaml.rb +0 -0
  123. data/lib/{lore → more}/facets/zlib.rb +0 -0
  124. data/meta/loadpath +0 -1
  125. data/meta/sitemap +4 -0
  126. data/meta/version +1 -1
  127. data/test/core/enumerable/test_count.rb +1 -1
  128. data/test/{more/test_filter.rb → core/enumerable/test_defer.rb} +24 -22
  129. data/test/{more/test_elementor.rb → core/enumerable/test_every.rb} +2 -15
  130. data/test/core/enumerable/test_ewise.rb +23 -0
  131. data/test/core/enumerable/test_per.rb +18 -0
  132. data/test/core/enumerable/test_take.rb +13 -0
  133. data/test/core/kernel/test_deepcopy.rb +1 -1
  134. data/test/{more/test_1stclassmethod.rb → core/kernel/test_method.rb} +2 -7
  135. data/test/core/kernel/test_tap.rb +1 -1
  136. data/test/core/proc/test_curry.rb +11 -0
  137. data/test/core/string/test_bytes.rb +1 -1
  138. data/test/core/string/test_camelcase.rb +23 -6
  139. data/test/core/string/test_lines.rb +1 -1
  140. data/test/core/string/test_unfold.rb +14 -0
  141. data/test/{more → core}/test_blank.rb +0 -0
  142. data/test/{more → core}/test_boolean.rb +0 -0
  143. data/test/{more → core}/test_functor.rb +0 -0
  144. data/test/{lore → more}/test_basicobject.rb +0 -0
  145. data/test/more/{test_class_extension.rb → test_class_extend.rb} +6 -6
  146. data/test/{lore → more}/test_continuation.rb +0 -0
  147. data/test/{lore → more}/test_date.rb +0 -0
  148. data/test/more/{test_enumerablepass.rb → test_enumargs.rb} +2 -4
  149. data/test/more/{test_equatable.rb → test_equitable.rb} +2 -2
  150. data/test/more/{test_instantise.rb → test_instance_function.rb} +3 -2
  151. data/test/more/test_memoize.rb +1 -1
  152. data/test/{lore → more}/test_ostruct.rb +0 -0
  153. metadata +865 -1016
  154. data/RELEASE +0 -38
  155. data/doc/README.lore +0 -51
  156. data/doc/log/basic_stats/index.html +0 -39
  157. data/doc/log/changelog.html +0 -648
  158. data/doc/log/changelog.txt +0 -217
  159. data/doc/log/stats/index.html +0 -39
  160. data/doc/log/testlog.txt +0 -278
  161. data/doc/notes/CHANGES +0 -2529
  162. data/doc/rdoc/lore/classes/Array.html +0 -176
  163. data/doc/rdoc/lore/classes/CGI.html +0 -191
  164. data/doc/rdoc/lore/classes/Config.html +0 -135
  165. data/doc/rdoc/lore/classes/Continuation.html +0 -113
  166. data/doc/rdoc/lore/classes/Date.html +0 -631
  167. data/doc/rdoc/lore/classes/DateTime.html +0 -583
  168. data/doc/rdoc/lore/classes/Enumerable.html +0 -89
  169. data/doc/rdoc/lore/classes/Enumerable/Enumerator.html +0 -147
  170. data/doc/rdoc/lore/classes/File.html +0 -128
  171. data/doc/rdoc/lore/classes/FileUtils.html +0 -434
  172. data/doc/rdoc/lore/classes/GetoptLong.html +0 -118
  173. data/doc/rdoc/lore/classes/GetoptLong/DSL.html +0 -208
  174. data/doc/rdoc/lore/classes/Kernel.html +0 -135
  175. data/doc/rdoc/lore/classes/Logger.html +0 -229
  176. data/doc/rdoc/lore/classes/Logger/Ansicolor.html +0 -277
  177. data/doc/rdoc/lore/classes/Logger/LogDevice.html +0 -121
  178. data/doc/rdoc/lore/classes/NilClass.html +0 -119
  179. data/doc/rdoc/lore/classes/OpenStruct.html +0 -432
  180. data/doc/rdoc/lore/classes/Pathname.html +0 -353
  181. data/doc/rdoc/lore/classes/Set.html +0 -117
  182. data/doc/rdoc/lore/classes/Shellwords.html +0 -111
  183. data/doc/rdoc/lore/classes/String.html +0 -140
  184. data/doc/rdoc/lore/classes/Time.html +0 -154
  185. data/doc/rdoc/lore/classes/URI.html +0 -454
  186. data/doc/rdoc/lore/classes/URI/Hash.html +0 -105
  187. data/doc/rdoc/lore/classes/URI/Kernel.html +0 -122
  188. data/doc/rdoc/lore/classes/Zlib.html +0 -188
  189. data/doc/rdoc/lore/created.rid +0 -1
  190. data/doc/rdoc/lore/files/README.html +0 -286
  191. data/doc/rdoc/lore/files/doc/README_lore.html +0 -155
  192. data/doc/rdoc/lore/files/lib/lore/facets/basicobject_rb.html +0 -118
  193. data/doc/rdoc/lore/files/lib/lore/facets/cgi_rb.html +0 -111
  194. data/doc/rdoc/lore/files/lib/lore/facets/continuation_rb.html +0 -147
  195. data/doc/rdoc/lore/files/lib/lore/facets/date_rb.html +0 -97
  196. data/doc/rdoc/lore/files/lib/lore/facets/enumerator_rb.html +0 -111
  197. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/head_rb.html +0 -96
  198. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/safe_ln_rb.html +0 -96
  199. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/slice_rb.html +0 -96
  200. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/tail_rb.html +0 -96
  201. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/wc_rb.html +0 -96
  202. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/whereis_rb.html +0 -96
  203. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/which_rb.html +0 -96
  204. data/doc/rdoc/lore/files/lib/lore/facets/fileutils_rb.html +0 -131
  205. data/doc/rdoc/lore/files/lib/lore/facets/getoptlong_rb.html +0 -135
  206. data/doc/rdoc/lore/files/lib/lore/facets/logger_rb.html +0 -142
  207. data/doc/rdoc/lore/files/lib/lore/facets/ostruct_rb.html +0 -135
  208. data/doc/rdoc/lore/files/lib/lore/facets/pathname_rb.html +0 -145
  209. data/doc/rdoc/lore/files/lib/lore/facets/rbconfig_rb.html +0 -124
  210. data/doc/rdoc/lore/files/lib/lore/facets/set_rb.html +0 -96
  211. data/doc/rdoc/lore/files/lib/lore/facets/shellwords_rb.html +0 -124
  212. data/doc/rdoc/lore/files/lib/lore/facets/uri_rb.html +0 -125
  213. data/doc/rdoc/lore/files/lib/lore/facets/yaml_rb.html +0 -146
  214. data/doc/rdoc/lore/files/lib/lore/facets/zlib_rb.html +0 -97
  215. data/doc/rdoc/lore/fr_class_index.html +0 -73
  216. data/doc/rdoc/lore/fr_file_index.html +0 -71
  217. data/doc/rdoc/lore/fr_method_index.html +0 -177
  218. data/doc/rdoc/lore/index.html +0 -26
  219. data/doc/rdoc/lore/rdoc-style.css +0 -177
  220. data/doc/release-notes/RELEASE-2.0.5 +0 -8
  221. data/doc/release-notes/RELEASE-2.1.0 +0 -9
  222. data/doc/release-notes/RELEASE-2.1.1 +0 -5
  223. data/doc/release-notes/RELEASE-2.1.2 +0 -6
  224. data/doc/release-notes/RELEASE-2.1.3 +0 -5
  225. data/doc/release-notes/RELEASE-2.2.0 +0 -14
  226. data/doc/release-notes/RELEASE-2.2.1 +0 -4
  227. data/doc/release-notes/RELEASE-2.3.0 +0 -6
  228. data/doc/release-notes/RELEASE-2.4.0 +0 -70
  229. data/doc/release-notes/RELEASE-2.4.1 +0 -8
  230. data/doc/release-notes/RELEASE-2.4.2 +0 -4
  231. data/doc/release-notes/RELEASE-2.4.3 +0 -78
  232. data/doc/release-notes/RELEASE-2.4.4 +0 -38
  233. data/doc/release-notes/RELEASE-2.4.5 +0 -37
  234. data/doc/release-notes/RELEASE-2.5.0 +0 -83
  235. data/lib/core/facets/kernel/instance.rb +0 -19
  236. data/lib/lore/facets/basicobject.rb +0 -14
  237. data/lib/lore/facets/enumerator.rb +0 -67
  238. data/lib/lore/facets/logger.rb +0 -291
  239. data/lib/more/facets/1stclassmethod.rb +0 -140
  240. data/lib/more/facets/advisable.rb +0 -162
  241. data/lib/more/facets/association.rb +0 -210
  242. data/lib/more/facets/attr.rb +0 -209
  243. data/lib/more/facets/basex.rb +0 -37
  244. data/lib/more/facets/bbcode.rb +0 -397
  245. data/lib/more/facets/bicrypt.rb +0 -265
  246. data/lib/more/facets/binreadable.rb +0 -221
  247. data/lib/more/facets/censor.rb +0 -97
  248. data/lib/more/facets/classmethods.rb +0 -199
  249. data/lib/more/facets/consoleutils.rb +0 -99
  250. data/lib/more/facets/crypt.rb +0 -166
  251. data/lib/more/facets/dependency.rb +0 -151
  252. data/lib/more/facets/downloader.rb +0 -281
  253. data/lib/more/facets/duplicable.rb +0 -43
  254. data/lib/more/facets/elementor.rb +0 -133
  255. data/lib/more/facets/filter.rb +0 -121
  256. data/lib/more/facets/heap.rb +0 -22
  257. data/lib/more/facets/infinity.rb +0 -193
  258. data/lib/more/facets/ini.rb +0 -264
  259. data/lib/more/facets/instantise.rb +0 -1
  260. data/lib/more/facets/instantize.rb +0 -95
  261. data/lib/more/facets/interval.rb +0 -282
  262. data/lib/more/facets/iteration.rb +0 -65
  263. data/lib/more/facets/linkedlist.rb +0 -222
  264. data/lib/more/facets/lrucache.rb +0 -157
  265. data/lib/more/facets/matcher.rb +0 -140
  266. data/lib/more/facets/memoizer.rb +0 -74
  267. data/lib/more/facets/minitar.rb +0 -1063
  268. data/lib/more/facets/nackclass.rb +0 -41
  269. data/lib/more/facets/net/smtp_tls.rb +0 -131
  270. data/lib/more/facets/nilstatus.rb +0 -48
  271. data/lib/more/facets/overload.rb +0 -94
  272. data/lib/more/facets/paramix.rb +0 -202
  273. data/lib/more/facets/pool.rb +0 -91
  274. data/lib/more/facets/pqueue.rb +0 -449
  275. data/lib/more/facets/pry.rb +0 -32
  276. data/lib/more/facets/reflection.rb +0 -145
  277. data/lib/more/facets/semaphore.rb +0 -92
  278. data/lib/more/facets/settings.rb +0 -248
  279. data/lib/more/facets/snapshot.rb +0 -209
  280. data/lib/more/facets/sparse_array.rb +0 -809
  281. data/lib/more/facets/string/mask.rb +0 -278
  282. data/lib/more/facets/string/obfuscate.rb +0 -65
  283. data/lib/more/facets/string/stylize.rb +0 -169
  284. data/lib/more/facets/string/words.rb +0 -167
  285. data/lib/more/facets/syncarray.rb +0 -114
  286. data/lib/more/facets/synchash.rb +0 -157
  287. data/lib/more/facets/typecast.rb +0 -261
  288. data/lib/more/facets/uninheritable.rb +0 -50
  289. data/lib/more/facets/xmlhash.rb +0 -112
  290. data/lib/more/facets/xoxo.rb +0 -259
  291. data/lib/more/facets/ziputils.rb +0 -490
  292. data/task/conflicts +0 -63
  293. data/task/coverage.rake +0 -37
  294. data/task/methods +0 -49
  295. data/task/rdoc.rake +0 -17
  296. data/task/setup.rake +0 -38
  297. data/task/test.rake +0 -145
  298. data/test/more/test_advisable.rb +0 -71
  299. data/test/more/test_association.rb +0 -38
  300. data/test/more/test_bbcode.rb +0 -21
  301. data/test/more/test_binreadable.rb +0 -50
  302. data/test/more/test_buildable.rb +0 -73
  303. data/test/more/test_classmethods.rb +0 -56
  304. data/test/more/test_crypt.rb +0 -32
  305. data/test/more/test_dependency.rb +0 -69
  306. data/test/more/test_elementwise.rb +0 -25
  307. data/test/more/test_infinity.rb +0 -40
  308. data/test/more/test_interval.rb +0 -151
  309. data/test/more/test_linkedlist.rb +0 -41
  310. data/test/more/test_lrucache.rb +0 -14
  311. data/test/more/test_overload.rb +0 -160
  312. data/test/more/test_paramix.rb +0 -170
  313. data/test/more/test_prototype.rb +0 -35
  314. data/test/more/test_snapshot.rb +0 -21
  315. data/test/more/test_sparsearray.rb +0 -279
  316. data/test/more/test_syncarray.rb +0 -15
  317. data/test/more/test_synchash.rb +0 -16
  318. data/test/more/test_typecast.rb +0 -54
  319. data/test/more/test_uninheritable.rb +0 -31
  320. data/test/more/test_xoxo.rb +0 -274
  321. data/test/test_facets.rb +0 -9
@@ -0,0 +1,34 @@
1
+ class Module
2
+
3
+ # Like attr_writer, but the writer method validates the
4
+ # setting against the given block.
5
+ #
6
+ # CREDIT: ?
7
+
8
+ def attr_validator(*symbols, &validator)
9
+ made = []
10
+ symbols.each do |symbol|
11
+ define_method "#{symbol}=" do |val|
12
+ unless validator.call(val)
13
+ raise ArgumentError, "Invalid value provided for #{symbol}"
14
+ end
15
+ instance_variable_set("@#{symbol}", val)
16
+ end
17
+ made << "#{symbol}=".to_sym
18
+ end
19
+ made
20
+ end
21
+
22
+ # Create aliases for validators.
23
+
24
+ def alias_validator(*args)
25
+ orig = args.last
26
+ args = args - [orig]
27
+ args.each do |name|
28
+ #alias_method(name, orig)
29
+ alias_method("#{name}=", "#{orig}=")
30
+ end
31
+ end
32
+
33
+ end
34
+
@@ -11,7 +11,7 @@
11
11
  # puts 'inst_meth'
12
12
  # end
13
13
  #
14
- # class_extension do
14
+ # class_extend do
15
15
  # def class_meth
16
16
  # "Class Method!"
17
17
  # end
@@ -53,8 +53,6 @@ class Module
53
53
 
54
54
  alias_method :append_features_without_class_extension, :append_features
55
55
 
56
- # = class_extension
57
- #
58
56
  # Normally when including modules, class/module methods are not
59
57
  # extended. To achieve this behavior requires some clever
60
58
  # Ruby Karate. Instead class_extension provides an easy to use
@@ -66,7 +64,7 @@ class Module
66
64
  # puts 'inst_meth'
67
65
  # end
68
66
  #
69
- # class_extension do
67
+ # class_extend do
70
68
  # def class_meth
71
69
  # "Class Method!"
72
70
  # end
@@ -79,35 +77,45 @@ class Module
79
77
  #
80
78
  # X.class_meth #=> "Class Method!"
81
79
  #
82
-
83
- def class_extension(&block)
80
+ # NOTE: This old #class_extension version of this method
81
+ # did not extend the containing class automatically --it had
82
+ # to be done by hand. With #class_extend, that is no longer
83
+ # the case.
84
+ #
85
+ def class_extend(*mods, &block)
84
86
  @class_extension ||= Module.new do
85
87
  def self.append_features(mod)
86
88
  append_features_without_class_extension(mod)
87
89
  end
88
90
  end
91
+ @class_extension.__send__(:include, *mods)
89
92
  @class_extension.module_eval(&block) if block_given?
93
+ extend(@class_extension) # extend this module too
90
94
  @class_extension
91
95
  end
92
96
 
93
- private :class_extension
97
+ # TODO: DEPRECATE
98
+ alias_method :class_extension, :class_extend
94
99
 
100
+ #private :class_extend
101
+
102
+ # Override +append_features+ to handle class-inheritable extensions.
95
103
  def append_features(mod)
96
104
  append_features_without_class_extension(mod)
97
- mod.extend(class_extension)
105
+ mod.extend(class_extend)
98
106
  if mod.instance_of? Module
99
- mod.__send__(:class_extension).__send__(:include, class_extension)
107
+ mod.__send__(:class_extend).__send__(:include, class_extend)
100
108
  end
101
109
  end
102
110
 
103
111
  end
104
112
 
105
113
  class Class
106
- # For a class #class_extension is the same as class_eval.
107
- # The alternative is to "undef_method :class_extension",
114
+ # For Class, #class_extend is the same as class_eval.
115
+ # The alternative is to "undef_method :class_extend",
108
116
  # but this seems uneccessarily limited.
109
-
110
- def class_extension(&blk)
117
+ #
118
+ def class_extend(&blk)
111
119
  class_eval(&blk)
112
120
  end
113
121
  end
@@ -0,0 +1,59 @@
1
+ module Kernel #:nodoc:
2
+
3
+ # Directive for making your functions faster by trading
4
+ # space for time. When you "memoize" a method/function
5
+ # using #once its results are cached so that later calls
6
+ # with the same arguments return results from the cache
7
+ # instead of recalculating them.
8
+ #
9
+ # class T
10
+ # def initialize(a)
11
+ # @a = a
12
+ # end
13
+ # def a
14
+ # "#{@a ^ 3 + 4}"
15
+ # end
16
+ # once :a
17
+ # end
18
+ #
19
+ # t = T.new
20
+ # t.a.__id__ == t.a.__id__ #=> true
21
+ #
22
+ # This method can also be used at the instance level
23
+ # to cache singleton/eigen methods.
24
+ #
25
+ # Note, this method used to be called +cache+ along with
26
+ # it's other alias #memoize, but +once+ is the term used
27
+ # in PickAxe so it has been adopted instead. The #memoize
28
+ # alias has also been retained.
29
+ #
30
+ # CREDIT Robert Feldt
31
+ #
32
+ def once(*ids)
33
+ if ids.empty?
34
+ @_once ||= Hash::new{|h,k| h[k]={}}
35
+ else
36
+ base = (Module === self ? self : (class << self; self; end))
37
+ ids.each do |m|
38
+ base.module_eval <<-code
39
+ alias_method '#{ m }:once', '#{ m }'
40
+ private '#{ m }:once'
41
+ def #{ m }(*__a__,&__b__)
42
+ c = once['#{ m }']
43
+ k = [__a__,__b__]
44
+ if c.has_key? k
45
+ c[k]
46
+ else
47
+ c[k] = __send__('#{ m }:once',*__a__,&__b__)
48
+ end
49
+ end
50
+ code
51
+ end
52
+ end
53
+ end
54
+
55
+ # +once+ is also widely known as +memoize+.
56
+ alias_method :memoize, :once
57
+
58
+ end
59
+
@@ -1,3 +1,4 @@
1
+ #
1
2
  class OpenModule < Module
2
3
 
3
4
  def initialize(&block)
@@ -1,37 +1,5 @@
1
- # = OrderedHash
2
- #
3
- # Another name for Dictionary.
4
- #
5
- # == Todo
6
- #
7
- # * Make this an alternative to Dictionary that
8
- # is more "slim", not having the extra sorting
9
- # features of dictionary.
10
- #
11
- # = Copying
12
- #
13
- # Copyright (c) 2005 Thomas Sawyer, George Moschovitis
14
- #
15
- # Ruby License
16
- #
17
- # This module is free software. You may use, modify, and/or redistribute this
18
- # software under the same terms as Ruby.
19
- #
20
- # This program is distributed in the hope that it will be useful, but WITHOUT
21
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
22
- # FOR A PARTICULAR PURPOSE.
23
-
24
1
  require 'facets/dictionary'
25
2
 
26
- # = OrderedHash
27
- #
28
- # OrderedHash is an alias for the Dictionary class
29
-
3
+ # Ordered hash is the same as a Dictionary.
30
4
  OrderedHash = Dictionary
31
5
 
32
- # = AutoOrderedHash
33
- #
34
- # AutoOrderedHash is an alias for the AutoDictionary class
35
-
36
- #AutoOrderedHash = AutoDictionary # was replaced by Dictionary.auto() (or autonew?)
37
-
File without changes
@@ -30,15 +30,13 @@
30
30
  #
31
31
  #++
32
32
 
33
- #:title: OpenStructable
34
- #
35
33
  # OpensStructable is a mixin module which can provide OpenStruct behavior to
36
34
  # any class or object. OpenStructable allows extention of data objects
37
35
  # with arbitrary attributes.
38
36
  #
39
37
  # == Usage
40
38
  #
41
- # require 'mega/ostructable'
39
+ # require 'ostructable'
42
40
  #
43
41
  # class Record
44
42
  # include OpenStructable
@@ -58,7 +56,6 @@
58
56
  # * Yukihiro Matsumoto
59
57
  # * Gavin Sinclair (Documentation)
60
58
  #
61
-
62
59
  module OpenStructable
63
60
 
64
61
  def initialize(hash=nil)
@@ -1,33 +1,23 @@
1
- # MissingArgument exception class is used to represent an argument "hole".
2
-
3
- class MissingArgument < ArgumentError
4
- end
5
-
6
- # Convenience method for an argument hole.
7
- # It simple returns the MissingArgument exception class.
8
-
9
- def __
10
- MissingArgument
11
- end
12
-
13
1
  class Proc
14
2
 
15
3
  # Convert a Proc object into new partial Proc object.
16
4
  #
17
5
  # a = proc { |a,b,c| a+b+c }
18
- # b = a.partial(__, 2, __)
6
+ # b = a.partial(X,2,X)
7
+ # b[1,3] #=> 6
8
+ #
9
+ # a = proc { |a,b,c| a+b+c }
10
+ # b = a.partial(__,2,__)
19
11
  # b[1,3] #=> 6
20
12
  #
21
13
  # This method is similar to Proc#curry.
22
14
  #
23
15
  # CREDT Trans
24
- #
25
- # TODO: Parhaps ArgumentError would suffice, and we don't need MissingArgument?
26
16
 
27
17
  def partial(*args)
28
18
  Proc.new do |*spice|
29
19
  result = args.collect do |a|
30
- MissingArgument == a ? spice.pop : a
20
+ X == a ? spice.pop : a
31
21
  end
32
22
  call(*result)
33
23
  end
@@ -35,3 +25,15 @@ class Proc
35
25
 
36
26
  end
37
27
 
28
+ # X class is used to represent an argument "slot".
29
+
30
+ class X < ArgumentError
31
+ end
32
+
33
+ # Convenience method for an argument slot.
34
+ # It simple returns the X exception class.
35
+
36
+ def __
37
+ X
38
+ end
39
+
File without changes
@@ -0,0 +1,157 @@
1
+ # TITLE:
2
+ #
3
+ # Preinitialize
4
+ #
5
+ # DESCRIPTION:
6
+ #
7
+ # Presend a module to another module, or to a class.
8
+ #
9
+ # COPYRIGHT:
10
+ #
11
+ # Copyright (c) 2005 Thomas Sawyer
12
+ #
13
+ # LICENSE:
14
+ #
15
+ # Ruby License
16
+ #
17
+ # This module is free software. You may use, modify, and/or redistribute this
18
+ # software under the same terms as Ruby.
19
+ #
20
+ # This program is distributed in the hope that it will be useful, but WITHOUT
21
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
22
+ # FOR A PARTICULAR PURPOSE.
23
+ #
24
+ # AUTHORS:
25
+ #
26
+ # - Thomas Sawyer
27
+
28
+ require 'facets/kernel/object' # for object_class
29
+
30
+ # = Preinitialize
31
+ #
32
+ # This is an object preinitialize system, which provides
33
+ # an elegant way to initialize an object allowing the
34
+ # class to provide additional default structure to an
35
+ # object prior to calling initialize.
36
+ #
37
+ # In effect it does two things after allocating the object
38
+ # but prior to initializing it.
39
+ #
40
+ # First, it calls the class method #default_instance_variables,
41
+ # which returns a hash and by default returns the hash
42
+ # stored in @default_instance_variables. It uses this to
43
+ # pre-define instance variables.
44
+ #
45
+ # Then it goes to the top of the class hierarchy and works
46
+ # it's way down calling #preinitialize if defined.
47
+ # WARNING! It is rather useless to use <tt>super</tt>
48
+ # inside the any preinitialize hook.
49
+ #
50
+ # module M
51
+ # def preinitialize
52
+ # @a = 23
53
+ # end
54
+ # end
55
+ #
56
+ # class X
57
+ # include M
58
+ # def a ; @a ; end
59
+ # end
60
+ #
61
+ # x = X.new
62
+ # x.a #=> 23
63
+ #
64
+ # If neded the original new method has been aliased, albeit
65
+ # <tt>postinitialize_new</tt> is probably a bit of a misnomer.
66
+
67
+ #--
68
+ # class Module
69
+ #
70
+ # def default_instance_variables(complete=false)
71
+ # @default_instance_variables ||= {}
72
+ # unless complete
73
+ # return @default_instance_variables
74
+ # else
75
+ # parent = ancestors[1]
76
+ # if parent
77
+ # return @default_instance_variables.merge(parent.default_instance_variables)
78
+ # else
79
+ # return @default_instance_variables
80
+ # end
81
+ # end
82
+ # end
83
+ #
84
+ # end
85
+ #++
86
+
87
+ class Class
88
+ alias_method :postinitialize_new, :new
89
+
90
+ def new(*args, &blk)
91
+ o = allocate
92
+
93
+ #if respond_to?(:default_instance_variables)
94
+ # default_instance_variables.each{|k,v| o.instance_variable_set( "@#{k.to_s.gsub(/\W$/,'')}",v )}
95
+ #end
96
+
97
+ a = ancestors
98
+ until a.empty?
99
+ m = a.pop
100
+ #if m.private_instance_methods.include?('preinitialize') or m.public_instance_methods.include?('preinitialize')
101
+ if m.method_defined?('preinitialize') or m.private_method_defined?('preinitialize')
102
+ im = instance_method('preinitialize')
103
+ im.arity == 0 ? im.bind(o).call : im.bind(o).call(*args, &blk)
104
+ end
105
+ end
106
+
107
+ o.__send__(:initialize, *args, &blk) if o.object_class.private_method_defined?(:initialize)
108
+
109
+ o
110
+ end
111
+ end
112
+
113
+
114
+
115
+ # _____ _
116
+ # |_ _|__ ___| |_
117
+ # | |/ _ \/ __| __|
118
+ # | | __/\__ \ |_
119
+ # |_|\___||___/\__|
120
+ #
121
+
122
+ =begin test
123
+
124
+ require 'test/unit'
125
+
126
+ class TC_Preinitalize < Test::Unit::TestCase
127
+
128
+ module M
129
+ def preinitialize
130
+ @a = 10
131
+ end
132
+ end
133
+
134
+ class X
135
+ include M
136
+ def a ; @a ; end
137
+ end
138
+
139
+ class Y < X
140
+ def initialize
141
+ super
142
+ end
143
+ end
144
+
145
+ def test_01
146
+ x = X.new
147
+ assert_equal( 10, x.a )
148
+ end
149
+
150
+ def test_01
151
+ y = Y.new
152
+ assert_equal( 10, y.a )
153
+ end
154
+
155
+ end
156
+
157
+ =end