The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Set::Scalar;

print "1..6\n";

my $a = Set::Scalar->new(1..3);
my $b = Set::Scalar->new();

my $c = $a->power_set;
my $d = Set::Scalar->power_set($a);
my $e = $b->power_set;

print "not " unless $c->members == 8;
print "ok 1\n";

print "not " unless $d->members == 8;
print "ok 2\n";

print "not " unless $e->members == 1;
print "ok 3\n";

sub verify {
    my ($p, @q) = @_;
    my @p = $p->members;
    return unless @p == @q;
    @q = map { Set::Scalar->new(@$_) } @q;
    my %p; @p{ map { "$_" } @p } = @p;
    my %q; @q{ map { "$_" } @q } = @q;
    my %P = %p; delete @P{ keys %q };
    my %Q = %q; delete @Q{ keys %p };
    return keys %P == 0 && keys %Q == 0;
}

print "not " unless verify($c,
			   [],
			   [1], [2], [3],
			   [1, 2], [1, 3], [2, 3],
			   [1, 2, 3]);
print "ok 4\n";

print "not " unless verify($d,
			   [],
			   [1], [2], [3],
			   [1, 2], [1, 3], [2, 3],
			   [1, 2, 3]);
print "ok 5\n";

print "not " unless verify($e,
			   []);
print "ok 6\n";