diff 2-Io/day3-method_missing.io @ 48:46a807289724

Add a noddy "builder" to show overriding "forward" for missing methods
author IBBoard <dev@ibboard.co.uk>
date Fri, 22 Sep 2017 20:00:39 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/2-Io/day3-method_missing.io	Fri Sep 22 20:00:39 2017 +0100
@@ -0,0 +1,29 @@
+# Altering "forward" in Io is apparently similar to overriding
+# method_missing in Ruby. Except with more to go wrong because
+# we have prototypes and not classes.
+
+# Building arbitrary (basic) XML using a Builder prototype that
+# assumes all missing methods are XML tags
+
+Builder := Object clone
+
+# This is the dangerous method
+Builder forward := method(
+    writeln("<", call message name, ">")
+    call message arguments foreach(
+        arg,
+        # This will trigger another call to forward
+        # It's not clear why "writeln" would return a string rather than write to the console
+        # But apparently it does. Because poorly documented Io.
+        content := self doMessage(arg)
+        # No strong type checking here - it's all based on string names
+        if (content type == "Sequence", writeln(content))
+    )
+    writeln("</", call message name, ">")
+)
+
+Builder ul(
+    li("Obscure"),
+    li("Undocumented"),
+    li("Unclear")
+)
\ No newline at end of file