(1) Does ModuleCopy, when automatically called from Object, really get the a shallow copy of the object
as the first parameter in its parameter list? See below, which is copied directly from ?object,create. The
ModuleCopy has first argument new::Dollar but ModuleApply only passes its two arguments not three. I
couldn't find a reference to this feature in the docs.
(2) See below. Notice that the method in_circulation can be referred to via an unqualified name and that a global
in_circulation can be defined, and that can live independently of the Dollar:-in_circulation. Is it really
supposed to work that way? Surely the exports like foo from Dollar ought only be avalaiable
by using qualified names like Dollar:-foo.
module Dollar() option object;
local value := 0;
local total::static := 0;
export ModuleApply::static := proc( )
global Dollar; Object(Dollar, _passed)
end proc;
export ModuleCopy::static := proc(new::Dollar, proto::Dollar, v::numeric, $)
new:-value := v; total := total + new:-value; print("ModuleApply")
end proc;
export amount::static := proc( self::Dollar, $) return self:-value; end;
export in_circulation::static := proc(self::Dollar, $) total; end;
end module;
# When invoking ModuleCopy, Object must inserts as the firt argument the
# Object it is creating, presumably obtained from the shallow copy.
# in_circulation can be redefined globally but the module one still
# gets called. Strange.
in_circulation:=proc() print("BLECH") end;
in_circulation(); #gets the one just above
in_circulation(Dollar); #gets the Dollar version (!!)
Dollar:-in_circulation( Dollar ); #yeah, expected this