visitable |
A real world example, taken from the gtk module: a Visitable
class, providing a framework for a generalized version of the
visitor pattern. For information on the visitor pattern, please
refer to:
Design Patterns - Elements of Reusable Object-Oriented Software
E.Gamma, R.Helm, R. Johnson, J. Vlissides
Addison Wesley
This example shows how to programmatically call a method given
its name: we convert the name to a symbol, then issue the
message call with basic.sendwith(), where we pass the
arguments as an array.
package Visitable; import basic; import string; /* * Visitable class */ public class Visitable extends basic.Object { method visit: visitor with: args ... { local methodsym; local newargs; local arg; methodsym = string.makesymbol( "visit" + [[self isA] name] ); if ([visitor doesUnderstand: methodsym]) { newargs = #[ self ]; for (arg in args) newargs[basic.length(newargs)] = arg; return basic.sendwith( visitor, methodsym, newargs ); } return @nil; } method visit: visitor { return [self visit: visitor with: @nil]; } }