When compiling an object and a function call (not a call_other) is found that has not been defined in the object and is not an efun, then the driver will search for that function in the list of simulated efuns. If the function is found in that list, then the driver sets up a call_other to that function (as defined in the simulated efun file). Note, the result of the call_other does not have to be typecasted, since the type will be automatically set by the compiler.
Simulated efuns have many uses. One is that it is now possible to make major changes (and even removals) to the behavior of efuns without modifying the driver (by making a simul_efun having the same name as an efun). Suppose you wish to modify the behavior of the move_object() efun. You could do so by defining a simulated efun having the same name. The simulate efun could perform various restrictive checks and then call efun::move_object(). The efun:: prefix is necessary so that the driver will know you wish to call the move_object efun and not recursively call the simulate_efun within which the call to move_object is contained. [Note that valid_override() in master.c can be used to conrol which simul_efuns may be overridden via the efun:: prefix]. Simulated efuns are also useful for adding functions that many different objects may need to call but which aren't appropriate for inclusion in an inherited file.
Any function in the simulated efun file that is declared static, will not be callable by functions outside the simulated efun file.