The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use strict;
use warnings;
use JavaScript;

my $rt = JavaScript::Runtime->new;
my $cx = $rt->create_context;

$cx->bind_class(
 'package'   => 'Foo',
 'name'      => 'Foo',
 constructor => sub {
   return Foo->new;
 },
 properties        => {},
 static_methods    => {
   'list' => sub { my $self = shift; return $self->list; },
 }
);

{
 my $fn = $cx->eval("function t() { return Foo.list();  } t;" );
 my $v = $fn->();
 use Devel::Peek qw(Dump);

 Dump($v);
 
 my $v2 = Foo->list();
 Dump($v2);
 
}

print "destruction should be done\n";

sub END {
 print "should be really done now\n";
}

package Foo;

sub new {
 my $class = shift;
 my $self  = {};
 #$one ||=
 bless $self, $class;
}

sub list {
 my $class = shift;
 my @objs;
 for (1..2) {
   push @objs, $class->new;
 }
# return [{}];
 return \@objs;
}

sub DESTROY {
 print "object going boom!\n";
}

JavaScript::dump_sv_report_used();
1;