sub PIL2JS::Internals::generic_deref($thing) is primitive is rw { JS::inline('new PIL2JS.Box.Constant(function (args) { var thing = args[1].FETCH(), cc = args.pop(); if(!(thing instanceof PIL2JS.Ref)) { PIL2JS.die("Can\'t use \"" + thing + "\" as a generic reference!"); } // Relay .FETCH and .STORE to the referencee. var ret = new PIL2JS.Box.Proxy( function () { return thing.referencee.FETCH() }, function (n) { thing.referencee.STORE(n); return thing.referencee; } ); ret.uid = thing.referencee.uid; cc(ret); })')($thing); } sub PIL2JS::Internals::autoderef(Ref $ref) returns Bool is primitive { JS::inline('new PIL2JS.Box.Constant(function (args) { var thing = args[1].FETCH(), cc = args.pop(); if(!(thing instanceof PIL2JS.Ref)) { PIL2JS.die("\"" + thing + "\" is not a reference!"); } cc(new PIL2JS.Box.Constant(thing.autoderef)); })')($ref); } method tied(Ref $self:) returns Ref { JS::inline('new PIL2JS.Box.Constant(function (args) { var ref = args[1].FETCH(), cc = args.pop(); if(!(ref instanceof PIL2JS.Ref)) { PIL2JS.die("\"" + ref + "\" is not a reference!"); } var new_ref = new PIL2JS.Ref(ref.referencee); new_ref.autoderef = false; cc(new PIL2JS.Box.Constant(new_ref)); })')($self); } sub circumfix:<$( )>($thing) is primitive is rw { PIL2JS::Internals::generic_deref($thing) } sub circumfix:<@( )>($thing) is primitive is rw { PIL2JS::Internals::generic_deref($thing) } sub circumfix:<%( )>($thing) is primitive is rw { PIL2JS::Internals::generic_deref($thing) } sub circumfix:<&( )>($thing) is primitive is rw { PIL2JS::Internals::generic_deref($thing) }