facets 2.1.3 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (303) hide show
  1. data/AUTHORS +14 -12
  2. data/CHANGES +45 -2
  3. data/NOTES +9 -7
  4. data/lib/core/facets/1stclassmethod.rb +15 -11
  5. data/lib/core/facets/array.rb +0 -1
  6. data/lib/core/facets/array/conjoin.rb +40 -8
  7. data/lib/core/facets/array/delete.rb +8 -2
  8. data/lib/core/facets/array/indexable.rb +30 -3
  9. data/lib/core/facets/array/merge.rb +11 -0
  10. data/lib/core/facets/array/only.rb +3 -3
  11. data/lib/core/facets/array/pad.rb +4 -46
  12. data/lib/core/facets/array/rotate.rb +4 -4
  13. data/lib/core/facets/array/select.rb +2 -0
  14. data/lib/core/facets/array/splice.rb +16 -2
  15. data/lib/core/facets/array/stackable.rb +6 -40
  16. data/lib/core/facets/binding.rb +3 -0
  17. data/lib/core/facets/binding/cflow.rb +10 -64
  18. data/lib/core/facets/binding/defined.rb +10 -0
  19. data/lib/core/facets/binding/eval.rb +10 -76
  20. data/lib/core/facets/binding/here.rb +9 -0
  21. data/lib/core/facets/binding/self.rb +10 -0
  22. data/lib/core/facets/binding/vars.rb +0 -45
  23. data/lib/core/facets/boolean.rb +31 -103
  24. data/lib/core/facets/class/descendents.rb +17 -44
  25. data/lib/core/facets/comparable/bound.rb +8 -70
  26. data/lib/core/facets/comparable/cmp.rb +12 -92
  27. data/lib/core/facets/conversion.rb +122 -321
  28. data/lib/core/facets/dir/multiglob.rb +0 -13
  29. data/lib/core/facets/dir/traverse.rb +61 -111
  30. data/lib/core/facets/enumerable.rb +4 -2
  31. data/lib/core/facets/enumerable/cartesian.rb +36 -85
  32. data/lib/core/facets/enumerable/collect.rb +64 -152
  33. data/lib/core/facets/enumerable/combination.rb +40 -42
  34. data/lib/core/facets/enumerable/count.rb +99 -174
  35. data/lib/core/facets/enumerable/each.rb +86 -0
  36. data/lib/core/facets/enumerable/mash.rb +58 -0
  37. data/lib/core/facets/enumerable/permutation.rb +39 -44
  38. data/lib/core/facets/enumerable/probability.rb +16 -90
  39. data/lib/core/facets/enumerable/split.rb +113 -0
  40. data/lib/core/facets/exception/detail.rb +1 -2
  41. data/lib/core/facets/facets.rb +3 -2
  42. data/lib/core/facets/file/read.rb +4 -59
  43. data/lib/core/facets/file/topath.rb +8 -96
  44. data/lib/core/facets/file/write.rb +21 -49
  45. data/lib/core/facets/filetest/root.rb +4 -3
  46. data/lib/core/facets/functor.rb +5 -43
  47. data/lib/core/facets/hash/at.rb +7 -37
  48. data/lib/core/facets/hash/delete.rb +9 -58
  49. data/lib/core/facets/hash/has_keys.rb +4 -43
  50. data/lib/core/facets/hash/insert.rb +5 -38
  51. data/lib/core/facets/hash/inverse.rb +2 -41
  52. data/lib/core/facets/hash/iterate.rb +4 -45
  53. data/lib/core/facets/hash/keyize.rb +24 -92
  54. data/lib/core/facets/hash/merge.rb +4 -38
  55. data/lib/core/facets/hash/new.rb +5 -38
  56. data/lib/core/facets/hash/op.rb +20 -66
  57. data/lib/core/facets/hash/rekey.rb +9 -87
  58. data/lib/core/facets/hash/select.rb +1 -1
  59. data/lib/core/facets/hash/slice.rb +42 -0
  60. data/lib/core/facets/hash/traverse.rb +6 -46
  61. data/lib/core/facets/hash/update.rb +27 -67
  62. data/lib/core/facets/hash/weave.rb +22 -42
  63. data/lib/core/facets/indexable.rb +42 -14
  64. data/lib/core/facets/integer/bitmask.rb +69 -106
  65. data/lib/core/facets/integer/factorial.rb +1 -44
  66. data/lib/core/facets/integer/multiples.rb +27 -22
  67. data/lib/core/facets/integer/of.rb +1 -33
  68. data/lib/core/facets/kernel.rb +4 -2
  69. data/lib/core/facets/kernel/ask.rb +15 -3
  70. data/lib/core/facets/kernel/callstack.rb +38 -69
  71. data/lib/core/facets/kernel/constant.rb +2 -38
  72. data/lib/core/facets/kernel/deepcopy.rb +3 -55
  73. data/lib/core/facets/kernel/dir.rb +2 -0
  74. data/lib/core/facets/kernel/ergo.rb +2 -2
  75. data/lib/core/facets/kernel/instance.rb +51 -120
  76. data/lib/core/facets/kernel/metaid.rb +35 -73
  77. data/lib/core/facets/kernel/object.rb +14 -39
  78. data/lib/core/facets/kernel/op_esc.rb +24 -2
  79. data/lib/core/facets/kernel/populate.rb +6 -69
  80. data/lib/core/facets/kernel/report.rb +28 -33
  81. data/lib/core/facets/kernel/require.rb +7 -21
  82. data/lib/core/facets/kernel/respond.rb +11 -1
  83. data/lib/core/facets/kernel/returning.rb +50 -0
  84. data/lib/core/facets/kernel/silence.rb +12 -24
  85. data/lib/core/facets/kernel/super.rb +12 -76
  86. data/lib/core/facets/kernel/tap.rb +25 -107
  87. data/lib/core/facets/kernel/val.rb +7 -46
  88. data/lib/core/facets/kernel/withattr.rb +6 -64
  89. data/lib/core/facets/matchdata/matchset.rb +8 -50
  90. data/lib/core/facets/module.rb +3 -1
  91. data/lib/core/facets/module/abstract.rb +9 -47
  92. data/lib/core/facets/module/alias.rb +11 -68
  93. data/lib/core/facets/module/attr.rb +36 -15
  94. data/lib/core/facets/module/cattr.rb +8 -76
  95. data/lib/core/facets/module/clone.rb +15 -66
  96. data/lib/core/facets/module/include.rb +54 -114
  97. data/lib/core/facets/module/methods.rb +15 -13
  98. data/lib/core/facets/module/modify.rb +20 -206
  99. data/lib/core/facets/module/name.rb +19 -83
  100. data/lib/core/facets/module/require.rb +48 -53
  101. data/lib/core/facets/module/traits.rb +74 -33
  102. data/lib/core/facets/nilclass/status.rb +25 -2
  103. data/lib/core/facets/numeric/round.rb +24 -89
  104. data/lib/core/facets/proc/bind.rb +16 -59
  105. data/lib/core/facets/proc/compose.rb +6 -40
  106. data/lib/core/facets/proc/fn.rb +2 -0
  107. data/lib/core/facets/range/combine.rb +15 -51
  108. data/lib/core/facets/range/overlap.rb +8 -64
  109. data/lib/core/facets/regexp/arity.rb +6 -41
  110. data/lib/core/facets/stackable.rb +43 -4
  111. data/lib/core/facets/string.rb +2 -0
  112. data/lib/core/facets/string/align.rb +45 -55
  113. data/lib/core/facets/string/blank.rb +2 -46
  114. data/lib/core/facets/string/bracket.rb +14 -87
  115. data/lib/core/facets/string/case.rb +45 -32
  116. data/lib/core/facets/string/crypt.rb +3 -40
  117. data/lib/core/facets/string/filter.rb +7 -49
  118. data/lib/core/facets/string/format.rb +24 -126
  119. data/lib/core/facets/string/indexable.rb +50 -133
  120. data/lib/core/facets/string/interpolate.rb +24 -59
  121. data/lib/core/facets/string/natcmp.rb +5 -39
  122. data/lib/core/facets/string/nchar.rb +37 -45
  123. data/lib/core/facets/string/op.rb +13 -0
  124. data/lib/core/facets/string/partitions.rb +38 -99
  125. data/lib/core/facets/string/range.rb +8 -49
  126. data/lib/core/facets/string/regesc.rb +9 -42
  127. data/lib/core/facets/string/scan.rb +6 -52
  128. data/lib/core/facets/string/splice.rb +8 -13
  129. data/lib/core/facets/string/tabs.rb +16 -153
  130. data/lib/core/facets/symbol.rb +3 -1
  131. data/lib/core/facets/symbol/chomp.rb +11 -29
  132. data/lib/core/facets/symbol/generate.rb +4 -43
  133. data/lib/core/facets/symbol/not.rb +13 -25
  134. data/lib/core/facets/symbol/shadow.rb +2 -40
  135. data/lib/core/facets/symbol/succ.rb +14 -13
  136. data/lib/core/facets/symbol/to_proc.rb +33 -28
  137. data/lib/core/facets/time.rb +1 -0
  138. data/lib/core/facets/time/change.rb +5 -38
  139. data/lib/core/facets/time/elapse.rb +2 -41
  140. data/lib/core/facets/time/stamp.rb +47 -0
  141. data/lib/core/facets/unboundmethod.rb +3 -0
  142. data/lib/core/facets/unboundmethod/arguments.rb +27 -4
  143. data/lib/core/facets/unboundmethod/name.rb +21 -7
  144. data/lib/methods/facets/enumerable/cluster_by.rb +1 -1
  145. data/lib/methods/facets/enumerable/collate.rb +1 -0
  146. data/lib/methods/facets/enumerable/divide.rb +1 -1
  147. data/lib/methods/facets/enumerable/each_by.rb +1 -1
  148. data/lib/methods/facets/enumerable/each_pair.rb +1 -1
  149. data/lib/methods/facets/enumerable/eachn.rb +1 -1
  150. data/lib/methods/facets/enumerable/graph.rb +1 -1
  151. data/lib/methods/facets/enumerable/group_by.rb +1 -1
  152. data/lib/methods/facets/enumerable/inject.rb +1 -0
  153. data/lib/methods/facets/enumerable/map_send.rb +1 -0
  154. data/lib/methods/facets/enumerable/modulate.rb +1 -0
  155. data/lib/methods/facets/enumerable/partition_by.rb +1 -1
  156. data/lib/methods/facets/hash/collate.rb +1 -1
  157. data/lib/methods/facets/hash/except.rb +1 -0
  158. data/lib/methods/facets/hash/graph.rb +1 -1
  159. data/lib/methods/facets/hash/mash.rb +1 -0
  160. data/lib/methods/facets/kernel/Bit.rb +1 -0
  161. data/lib/methods/facets/kernel/complete.rb +1 -1
  162. data/lib/methods/facets/kernel/here.rb +1 -1
  163. data/lib/methods/facets/kernel/non_nil.rb +1 -0
  164. data/lib/methods/facets/kernel/respond_with_value.rb +1 -0
  165. data/lib/methods/facets/kernel/with.rb +1 -1
  166. data/lib/methods/facets/module/class_def.rb +1 -0
  167. data/lib/methods/facets/string/camelcase.rb +1 -0
  168. data/lib/methods/facets/string/op_minus.rb +1 -0
  169. data/lib/methods/facets/string/snakecase.rb +1 -0
  170. data/lib/more/facets/attributes.rb +5 -5
  171. data/lib/more/facets/basicobject.rb +0 -62
  172. data/lib/{core/facets/continuation/create.rb → more/facets/continuation.rb} +4 -21
  173. data/lib/more/facets/duration.rb +534 -0
  174. data/lib/more/facets/lazy.rb +3 -3
  175. data/lib/more/facets/namespace.rb +23 -71
  176. data/lib/more/facets/rbsystem.rb +42 -8
  177. data/lib/more/facets/stylize.rb +6 -3
  178. data/lib/more/facets/thread.rb +55 -0
  179. data/meta/MANIFEST +49 -18
  180. data/meta/ROLLRC +1 -1
  181. data/meta/project.yaml +2 -2
  182. data/task/install +1 -1
  183. data/task/test/general +8 -2
  184. data/test/unit/array/test_pad.rb +30 -45
  185. data/test/unit/array/test_stackable.rb +14 -28
  186. data/test/unit/binding/test_cflow.rb +34 -49
  187. data/test/unit/binding/test_defined.rb +17 -0
  188. data/test/unit/binding/test_eval.rb +11 -39
  189. data/test/unit/binding/test_here.rb +17 -0
  190. data/test/unit/binding/test_self.rb +17 -0
  191. data/test/unit/binding/test_vars.rb +22 -37
  192. data/test/unit/class/test_descendents.rb +15 -30
  193. data/test/unit/class/test_initializer.rb +1 -8
  194. data/test/unit/comparable/test_bound.rb +38 -53
  195. data/test/unit/comparable/test_cmp.rb +45 -60
  196. data/test/unit/dir/test_traverse.rb +56 -0
  197. data/test/unit/enumerable/test_cartesian.rb +34 -47
  198. data/test/unit/enumerable/test_collect.rb +16 -125
  199. data/test/unit/enumerable/test_combination.rb +1 -8
  200. data/test/unit/enumerable/test_count.rb +51 -66
  201. data/test/unit/enumerable/test_each.rb +77 -0
  202. data/test/unit/enumerable/test_mash.rb +51 -0
  203. data/test/unit/enumerable/test_permutation.rb +1 -7
  204. data/test/unit/enumerable/test_probability.rb +42 -55
  205. data/test/unit/enumerable/test_split.rb +52 -0
  206. data/test/unit/exception/test_detail.rb +19 -0
  207. data/test/unit/file/test_read.rb +34 -0
  208. data/test/unit/file/test_topath.rb +17 -25
  209. data/test/unit/file/test_write.rb +6 -12
  210. data/test/unit/filetest/test_root.rb +14 -0
  211. data/test/unit/hash/test_at.rb +9 -21
  212. data/test/unit/hash/test_delete.rb +22 -37
  213. data/test/unit/hash/test_has_keys.rb +13 -28
  214. data/test/unit/hash/test_insert.rb +9 -23
  215. data/test/unit/hash/test_inverse.rb +11 -26
  216. data/test/unit/hash/test_iterate.rb +16 -31
  217. data/test/unit/hash/test_keyize.rb +40 -55
  218. data/test/unit/hash/test_merge.rb +10 -25
  219. data/test/unit/hash/test_new.rb +9 -24
  220. data/test/unit/hash/test_op.rb +1 -7
  221. data/test/unit/hash/test_rekey.rb +47 -62
  222. data/test/unit/hash/test_traverse.rb +17 -32
  223. data/test/unit/hash/test_update.rb +30 -45
  224. data/test/unit/hash/test_weave.rb +10 -23
  225. data/test/unit/integer/test_bitmask.rb +48 -44
  226. data/test/unit/integer/test_factorial.rb +11 -26
  227. data/test/unit/integer/test_multiples.rb +1 -5
  228. data/test/unit/integer/test_of.rb +14 -29
  229. data/test/unit/kernel/test_callstack.rb +13 -28
  230. data/test/unit/kernel/test_constant.rb +14 -28
  231. data/test/unit/kernel/test_deepcopy.rb +20 -35
  232. data/test/unit/kernel/test_instance.rb +46 -61
  233. data/test/unit/kernel/test_metaid.rb +42 -57
  234. data/test/unit/kernel/test_object.rb +14 -29
  235. data/test/unit/kernel/test_populate.rb +38 -53
  236. data/test/unit/kernel/test_report.rb +1 -7
  237. data/test/unit/kernel/test_returning.rb +16 -0
  238. data/test/unit/kernel/test_silence.rb +8 -23
  239. data/test/unit/kernel/test_super.rb +41 -56
  240. data/test/unit/kernel/test_tap.rb +15 -39
  241. data/test/unit/kernel/test_val.rb +7 -20
  242. data/test/unit/kernel/test_withattr.rb +29 -44
  243. data/test/unit/matchdata/test_matchset.rb +20 -35
  244. data/test/unit/module/test_abstract.rb +15 -30
  245. data/test/unit/module/test_alias.rb +32 -45
  246. data/test/unit/module/test_cattr.rb +39 -54
  247. data/test/unit/module/test_clone.rb +31 -43
  248. data/test/unit/module/test_include.rb +1 -35
  249. data/test/unit/module/test_modify.rb +102 -114
  250. data/test/unit/module/test_name.rb +1 -7
  251. data/test/unit/numeric/test_round.rb +46 -61
  252. data/test/unit/proc/test_bind.rb +29 -44
  253. data/test/unit/proc/test_compose.rb +20 -35
  254. data/test/unit/range/test_combine.rb +14 -29
  255. data/test/unit/range/test_overlap.rb +34 -51
  256. data/test/unit/regexp/test_arity.rb +14 -29
  257. data/test/unit/string/test_align.rb +13 -27
  258. data/test/unit/string/test_blank.rb +12 -27
  259. data/test/unit/string/test_bracket.rb +52 -67
  260. data/test/unit/string/test_case.rb +19 -38
  261. data/test/unit/string/test_crypt.rb +10 -25
  262. data/test/unit/string/test_filter.rb +1 -7
  263. data/test/unit/string/test_format.rb +2 -7
  264. data/test/unit/string/test_indexable.rb +54 -69
  265. data/test/unit/string/test_interpolate.rb +8 -21
  266. data/test/unit/string/test_natcmp.rb +11 -26
  267. data/test/unit/string/test_nchar.rb +1 -14
  268. data/test/unit/string/test_op.rb +14 -0
  269. data/test/unit/string/test_partitions.rb +39 -54
  270. data/test/unit/string/test_range.rb +17 -32
  271. data/test/unit/string/test_regesc.rb +1 -7
  272. data/test/unit/string/test_scan.rb +23 -38
  273. data/test/unit/string/test_stackable.rb +79 -98
  274. data/test/unit/string/test_tabs.rb +1 -7
  275. data/test/unit/symbol/test_chomp.rb +10 -21
  276. data/test/unit/symbol/test_generate.rb +7 -22
  277. data/test/unit/symbol/test_not.rb +10 -25
  278. data/test/unit/symbol/test_shadow.rb +8 -23
  279. data/test/unit/symbol/test_succ.rb +1 -7
  280. data/test/unit/symbol/test_to_proc.rb +1 -7
  281. data/test/unit/test_attributes.rb +1 -1
  282. data/test/unit/test_continuation.rb +13 -0
  283. data/test/unit/test_conversion.rb +1 -14
  284. data/test/unit/test_namespace.rb +30 -3
  285. data/test/unit/test_thread.rb +23 -0
  286. data/test/unit/time/test_change.rb +11 -26
  287. data/test/unit/time/test_elapse.rb +10 -25
  288. data/test/unit/time/test_stamp.rb +28 -0
  289. metadata +65 -25
  290. data/lib/core/facets/array/unzip.rb +0 -14
  291. data/lib/core/facets/continuation.rb +0 -1
  292. data/lib/core/facets/enumerable/collate.rb +0 -104
  293. data/lib/core/facets/kernel/require_esc.rb +0 -44
  294. data/lib/more/facets/mapsend.rb +0 -98
  295. data/lib/more/facets/pp_s.rb +0 -30
  296. data/log/history.rd +0 -38
  297. data/log/todo.rd +0 -4
  298. data/task/special/quickopts +0 -15
  299. data/test/unit/continuation/test_create.rb +0 -28
  300. data/test/unit/enumerable/test_collate.rb +0 -51
  301. data/test/unit/kernel/test_require_esc.rb +0 -29
  302. data/test/unit/test_mapsend.rb +0 -18
  303. data/test/unit/test_pp_s.rb +0 -17
@@ -1,12 +1,3 @@
1
- # TITLE:
2
- #
3
- # Kernel Constant
4
- #
5
- # DESCRIPTION:
6
- #
7
- # Get a constant. But more convenient than const_get.
8
-
9
- #
10
1
  module Kernel
11
2
 
12
3
  # This is similar to +Module#const_get+ but is accessible at all levels,
@@ -22,6 +13,8 @@ module Kernel
22
13
  # Test.constant("Unit::Assertions") # -> Test::Unit::Assertions
23
14
  # Test.constant("::Test::Unit") # -> Test::Unit
24
15
  #
16
+ # CREDIT: Trans
17
+
25
18
  def constant(const)
26
19
  const = const.to_s.dup
27
20
  base = const.sub!(/^::/, '') ? Object : ( self.kind_of?(Module) ? self : self.class )
@@ -29,32 +22,3 @@ module Kernel
29
22
  end
30
23
 
31
24
  end
32
-
33
-
34
-
35
- # _____ _
36
- # |_ _|__ ___| |_
37
- # | |/ _ \/ __| __|
38
- # | | __/\__ \ |_
39
- # |_|\___||___/\__|
40
- #
41
- =begin test
42
-
43
- require 'test/unit'
44
-
45
- class TCKernel < Test::Unit::TestCase
46
-
47
- def test_constant
48
- c = ::Test::Unit::TestCase.name
49
- assert_equal( ::Test::Unit::TestCase, constant(c) )
50
- c = "Test::Unit::TestCase"
51
- assert_equal( ::Test::Unit::TestCase, constant(c) )
52
- c = "Unit::TestCase"
53
- assert_equal( ::Test::Unit::TestCase, Test.constant(c) )
54
- c = "TestCase"
55
- assert_equal( ::Test::Unit::TestCase, Test::Unit.constant(c) )
56
- end
57
-
58
- end
59
-
60
- =end
@@ -1,19 +1,3 @@
1
- # TITLE:
2
- #
3
- # Copy Extensions
4
- #
5
- # FILE:
6
- #
7
- # kernel/copy.rb
8
- #
9
- # DESCRIPTION:
10
- #
11
- # Kernel extensions for copying objects.
12
- #
13
- # AUTHORS:
14
- #
15
- # CREDIT Jan Molic
16
-
17
1
  module Kernel
18
2
 
19
3
  # Anything that can be marshaled can be copied in totality.
@@ -25,7 +9,7 @@ module Kernel
25
9
  Marshal::load(Marshal::dump(self))
26
10
  end
27
11
 
28
- alias deep_copy copy
12
+ alias_method :deep_copy, :copy
29
13
 
30
14
  # Adds deep_clone method to an object which produces deep copy of it. It means
31
15
  # if you clone a Hash, every nested items and their nested items will be cloned.
@@ -37,6 +21,8 @@ module Kernel
37
21
  # obj.push( 'foo' )
38
22
  # p obj # >> [ 'foo' ]
39
23
  # p b[2] # >> []
24
+ #
25
+ # CREDIT: Jan Molic
40
26
 
41
27
  def deep_clone( obj=self, cloned={} )
42
28
  if cloned.has_key?( obj.object_id )
@@ -71,41 +57,3 @@ module Kernel
71
57
  end
72
58
 
73
59
  end
74
-
75
-
76
- # _____ _
77
- # |_ _|__ ___| |_
78
- # | |/ _ \/ __| __|
79
- # | | __/\__ \ |_
80
- # |_|\___||___/\__|
81
- #
82
- =begin test
83
-
84
- require 'test/unit'
85
-
86
- class TestKernelCopy < Test::Unit::TestCase
87
-
88
- # fixtures for copy / deep_copy
89
- class A
90
- attr_reader :a
91
- def initialize
92
- @a = 1
93
- end
94
- end
95
-
96
- class B
97
- attr_reader :b
98
- def initialize
99
- @b = A.new
100
- end
101
- end
102
-
103
- def test_deep_copy
104
- o = B.new
105
- oc = o.deep_copy
106
- assert_equal( 1, o.b.a )
107
- end
108
-
109
- end
110
-
111
- =end
@@ -3,6 +3,8 @@ module Kernel
3
3
 
4
4
  # Similar to __FILE__ and __LINE__, __DIR__ provides
5
5
  # the directory path to the current executing script.
6
+ #
7
+ # CREDIT: Trans
6
8
 
7
9
  def __DIR__
8
10
  (/^(.+)?:\d+/ =~ caller[0]) ? File.dirname($1) : nil
@@ -12,7 +12,7 @@ module Kernel
12
12
  #
13
13
  # This is like #tap, but tap yields self -and- returns self.
14
14
  #
15
- # CREDIT Daniel DeLorme
15
+ # CREDIT: Daniel DeLorme
16
16
 
17
17
  def ergo &b
18
18
  if block_given?
@@ -31,7 +31,7 @@ class NilClass
31
31
  # "a".ergo{ |o| o.upcase } #=> "A"
32
32
  # nil.ergo{ |o| o.bar } #=> nil
33
33
  #
34
- # CREDIT Daniel DeLorme
34
+ # CREDIT: Daniel DeLorme
35
35
 
36
36
  def ergo
37
37
  @_ergo ||= Functor.new{ nil }
@@ -1,43 +1,31 @@
1
- # TITLE:
2
- #
3
- # Instance Methods
4
- #
5
- # FILE:
6
- #
7
- # kernel/instance.rb
8
- #
9
- # DESCRIPTION:
10
- #
11
- # Kernel extension prefixed by instance_ which provide
12
- # internal (eg private) access to the object.
13
- #
14
- # AUTHORS:
15
- #
16
- # CREDIT Thomas Sawyer
17
- #
18
- # NOTES:
19
- #
20
- # TODO Should instance_assign be named instance_variable_assign?
21
- # Likewise for instance_assume. Is there a better term than 'assume'?
22
- #
23
- # TODO How to handle instance_exec? It's require proc/bind to work
24
- # But that requires thread which we don't want to load automatically.
25
- #
26
- # TODO Should the __shadow__ methods be defined elsewhere?
27
-
28
- require 'facets/proc/bind'
29
-
30
- #
1
+ unless (RUBY_VERSION[0,3] == '1.9')
2
+ require 'facets/proc/bind'
3
+ end
4
+
31
5
  module Kernel
6
+ #
7
+ # Kernel extension prefixed by instance_ which provide
8
+ # internal (eg private) access to the object.
9
+ #
10
+
11
+ unless (RUBY_VERSION[0,3] == '1.9')
12
+ # Like instance_eval but allows parameters to be passed.
13
+ #
14
+ # TODO: Remove for Ruby 1.9.
15
+
16
+ def instance_exec(*arguments, &block)
17
+ block.bind(self)[*arguments]
18
+ end
19
+ end
32
20
 
33
21
  # Shadow method for instance_variable_get.
34
- alias :__get__ :instance_variable_get
22
+ alias_method :__get__, :instance_variable_get
35
23
 
36
24
  # Shadow method for instance_variable_set.
37
- alias :__set__ :instance_variable_set
25
+ alias_method :__set__, :instance_variable_set
38
26
 
39
27
  # Private send. Why isn't #send called instance_send in the first place?
40
- alias :instance_send :send
28
+ alias_method :instance_send, :send
41
29
 
42
30
  # Easy access to an object qua class, otherwise known
43
31
  # as the object's metaclass or singleton class. This
@@ -46,16 +34,27 @@ module Kernel
46
34
  #
47
35
  # It is what it is.
48
36
  #
49
- # -- 7rans0noma
50
- #
37
+ # CREDIT: Trans
38
+
51
39
  def instance_class( &block )
52
40
  (class << self; self; end).module_eval(&block) if block
53
41
  (class << self; self; end)
54
42
  end
55
43
 
56
- # CREDIT David Heinemeier Hansson
57
-
58
44
  # Return instance variable values in an array.
45
+ #
46
+ # class X
47
+ # def initialize(a,b)
48
+ # @a, @b = a, b
49
+ # end
50
+ # end
51
+ #
52
+ # x = X.new(1,2)
53
+ #
54
+ # x.instance_values #=> [1,2]
55
+ #
56
+ # CREDIT: David Heinemeier Hansson
57
+
59
58
  def instance_values
60
59
  instance_variables.inject({}) do |values, name|
61
60
  values[name[1..-1]] = instance_variable_get(name)
@@ -63,12 +62,6 @@ module Kernel
63
62
  end
64
63
  end
65
64
 
66
- # Like instace_eval but allows parameters to be passed.
67
- #
68
- def instance_exec(*arguments, &block)
69
- block.bind(self)[*arguments]
70
- end
71
-
72
65
  # Assign instance vars using another object.
73
66
  #
74
67
  # class O
@@ -88,6 +81,8 @@ module Kernel
88
81
  # o2.instance_eval{ @b } #=> 2
89
82
  # o2.instance_eval{ @c } #=> 3
90
83
  # o2.instance_eval{ @d } #=> 4
84
+ #
85
+ # CREDIT: Trans
91
86
 
92
87
  def instance_assume(obj, *vars)
93
88
  if vars.empty?
@@ -104,11 +99,17 @@ module Kernel
104
99
  return self # ???
105
100
  end
106
101
 
107
- # For backward compatability (DEPRECATED).
108
- alias :assign_from :instance_assume
102
+ # For backward compatability (TO BE DEPRECATED).
103
+
104
+ def assign_from(*args)
105
+ warn "use instance_assume for a future version"
106
+ instance_assume(*args)
107
+ end
109
108
 
110
109
  # As with #instance_assume, but forces the setting of the object's
111
- # instance varaibles even if the recieve doesn't have them defined.
110
+ # instance varaibles even if the reciever doesn't have them defined.
111
+ #
112
+ # See #instance_assume.
112
113
 
113
114
  def instance_assume!(obj, *vars)
114
115
  if vars.empty?
@@ -135,8 +136,10 @@ module Kernel
135
136
  # @b #=> 2
136
137
  #
137
138
  #--
138
- # TODO Make a little more flexiable to allow any hash-like object.
139
- # TODO Should is also accept class variables? (eg. @@a)
139
+ # TODO: Make a little more flexiable to allow any hash-like object.
140
+ # TODO: Should is also accept class variables? (eg. @@a)
141
+ # TODO: Should instance_assign be named instance_variable_assign?
142
+ # Likewise for instance_assume. Is there a better term than 'assume'?
140
143
  #++
141
144
 
142
145
  def instance_assign(*args)
@@ -171,75 +174,3 @@ module Kernel
171
174
  # For backward compatability (DEPRECATED).
172
175
  alias :assign_with :instance_assign
173
176
  end
174
-
175
-
176
-
177
- # _____ _
178
- # |_ _|__ ___| |_
179
- # | |/ _ \/ __| __|
180
- # | | __/\__ \ |_
181
- # |_|\___||___/\__|
182
- #
183
- =begin test
184
-
185
- require 'test/unit'
186
-
187
- class TestKernelInstance < Test::Unit::TestCase
188
-
189
- def test_instance_class
190
- o = Object.new
191
- assert_equal( (class << o; self; end), o.instance_class )
192
- end
193
-
194
- def test_instance_assign
195
- ahash = { "z"=>0, "@a"=>1, "@b"=>2 } #, "@@a"=>3 }
196
- instance_assign( ahash )
197
- assert_equal( 0, @z )
198
- assert_equal( 1, @a )
199
- assert_equal( 2, @b )
200
- #assert_equal( 3, @@a )
201
- end
202
-
203
- end
204
-
205
- class TestInstanceEvalWithArgs < Test::Unit::TestCase
206
-
207
- class Dummy
208
- def f
209
- :dummy_value
210
- end
211
- end
212
-
213
- def test_instance_exec
214
- # Create a block that returns the value of an argument
215
- # and a value of a method call to +self+.
216
- block = lambda { |a| [a, f] }
217
- assert_equal [:arg_value, :dummy_value],
218
- Dummy.new.instance_exec(:arg_value, &block)
219
- end
220
-
221
- def test_instance_exec_with_frozen_obj
222
- block = lambda { |a| [a, f] }
223
- obj = Dummy.new
224
- obj.freeze
225
- assert_equal [:arg_value, :dummy_value], obj.instance_exec(:arg_value, &block)
226
- end
227
-
228
- def test_instance_exec_nested
229
- i = 0
230
- obj = Dummy.new
231
- block = lambda do |arg|
232
- [arg] + instance_exec(1){|a| [f, a] }
233
- end
234
- assert_equal([:arg_value, :dummy_value, 1], obj.instance_exec(:arg_value, &block))
235
- end
236
-
237
- def test_instance_exec_with_immediate_value
238
- obj = 1
239
- block = lambda { |a| [a,self] }
240
- assert_equal(["A", 1], obj.instance_exec("A", &block))
241
- end
242
-
243
- end
244
-
245
- =end
@@ -1,16 +1,3 @@
1
- # TITLE:
2
- #
3
- # Metaid
4
- #
5
- # SUMMARY:
6
- #
7
- # Meta programming methods, for accessing
8
- # object singleton class.
9
- #
10
- # AUTHORS:
11
- #
12
- # CREDIT WhyTheLuckyStiff
13
-
14
1
  require 'facets/functor'
15
2
 
16
3
  module Kernel
@@ -24,6 +11,8 @@ module Kernel
24
11
  #
25
12
  # X.a = 1
26
13
  # X.a #=> 1
14
+ #
15
+ # CREDIT: Trans
27
16
 
28
17
  def meta
29
18
  @_meta_functor ||= Functor.new do |op,*args|
@@ -32,6 +21,12 @@ module Kernel
32
21
  end
33
22
 
34
23
  # Alias a method defined in the metaclass (ie. singleton class).
24
+ #
25
+ # def X.y?; "y?" ; end
26
+ # X.meta_alias "ynot?", "y?"
27
+ # X.ynot? #=> y?
28
+ #
29
+ # CREDIT: Trans
35
30
 
36
31
  def meta_alias(*args)
37
32
  meta_class do
@@ -39,17 +34,26 @@ module Kernel
39
34
  end
40
35
  end
41
36
 
42
- # Evaluate code in a metaclass.
37
+ # Evaluate code in a metaclass. This is equivalent to
38
+ # 'meta_class.instance_eval'.
39
+ #
40
+ # CREDIT: WhyTheLuckyStiff
43
41
 
44
- def meta_eval( str=nil, &blk )
42
+ def meta_eval(str=nil, &blk)
45
43
  if str
46
- meta_class.instance_eval( str )
44
+ meta_class.instance_eval(str)
47
45
  else
48
- meta_class.instance_eval( &blk )
46
+ meta_class.instance_eval(&blk)
49
47
  end
50
48
  end
51
49
 
52
- # Add method to a meta-class.
50
+ # Add method to a meta-class --i.e. a singleton method.
51
+ #
52
+ # class X; end
53
+ # X.meta_def(:x){"x"}
54
+ # X.x #=> "x"
55
+ #
56
+ # CREDIT: WhyTheLuckyStiff
53
57
 
54
58
  def meta_def( name, &block )
55
59
  meta_class do
@@ -57,12 +61,6 @@ module Kernel
57
61
  end
58
62
  end
59
63
 
60
- # Defines an instance method within a class.
61
-
62
- def class_def name, &blk
63
- class_eval { define_method name, &blk }
64
- end
65
-
66
64
  # Easy access to an object's "special" class,
67
65
  # otherwise known as it's metaclass or singleton class.
68
66
 
@@ -85,6 +83,8 @@ module Kernel
85
83
  #
86
84
  # -- why the lucky stiff
87
85
  #
86
+ # CREDIT: WhyTheLuckyStiff
87
+
88
88
  def eigenclass
89
89
  (class << self; self; end)
90
90
  end
@@ -112,6 +112,8 @@ module Kernel
112
112
  # known as the object's metaclass or singleton class.
113
113
  #
114
114
  # Yes, another one.
115
+ #
116
+ # CREDIT: Trans
115
117
 
116
118
  def qua_class(&block)
117
119
  if block_given?
@@ -124,6 +126,8 @@ module Kernel
124
126
  # Universal assignment. This is a meta-programming
125
127
  # method, which allows you to assign any type of variable.
126
128
  #
129
+ # CREDIT: Trans
130
+
127
131
  def __assign__(name, value)
128
132
  k = name.to_s
129
133
  v = value
@@ -143,56 +147,14 @@ module Kernel
143
147
  end
144
148
 
145
149
 
146
- # _____ _
147
- # |_ _|__ ___| |_
148
- # | |/ _ \/ __| __|
149
- # | | __/\__ \ |_
150
- # |_|\___||___/\__|
151
- #
152
- =begin test
150
+ class Module
153
151
 
154
- require 'test/unit'
155
-
156
- class TCKernel < Test::Unit::TestCase
157
-
158
- def test_metaclass
159
- o = Object.new
160
- assert_equal( (class << o; self; end), o.metaclass )
161
- end
162
-
163
- def test_meta_class
164
- o = Object.new
165
- assert_equal( (class << o; self; end), o.meta_class )
166
- end
167
-
168
- def test_singleton
169
- o = Object.new
170
- assert_equal( (class << o; self; end), o.singleton )
171
- end
172
-
173
- #def test_singleton_eval
174
- # assert_nothing_raised do
175
- # o.singleton_class_eval{ @@a = "test" }
176
- # end
177
- #end
178
-
179
- #def test_singleton_method
180
- # assert_nothing_raised do
181
- # o.define_singleton_method(:testing){ |x| x + 1 }
182
- # end
183
- # assert_equal(2, o.testing(1) )
184
- #end
185
-
186
- def test_singleton_Class
187
- o = Object.new
188
- assert_equal( (class << o; self; end), o.singleton_class )
189
- end
190
-
191
- def test_qua_class
192
- o = Object.new
193
- assert_equal( (class << o; self; end), o.qua_class )
194
- end
152
+ # Defines an instance method within a class.
153
+ #
154
+ # CREDIT: WhyTheLuckyStiff
195
155
 
156
+ def class_def name, &blk
157
+ class_eval { define_method name, &blk }
196
158
  end
197
159
 
198
- =end
160
+ end