-- -*- M2-comint -*- hash: 14809820395204385641

i1 : Foo = new SelfInitializingType of MutableList;

i2 : net Foo := x -> net x#0;

i3 : Foo + Foo := (x, y) -> Foo {x#0 + y#0};

i4 : x = Foo {1}

o4 = 1

o4 : Foo

i5 : y = Foo {2}

o5 = 2

o5 : Foo

i6 : x += y

o6 = 3

o6 : Foo

i7 : installMethod(symbol +=, Foo, (x, y) -> (x#0 += y#0; x));

i8 : x += y

o8 = 5

o8 : Foo

i9 : Bar = new SelfInitializingType of List;

i10 : net Bar := x -> net x#0#0;

i11 : Bar * Bar := (x, y) -> Bar {{x#0#0 * y#0#0}};

i12 : installMethod(symbol *=, Bar, (x, y) -> if isMutable x#0 then (
              print "using custom method";
              x#0#0 *= y#0#0; x) else Default)

o12 = FunctionClosure[stdio:12:30-14:39]

o12 : FunctionClosure

i13 : x = Bar {new MutableList from {3}}

o13 = 3

o13 : Bar

i14 : y = Bar {{4}}

o14 = 4

o14 : Bar

i15 : x *= y
using custom method

o15 = 12

o15 : Bar

i16 : y *= x

o16 = 48

o16 : Bar

i17 : 
