⌈StatefulObject⌋
BeginPackage["StatefulObjects`"];
StatefulObject::usage="ExpressionStore-backed object";StatefulObjects::usage="Lists the objects in the ExpressionStore";StatefulObjectNew::usage="Makes a new StatefulObject";
In[]:=
BeginPackage["`Package`"];
$Objects::usage="";
createObject::usage="";updateObjectField::usage="";updateObjectFieldKey::usage="";updateObjectFieldPart::usage="";removeObjectField::usage="";removeObject::usage="";
bind::usage="";
clearObjects::usage="";addObject::usage="";dropObject::usage="";
objectExists::usage="";objectSymbol::usage="";fromName::usage="";objectData::usage="";
prop::usage="";props::usage="";
In[]:=
EndPackage[];
In[]:=
Begin["`Private`"];
⌈Object cache⌋
In[]:=
⌈ Using a weak hash map so that we can store data but still have it nicely cleaned up⌋
IfHead@$Objects=!=Language`ExpressionStore, $Objects=Language`NewExpressionStore["Objects"]; clearObjects[];
⌈OOP⌋
objPat=_Symbol?objectSymbol|_StatefulObject;
⌈MutationHandler⌋
⌈ Handle object object mutation⌋
objectMutationHandler~SetAttributes~HoldAllComplete
bindMutation/:(bindMutation[pat_]:=op_):= With p= HoldPattern[objectMutationHandler[pat]]/. objobj:objPat , p:=Quiet@Check[op,Language`MutationFallthrough] ;
⌈l@field= ...l@field[...]= ...l@field[[...]]= ...⌋
⌈l =.⌋
⌈Fallback⌋
⌈Accessors⌋
⌈DeleteObject⌋
⌈Keys⌋
⌈l@fieldl[....]l[[...]]⌋
⌈l@field[...]⌋
⌈l@field[...]⌋
⌈Constructor⌋
⌈API⌋
⌈StatefulObjects⌋
⌈fromID⌋
⌈fromName⌋
⌈objectExists⌋
⌈bindMethod⌋
⌈prop⌋
⌈getProp⌋
⌈bind⌋
⌈props⌋
⌈addObject⌋
⌈dropObject⌋
⌈clearObjects⌋
⌈Create⌋
⌈Update⌋
⌈Template⌋
updateStatefulObjectTemplate[eo:objPat,field_,args___,fn_]:= With sym=getProp[eo,field] , Replacesym, Hold[var_]:> With{v=fn[var,args]}, v , m_Missing:> IfUnevaluated[fn]===Set, bind[eo,field,args]; args, bind[eo,field,Null]; updateStatefulObjectTemplate[eo,field,args,fn] ;updateStatefulObjectTemplate~SetAttributes~HoldAllComplete
⌈Field⌋
⌈Key⌋
⌈Part⌋
⌈Remove⌋
⌈Get⌋
getStatefulObjectField[eo_,field_]:= ReplacegetProp[eo,field], Hold[s_]s
getStatefulObjectFieldKey[eo_,field_,key__]:= ReplacegetProp[eo,field], Hold[s_]s[key]
getStatefulObjectFieldPart[eo_,field_,key__]:= ReplacegetProp[eo,field], Hold[s_]s[[key]]
⌈Formatting⌋
⌈Format⌋
⌈icon⌋
⌈Format⌋
MakeBoxes eo_StatefulObject?objectExists, fmt:StandardForm := BoxForm`ArrangeSummaryBox StatefulObject, StatefulObject, icon, BoxForm`MakeSummaryItem[{"Name: ",eo@"ObjectName"},fmt] , BoxForm`MakeSummaryItem[{"Fields: ",Keys@eo},fmt] , fmt