##
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