I have a simple object orientation example using this solution:

MyObject[assn_Association][args__String] := assn[args]
initMyObject[assn_Association] := With[{a = Merge[{assn, <|"SomeProperty"->2|>}, First]}, MyObject[assn]]

You can create the object:

In[1]:= o = initMyObject[<|"a" -> 1|>]
Out[1]= MyObject[<|"a" -> 1|>]

You can access the object:

In[2]:= o["a"]
Out[2]= 1

And it looks like you can assign:

In[3]:= o["SomeProperty"] = 22
Out[3]= 22

But it doesn't work:

In[4]:= FullForm @ o
Out[4]= MyObject[Association[Rule["a",1]]]

Is there a way to make this syntax (obj["property"] = value) work here?


I thought I could so something like this:

MyObject /: Set[m_MyObject[arg_String], val_] := Set[m, alteredCopy[m,<|arg->val|>]]

but this an other variants doesn't work...