repl.link = function(obj) { if (! repl.linkedVars) { repl.linkedVars = {}; repl.linkedIdNext = 1; }; if (obj) { repl.linkedVars[ repl.linkedIdNext ] = obj; return repl.linkedIdNext++; } else { return undefined } #### sub link { my ($repl,$obj) = @_; if (! $repl->{linkedVars}) { $repl->{linkedVars} = {}; $repl->{linkedIdNext} = 1; }; if (defined $obj) { $repl->{linkedVars}->{ $repl->{linkedIdNext} } = obj; return $repl->{linkedIdNext}++; } else { return undef }; }; #### package MozRepl::RemoteObject; sub new { my ($class, $id) = @_; my $self = { id => $id, }; bless $self, $class; }; sub expr { my ($class, $js) = @_; return $class->new( javascript_eval($js)); # assuming that it returns an object }; #### sub DESTROY { my ($self) = @_; if ($self->{id}) { $self->expr("repl.breakLink($self->{id})"); }; }; #### repl.breakLink = function(id) { delete repl.linkedVars[ id ]; } #### sub breakLink { my ($repl,$id) = @_; delete $repl->{linkedVars}->{id}; }; #### my $doc_a = MozRepl::RemoteObject->expr('window.document'); # id 42 my $doc_b = MozRepl::RemoteObject->expr('window.document'); # id 43