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.


 
class A
{
  public Void doit (Int n)
  {
    echo ("known function called on $n")
  }
 
  // override the 'trap' method, which catches dynamic invocations of methods
  override Obj? trap(Str name, Obj?[]? args := null)
  {
    try 
    {
      return super.trap(name, args)
    } 
    catch (UnknownSlotErr err)
    {
      echo ("In trap, you called: " + name + " with args " + args.join(","))
      return null
    }
  }
}
 
class Main
{
  public static Void main ()
  {
    a := A()
    // note the dynamic dispatch
    a->doit (1)
    a->methodName (1, 2, 3)
  }
}
 