fancy 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (182) hide show
  1. data/README.md +14 -14
  2. data/Rakefile +16 -4
  3. data/bin/fancy +3 -0
  4. data/bin/fspec +20 -0
  5. data/bin/fyi +27 -11
  6. data/bin/ifancy +1 -1
  7. data/boot/fancy_ext.rb +1 -0
  8. data/boot/fancy_ext/block_env.rb +1 -9
  9. data/boot/fancy_ext/delegator.rb +64 -0
  10. data/boot/fancy_ext/object.rb +4 -0
  11. data/boot/fancy_ext/thread.rb +4 -0
  12. data/boot/load.rb +5 -1
  13. data/boot/rbx-compiler/compiler/ast.rb +0 -1
  14. data/boot/rbx-compiler/compiler/ast/class_def.rb +2 -0
  15. data/boot/rbx-compiler/compiler/ast/method_def.rb +2 -0
  16. data/boot/rbx-compiler/compiler/ast/node.rb +10 -0
  17. data/boot/rbx-compiler/compiler/ast/ruby_args.rb +12 -0
  18. data/boot/rbx-compiler/compiler/ast/singleton_method_def.rb +2 -0
  19. data/boot/rbx-compiler/parser/fancy_parser.bundle +0 -0
  20. data/boot/rbx-compiler/parser/lexer.lex +5 -11
  21. data/boot/rbx-compiler/parser/parser.rb +16 -5
  22. data/boot/rbx-compiler/parser/parser.y +39 -24
  23. data/doc/api/fancy.css +1 -1
  24. data/doc/api/fancy.jsonp +1 -1
  25. data/doc/api/fdoc.js +22 -4
  26. data/doc/api/index.html +5 -6
  27. data/doc/api/jquery-ui.min.js +401 -0
  28. data/doc/api/jquery.tools.min.js +192 -0
  29. data/doc/api/themeswitchertool.js +250 -0
  30. data/doc/features.md +17 -0
  31. data/examples/actor_bunnies.fy +32 -0
  32. data/examples/actors.fy +26 -0
  33. data/examples/actors_primitive.fy +27 -0
  34. data/examples/actors_ring.fy +37 -0
  35. data/examples/armstrong_numbers.fy +1 -1
  36. data/examples/array.fy +7 -9
  37. data/examples/async_send.fy +1 -2
  38. data/examples/blocks.fy +4 -4
  39. data/examples/call_with_receiver.fy +1 -1
  40. data/examples/class.fy +1 -1
  41. data/examples/default_args.fy +4 -1
  42. data/examples/define_methods.fy +2 -2
  43. data/examples/echo.fy +1 -1
  44. data/examples/factorial.fy +1 -1
  45. data/examples/future_composition.fy +2 -2
  46. data/examples/futures.fy +0 -5
  47. data/examples/game_of_life.fy +1 -1
  48. data/examples/person.fy +1 -1
  49. data/lib/argv.fy +7 -2
  50. data/lib/array.fy +109 -42
  51. data/lib/block.fy +39 -14
  52. data/lib/boot.fy +2 -0
  53. data/lib/class.fy +2 -0
  54. data/lib/compiler/ast.fy +2 -1
  55. data/lib/compiler/ast/assign.fy +2 -3
  56. data/lib/compiler/ast/async_send.fy +1 -15
  57. data/lib/compiler/ast/class_def.fy +2 -1
  58. data/lib/compiler/ast/expression_list.fy +4 -5
  59. data/lib/compiler/ast/future_send.fy +1 -10
  60. data/lib/compiler/ast/goto.fy +46 -0
  61. data/lib/compiler/ast/identifier.fy +9 -7
  62. data/lib/compiler/ast/literals.fy +8 -1
  63. data/lib/compiler/ast/match.fy +14 -4
  64. data/lib/compiler/ast/message_send.fy +34 -6
  65. data/lib/compiler/ast/method_def.fy +6 -6
  66. data/lib/compiler/ast/node.fy +3 -3
  67. data/lib/compiler/ast/range.fy +1 -0
  68. data/lib/compiler/ast/script.fy +0 -2
  69. data/lib/compiler/ast/singleton_method_def.fy +2 -4
  70. data/lib/compiler/ast/string_interpolation.fy +17 -0
  71. data/lib/compiler/ast/super.fy +5 -4
  72. data/lib/compiler/ast/try_catch.fy +8 -6
  73. data/lib/compiler/ast/tuple_literal.fy +3 -2
  74. data/lib/compiler/command.fy +0 -1
  75. data/lib/compiler/compiler.fy +1 -5
  76. data/lib/compiler/stages.fy +6 -14
  77. data/lib/documentation.fy +57 -46
  78. data/lib/enumerable.fy +257 -23
  79. data/lib/enumerator.fy +122 -15
  80. data/lib/false_class.fy +10 -1
  81. data/lib/fancy_spec.fy +263 -61
  82. data/lib/fdoc.fy +11 -25
  83. data/lib/fiber.fy +11 -0
  84. data/lib/file.fy +8 -11
  85. data/lib/future.fy +84 -5
  86. data/lib/hash.fy +65 -14
  87. data/lib/integer.fy +35 -0
  88. data/lib/iteration.fy +54 -29
  89. data/lib/message.fy +6 -0
  90. data/lib/method.fy +0 -16
  91. data/lib/nil_class.fy +58 -8
  92. data/lib/number.fy +49 -22
  93. data/lib/object.fy +371 -65
  94. data/lib/package.fy +24 -1
  95. data/lib/package/installer.fy +5 -9
  96. data/lib/package/specification.fy +2 -2
  97. data/lib/parser/ext/lexer.lex +15 -11
  98. data/lib/parser/ext/parser.y +70 -23
  99. data/lib/parser/methods.fy +33 -14
  100. data/lib/proxy.fy +33 -3
  101. data/lib/range.fy +28 -0
  102. data/lib/rbx.fy +3 -1
  103. data/lib/rbx/actor.fy +53 -0
  104. data/lib/rbx/alpha.fy +31 -0
  105. data/lib/rbx/array.fy +21 -12
  106. data/lib/rbx/bignum.fy +6 -2
  107. data/lib/rbx/block.fy +23 -26
  108. data/lib/rbx/class.fy +54 -2
  109. data/lib/rbx/code_loader.fy +8 -4
  110. data/lib/rbx/date.fy +9 -0
  111. data/lib/rbx/directory.fy +18 -0
  112. data/lib/rbx/environment_variables.fy +1 -0
  113. data/lib/rbx/exception.fy +9 -2
  114. data/lib/rbx/fiber.fy +22 -4
  115. data/lib/rbx/file.fy +5 -5
  116. data/lib/rbx/fixnum.fy +5 -0
  117. data/lib/rbx/float.fy +11 -3
  118. data/lib/rbx/hash.fy +31 -16
  119. data/lib/rbx/integer.fy +1 -0
  120. data/lib/rbx/io.fy +17 -7
  121. data/lib/rbx/match_data.fy +15 -4
  122. data/lib/rbx/method.fy +40 -7
  123. data/lib/rbx/name_error.fy +4 -0
  124. data/lib/rbx/object.fy +92 -24
  125. data/lib/rbx/range.fy +20 -6
  126. data/lib/rbx/regexp.fy +11 -3
  127. data/lib/rbx/string.fy +51 -1
  128. data/lib/rbx/stringio.fy +17 -0
  129. data/lib/rbx/symbol.fy +15 -1
  130. data/lib/rbx/system.fy +20 -2
  131. data/lib/rbx/tcp_server.fy +4 -1
  132. data/lib/rbx/tcp_socket.fy +11 -0
  133. data/lib/rbx/time.fy +6 -0
  134. data/lib/rbx/tuple.fy +14 -5
  135. data/lib/set.fy +144 -29
  136. data/lib/stack.fy +42 -11
  137. data/lib/string.fy +118 -8
  138. data/lib/struct.fy +13 -3
  139. data/lib/symbol.fy +21 -2
  140. data/lib/thread_pool.fy +2 -1
  141. data/lib/true_class.fy +45 -7
  142. data/lib/tuple.fy +27 -9
  143. data/lib/version.fy +2 -2
  144. data/ruby_lib/fancy +43 -0
  145. data/ruby_lib/fdoc +23 -0
  146. data/ruby_lib/fspec +3 -0
  147. data/ruby_lib/fyi +3 -0
  148. data/ruby_lib/ifancy +3 -0
  149. data/tests/argv.fy +5 -9
  150. data/tests/array.fy +323 -196
  151. data/tests/assignment.fy +29 -29
  152. data/tests/block.fy +72 -59
  153. data/tests/class.fy +227 -138
  154. data/tests/control_flow.fy +83 -51
  155. data/tests/documentation.fy +8 -8
  156. data/tests/enumerable.fy +8 -0
  157. data/tests/enumerator.fy +47 -29
  158. data/tests/exception.fy +49 -32
  159. data/tests/file.fy +28 -28
  160. data/tests/fixnum.fy +170 -0
  161. data/tests/future.fy +24 -7
  162. data/tests/hash.fy +55 -38
  163. data/tests/method.fy +50 -43
  164. data/tests/nil_class.fy +37 -37
  165. data/tests/object.fy +152 -70
  166. data/tests/pattern_matching.fy +67 -31
  167. data/tests/range.fy +6 -6
  168. data/tests/set.fy +101 -4
  169. data/tests/stack.fy +14 -5
  170. data/tests/string.fy +115 -61
  171. data/tests/stringio.fy +18 -0
  172. data/tests/struct.fy +27 -0
  173. data/tests/symbol.fy +19 -6
  174. data/tests/true_class.fy +34 -34
  175. data/tests/tuple.fy +30 -12
  176. metadata +103 -81
  177. data/boot/rbx-compiler/compiler/ast/require.rb +0 -20
  178. data/examples/actor.fy +0 -37
  179. data/examples/curl_async.fy +0 -37
  180. data/lib/compiler/ast/require.fy +0 -15
  181. data/tests/number.fy +0 -135
  182. data/tests/parsing/sexp.fy +0 -50
@@ -1,10 +1,19 @@
1
1
  require("date")
2
2
 
3
3
  class Date {
4
+ """
5
+ Date class. Used for timely stuff.
6
+ """
7
+
8
+ forwards_unary_ruby_methods
9
+ metaclass forwards_unary_ruby_methods
10
+
4
11
  metaclass ruby_alias: 'today
5
12
  ruby_alias: '==
6
13
  ruby_alias: '-
7
14
  ruby_alias: '+
15
+ ruby_alias: '<
16
+ ruby_alias: '>
8
17
 
9
18
  def != other {
10
19
  self == other not
@@ -43,4 +43,22 @@ class Directory {
43
43
  IOError new: (e message) . raise!
44
44
  }
45
45
  }
46
+
47
+ def self list: pattern {
48
+ """
49
+ @pattern Directory pattern or name containing files to be returned as an @Array@.
50
+ @return @Array@ of files matching directory @pattern.
51
+
52
+ Example usage:
53
+ Directory list: \"tests/**/*.fy\" # => [\"tests/file1.fy\", \"tests/more/file2.fy\"]
54
+ """
55
+
56
+ match pattern {
57
+ case /\/$/ -> pattern = pattern + "*"
58
+ case "." -> pattern = pattern + "/*"
59
+ case ".." -> pattern = pattern + "/*"
60
+ }
61
+
62
+ Dir glob(pattern)
63
+ }
46
64
  }
@@ -1,3 +1,4 @@
1
1
  class Rubinius EnvironmentVariables {
2
+ forwards_unary_ruby_methods
2
3
  ruby_alias: '[]
3
4
  }
@@ -1,6 +1,13 @@
1
+ class Exception {
2
+ forwards_unary_ruby_methods
3
+ }
4
+
1
5
  class StandardError {
2
- ruby_alias: 'message
3
- ruby_alias: 'backtrace
6
+ """
7
+ StandardError. Base class of most Exception classes.
8
+ """
9
+
10
+ forwards_unary_ruby_methods
4
11
 
5
12
  def initialize {
6
13
  "Creates a new Exception with an empty message."
@@ -1,22 +1,40 @@
1
- require("fiber")
2
-
3
1
  Fiber = Rubinius Fiber
4
2
 
5
3
  class Fiber {
4
+ forwards_unary_ruby_methods
5
+ metaclass forwards_unary_ruby_methods
6
+
6
7
  metaclass ruby_alias: 'yield
7
- metaclass ruby_alias: 'current
8
8
  ruby_alias: 'resume
9
- ruby_alias: 'alive?
10
9
 
11
10
  def self new: block {
11
+ """
12
+ @block @Block@ to be run in a new Fiber.
13
+
14
+ Creates a new Fiber running @block.
15
+ """
16
+
12
17
  new(&block)
13
18
  }
14
19
 
15
20
  def Fiber yield: vals {
21
+ """
22
+ @vals @Array@ of values to pass along to parent @Fiber@.
23
+
24
+ Returns execution control to the parent @Fiber@ and passes along @vals.
25
+ """
26
+
16
27
  yield(*vals)
17
28
  }
18
29
 
19
30
  def resume: vals {
31
+ """
32
+ @vals @Array@ of values to pass along to @self for resuming.
33
+
34
+ Resumes @self (if paused) or raises an exception, if @Fiber@ is dead.
35
+ Passes along @vals as the return value of the last call to @yield in @self.
36
+ """
37
+
20
38
  resume(*vals)
21
39
  }
22
40
  }
@@ -22,11 +22,11 @@ class File {
22
22
 
23
23
  E.g. to open a File with read access and read all lines and print them to STDOUT:
24
24
 
25
- File open: \"foo.txt\" modes: [:read] with: |f| {
26
- { f eof? } while_false: {
27
- f readln println
25
+ File open: \"foo.txt\" modes: ['read] with: |f| {
26
+ { f eof? } while_false: {
27
+ f readln println
28
+ }
28
29
  }
29
- }
30
30
  """
31
31
 
32
32
  modes_str = modes_str: modes_arr
@@ -93,7 +93,7 @@ class File {
93
93
 
94
94
  str = ""
95
95
  modes_arr each: |m| {
96
- str = str ++ (@@open_mode_conversions[m])
96
+ str << (@@open_mode_conversions[m])
97
97
  }
98
98
  str uniq join: ""
99
99
  }
@@ -1,6 +1,10 @@
1
1
  require: "../number"
2
2
 
3
3
  class Fixnum {
4
+ """
5
+ Standard class for integer values in Fancy.
6
+ """
7
+
4
8
  include: Number
5
9
 
6
10
  ruby_alias: '==
@@ -18,6 +22,7 @@ class Fixnum {
18
22
  ruby_alias: 'to_f
19
23
  ruby_alias: '**
20
24
  ruby_alias: '&
25
+ ruby_alias: '|
21
26
 
22
27
  alias_method: 'to_s: for: 'to_s
23
28
  alias_method: 'modulo: for: 'modulo
@@ -1,6 +1,12 @@
1
1
  class Float {
2
+ """
3
+ Standard class for floating point number values in Fancy.
4
+ """
5
+
2
6
  include: Number
3
7
 
8
+ forwards_unary_ruby_methods
9
+
4
10
  ruby_alias: '+
5
11
  ruby_alias: '-
6
12
  ruby_alias: '*
@@ -8,8 +14,10 @@ class Float {
8
14
  ruby_alias: '==
9
15
  ruby_alias: '>=
10
16
  ruby_alias: '<=
11
- ruby_alias: '<=>
12
- ruby_alias: 'to_i
13
- ruby_alias: 'to_f
14
17
  ruby_alias: '**
18
+ ruby_alias: '<
19
+ ruby_alias: '>
20
+
21
+ alias_method: 'modulo: for: 'modulo
22
+ alias_method: ":%" for: "modulo:" # use a : so we dont overwrite ruby's % operator
15
23
  }
@@ -1,26 +1,12 @@
1
1
  class Hash {
2
+ forwards_unary_ruby_methods
2
3
 
3
- alias_method: ":size" for: 'size
4
4
  alias_method: ":[]" for: '[]
5
5
  alias_method: 'at:put: for: "[]="
6
+ alias_method: '[]: for: "[]="
6
7
  alias_method: 'at: for: '[]
7
- ruby_alias: 'keys
8
- ruby_alias: 'values
9
8
  ruby_alias: '==
10
9
 
11
- def inspect {
12
- str = "<["
13
- max = size - 1
14
- i = 0
15
- each: |key,val| {
16
- str = str ++ (key inspect) ++ " => " ++ (val inspect)
17
- { str = str + ", " } if: (i < max)
18
- i = i + 1
19
- }
20
- str = str + "]>"
21
- str
22
- }
23
-
24
10
  def each: block {
25
11
  each(&block)
26
12
  }
@@ -36,4 +22,33 @@ class Hash {
36
22
  def map: block {
37
23
  map(&block)
38
24
  }
25
+
26
+ def delete: key {
27
+ """
28
+ @key Key of key-value pair to be deleted in @self.
29
+
30
+ Deletes a key-value pair from @self.
31
+ """
32
+
33
+ delete(key)
34
+ }
35
+
36
+ def merge: other_hash {
37
+ merge(other_hash)
38
+ }
39
+
40
+ def merge!: other_hash {
41
+ merge!(other_hash)
42
+ }
43
+
44
+ def includes?: key {
45
+ """
46
+ @key Key to search for.
47
+ @return @true, if Hash includes @key, @false otherwise.
48
+
49
+ Indicates if a given key is in @self.
50
+ """
51
+
52
+ include?(key)
53
+ }
39
54
  }
@@ -2,6 +2,7 @@ class Integer {
2
2
  # common ruby-forwarding methods used by Fixnum & Bignum classes
3
3
 
4
4
  def times: block {
5
+ # this version gets replaced in lib/integer.fy with a native one
5
6
  times(&block)
6
7
  }
7
8
  }
@@ -1,10 +1,4 @@
1
- class IO {
2
- ruby_alias: 'readlines
3
- ruby_alias: 'readline
4
- ruby_alias: 'read
5
- ruby_alias: 'close
6
- ruby_alias: 'eof?
7
-
1
+ class IOMixin {
8
2
  def readln {
9
3
  readline
10
4
  }
@@ -28,3 +22,19 @@ class IO {
28
22
  alias_method: 'write: for: 'print:
29
23
  alias_method: 'writeln: for: 'println:
30
24
  }
25
+
26
+ class IO {
27
+ """
28
+ Base class for IO related classes (like @File@, @Socket@, @Console@ etc.).
29
+ """
30
+
31
+ include: IOMixin
32
+
33
+ ruby_alias: 'readlines
34
+ ruby_alias: 'readline
35
+ ruby_alias: 'read
36
+ ruby_alias: 'close
37
+ ruby_alias: 'eof?
38
+
39
+ forwards_unary_ruby_methods
40
+ }
@@ -1,15 +1,26 @@
1
1
  class MatchData {
2
+ """
3
+ MatchData instances are created when using the #=== match operator
4
+ (e.g. by using match/case expressions).
5
+ """
6
+
2
7
  ruby_alias: 'size
8
+ ruby_alias: '[]
3
9
 
4
10
  def at: idx {
5
- ruby: '[] args: [idx]
6
- }
11
+ """
12
+ @idx Index of value to get.
13
+ @return Value at index @idx.
14
+ """
7
15
 
8
- def [] idx {
9
- at: idx
16
+ self[idx]
10
17
  }
11
18
 
12
19
  def to_a {
20
+ """
21
+ @return @Array@ representation of @self containing matched values of @self.
22
+ """
23
+
13
24
  arr = []
14
25
  self size times: |i| {
15
26
  arr << (at: i)
@@ -1,15 +1,27 @@
1
1
  class MethodMixin {
2
+ """
3
+ Mixin class with common methods included by @Method@ and @UnboundMethod@.
4
+ """
5
+
2
6
  def documentation {
7
+ """
8
+ @return Docstring for @self.
9
+ """
10
+
3
11
  Fancy Documentation for: (executable())
4
12
  }
5
13
 
6
- def documentation: str {
7
- Fancy Documentation for: (executable()) is: str
14
+ def documentation: docstring {
15
+ """
16
+ @docstring New docstring for @self.
17
+ """
18
+
19
+ Fancy Documentation for: (executable()) is: docstring
8
20
  }
9
21
 
10
22
  def visibility {
11
23
  """
12
- Returns the visibility ('private, 'protected, 'public) of a @Method@ in its defined context, if any.
24
+ @return The visibility (@'private, @'protected, @'public) of a @Method@ in its defined context, if any.
13
25
  """
14
26
  entry = @defined_in method_table() lookup(@name)
15
27
  { entry visibility() } if: entry
@@ -17,33 +29,54 @@ class MethodMixin {
17
29
 
18
30
  def public? {
19
31
  """
20
- Returns true, if the @Method@ is public in its defined context.
32
+ @return @true, if the @Method@ is public in its defined context.
21
33
  """
22
34
  visibility == 'public
23
35
  }
24
36
 
25
37
  def protected? {
26
38
  """
27
- Returns true, if the @Method@ is protected in its defined context.
39
+ @return @true, if the @Method@ is protected in its defined context.
28
40
  """
29
41
  visibility == 'protected
30
42
  }
31
43
 
32
44
  def private? {
33
45
  """
34
- Returns true, if the @Method@ is private in its defined context.
46
+ @return @true, if the @Method@ is private in its defined context.
35
47
  """
36
48
  visibility == 'private
37
49
  }
50
+
51
+ def tests {
52
+ """
53
+ Returns an Array of all the FancySpec SpecTests defined for a
54
+ Method.
55
+ """
56
+
57
+ @__method_tests__ = @__method_tests__ || []
58
+ @__method_tests__
59
+ }
60
+
61
+ def test: test_block {
62
+ it = FancySpec new: self
63
+ test_block call: [it]
64
+ tests << it
65
+ }
38
66
  }
39
67
 
40
68
  class Method {
41
69
  ruby_alias: 'arity
42
70
  include: MethodMixin
71
+ forwards_unary_ruby_methods
43
72
  }
44
73
 
45
74
  class UnboundMethod {
75
+ """
76
+ An instance UnboundMethod represents a Method object not bound to a specific @Class@ or @Object@.
77
+ """
78
+
46
79
  ruby_alias: 'arity
47
80
  include: MethodMixin
81
+ forwards_unary_ruby_methods
48
82
  }
49
-
@@ -1,3 +1,7 @@
1
1
  class NameError {
2
+ """
3
+ NameError exception class. Used within Rubinius.
4
+ """
5
+
2
6
  ruby_alias: 'name
3
7
  }
@@ -1,81 +1,149 @@
1
- class Class {
2
- def alias_method: new for: old {
3
- alias_method(new, old)
4
- }
5
-
6
- def ruby_alias: method_name {
7
- alias_method(":" + (method_name to_s), method_name)
8
- }
9
- }
10
-
11
- class String {
12
- alias_method: ":+" for: "+"
13
- }
14
-
15
1
  class Object {
16
-
17
2
  ruby_alias: '==
18
3
  ruby_alias: '===
19
4
  ruby_alias: 'class
20
5
  ruby_alias: 'inspect
6
+ ruby_alias: 'object_id
7
+ ruby_alias: 'instance_variables
21
8
 
22
9
  def initialize {
23
10
  initialize()
24
11
  }
25
12
 
13
+ def require: file_path {
14
+ """
15
+ Loads and evaluates a given Fancy source file by trying to find the specified
16
+ @file_path in Fancy's loadpath (see @Fancy::CodeLoader@).
17
+ Relative paths are allowed (and by default expected).
18
+ """
19
+ Fancy CodeLoader require: file_path
20
+ }
21
+
26
22
  def dclone {
27
23
  "Returns a deep clone of self using Ruby's Marshal class."
28
24
  Marshal load(Marshal dump(self))
29
25
  }
30
26
 
31
27
  def to_s {
28
+ """
29
+ @return @String@ represenation of @self.
30
+ """
31
+
32
32
  to_s()
33
33
  }
34
34
 
35
35
  def set_slot: slotname value: val {
36
+ """
37
+ @slotname Name of slot to be set.
38
+ @val Value for slot to be set.
39
+
40
+ Sets an object's slot with a given value.
41
+ """
42
+
36
43
  instance_variable_set("@" ++ slotname, val)
37
44
  }
38
45
 
39
46
  def get_slot: slotname {
47
+ """
48
+ @slotname Name of slot to get the value of.
49
+ @return Value of slot with name @slotname.
50
+
51
+ Returns the value of a slot of @self.
52
+ """
53
+
40
54
  instance_variable_get("@" ++ slotname)
41
55
  }
42
56
 
43
57
  def define_singleton_method: name with: block {
58
+ """
59
+ @name Name of the method to be defined on @self.
60
+ @block @Block@ to be used as the method's body.
61
+
62
+ Dynamically defines a method on @self's metaclass (a singleton method) using a given @Block@.
63
+ """
64
+
44
65
  metaclass define_method: name with: block
45
66
  }
46
67
 
47
68
  def undefine_singleton_method: name {
69
+ """
70
+ @name Name of the method to be undefined no @self's metaclass.
71
+
72
+ Undefines a singleton method of @self.
73
+ """
74
+
48
75
  metaclass undefine_method: name
49
76
  }
50
77
 
51
78
  def is_a?: class {
52
- "Indicates, if an object is an instance of a given Class."
79
+ """
80
+ @class @Class@ to check for if @self is an instance of.
81
+ @return @true if @self is an instance of @class, @false otherwise.
82
+
83
+ Indicates, if an object is an instance of a given Class.
84
+ """
85
+
53
86
  is_a?(class)
54
87
  }
55
88
 
56
89
  def kind_of?: class {
57
- "Indicates, if an object is an instance of a given Class."
90
+ """
91
+ Same as Object#is_a?:
92
+ Indicates, if an object is an instance of a given Class.
93
+ """
94
+
58
95
  kind_of?(class)
59
96
  }
60
97
 
61
- def send_message: message {
98
+ def receive_message: message {
99
+ """
100
+ @message Name of message to be sent to @self dynamically.
101
+
102
+ Dynamically sends a given message (without parameters) to @self.
103
+ """
104
+
62
105
  send(message_name: message)
63
106
  }
64
107
 
65
- def send_message: message with_params: params {
66
- ruby: (message_name: message) args: params
108
+ def receive_message: message with_params: params {
109
+ """
110
+ @message Name of message to be sent to @self dynamically.
111
+ @params @Array@ of parameters used with @message.
112
+
113
+ Dynamically sends a given message with parameters to @self.
114
+ """
115
+
116
+ ruby: (message_name: message) args: params
67
117
  }
68
118
 
69
119
  def message_name: symbol {
70
120
  symbol = symbol to_s
71
- if: (symbol =~ /:/) then: {
72
- symbol
73
- } else: {
74
- ":" ++ symbol
121
+ match symbol =~ /:/ {
122
+ case nil ->
123
+ ":" ++ symbol
124
+ case _ ->
125
+ symbol
75
126
  }
76
127
  }
77
128
 
78
129
  def responds_to?: message {
130
+ """
131
+ @message The message to check for (preferably a Symbol).
132
+ @return @true if @self responds to @message, @false otherwise.
133
+
134
+ Indicates if an object responds to a given message.
135
+ """
136
+
79
137
  respond_to?(message_name: message)
80
138
  }
139
+
140
+ def extend: class {
141
+ """
142
+ @class @Class@ to extend @self with.
143
+
144
+ Extends @self with the methods in @class (by including its methods in @self's metaclass).
145
+ """
146
+
147
+ metaclass include: class
148
+ }
81
149
  }