Task

Demonstrate how to make the object respond (sensibly/usefully) to an invocation of a method on it that it does not support through its class definitions.

Note that this is not the same as just invoking a defined method whose name is given dynamically; the method named at the point of invocation must not be defined.

This task is intended only for object systems that use a dynamic dispatch mechanism without static checking.



Related task

   Send an unknown method call.


import "io" for Stdin, Stdout
 
class Test {
    construct new() {}
 
    foo() { System.print("Foo called.") }
 
    bar() { System.print("Bar called.") }
 
    missingMethod(m) {
        System.print(m)
        System.write("Try and continue anyway y/n ? ")
        Stdout.flush()
        var reply = Stdin.readLine()
        if (reply != "y" && reply != "Y") {
            Fiber.abort("Decided to abort due to missing method.")
        }
    }
}
 
var test = Test.new()
var f = Fiber.new {
    test.foo()
    test.bar()
    test.baz()
}
f.try()
var err = f.error
if (err) {
    if (err.startsWith("Test does not implement")) {
        test.missingMethod(err)
    } else {
        Fiber.abort(err) // rethrow other errors
    }
}
System.print("OK, continuing.")