The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# Do not edit this file - Generated by Perlito6 9.0
use v5;
use utf8;
use strict;
use warnings;
no warnings ('redefine', 'once', 'void', 'uninitialized', 'misc', 'recursion');
use Perlito6::Perl5::Runtime;
use Perlito6::Perl5::Prelude;
our $MATCH = Perlito6::Match->new();
{
package GLOBAL;
    sub new { shift; bless { @_ }, "GLOBAL" }

    # use v6 
;
    use Perlito6::AST;
    {
    package Perl5;
        sub new { shift; bless { @_ }, "Perl5" }
        sub tab {
            my $level = $_[0];
            (('    ') x $level)
        };
        ((my  $Hash_safe_char = bless {}, 'HASH') = do {
    (my  $Hash_a = bless {}, 'HASH');
    ($Hash_a->{'_'} = 1);
    ($Hash_a->{','} = 1);
    ($Hash_a->{'.'} = 1);
    ($Hash_a->{':'} = 1);
    ($Hash_a->{'-'} = 1);
    ($Hash_a->{'+'} = 1);
    ($Hash_a->{'*'} = 1);
    ($Hash_a->{' '} = 1);
    ($Hash_a->{'('} = 1);
    ($Hash_a->{')'} = 1);
    ($Hash_a->{'<'} = 1);
    ($Hash_a->{'>'} = 1);
    ($Hash_a->{'['} = 1);
    ($Hash_a->{']'} = 1);
    $Hash_a
});
        sub escape_string {
            my $s = $_[0];
            (my  $List_out = bless [], 'ARRAY');
            ((my  $tmp) = '');
            if (($s eq '')) {
                return scalar ((chr(39) . chr(39)))
            };
            for my $i ( @{(bless [0 .. (Main::chars($s, ) - 1)], 'ARRAY')} ) {
                ((my  $c) = substr($s, $i, 1));
                if (((((((($c ge 'a')) && (($c le 'z')))) || (((($c ge 'A')) && (($c le 'Z'))))) || (((($c ge '0')) && (($c le '9'))))) || exists($Hash_safe_char->{$c}))) {
                    ($tmp = ($tmp . $c))
                }
                else {
                    if (($tmp ne '')) {
                        push( @{$List_out}, (chr(39) . $tmp . chr(39)) )
                    };
                    push( @{$List_out}, ('chr(' . do {
    ord($c)
} . ')') );
                    ($tmp = '')
                }
            };
            if (($tmp ne '')) {
                push( @{$List_out}, (chr(39) . $tmp . chr(39)) )
            };
            return scalar (Main::join($List_out, ' . '))
        }
    }

;
    {
    package CompUnit;
        sub new { shift; bless { @_ }, "CompUnit" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            (my  $List_body = bless [], 'ARRAY');
            for ( @{(defined $self->{body} ? $self->{body} : ($self->{body} ||= bless([], 'ARRAY')))} ) {
                if (defined($_)) {
                    push( @{$List_body}, $_ )
                }
            };
            (Perl5::tab($level) . (chr(123) . chr(10)) . Perl5::tab($level) . 'package ' . $self->{name} . (chr(59)) . (chr(10)) . Perl5::tab(($level + 1)) . 'sub new ' . chr(123) . ' shift' . chr(59) . ' bless ' . chr(123) . ' ' . chr(64) . '_ ' . chr(125) . ', ' . chr(34) . $self->{name} . chr(34) . ' ' . chr(125) . (chr(10)) . Main::join(([ map { $_->emit_perl5_indented(($level + 1)) } @{( $List_body )} ]), (chr(59) . chr(10))) . (chr(10)) . Perl5::tab($level) . (chr(125) . chr(10)) . (chr(10)))
        };
        sub emit_perl5_program {
            my $comp_units = $_[0];
            ((my  $str) = ('' . ('use v5' . chr(59) . chr(10)) . ('use utf8' . chr(59) . chr(10)) . ('use strict' . chr(59) . chr(10)) . ('use warnings' . chr(59) . chr(10)) . ('no warnings (' . chr(39) . 'redefine' . chr(39) . ', ' . chr(39) . 'once' . chr(39) . ', ' . chr(39) . 'void' . chr(39) . ', ' . chr(39) . 'uninitialized' . chr(39) . ', ' . chr(39) . 'misc' . chr(39) . ', ' . chr(39) . 'recursion' . chr(39) . ')' . chr(59) . chr(10)) . ('use Perlito6::Perl5::Runtime' . chr(59) . chr(10)) . ('use Perlito6::Perl5::Prelude' . chr(59) . chr(10)) . ('our ' . chr(36) . 'MATCH ' . chr(61) . ' Perlito6::Match->new()' . chr(59) . chr(10))));
            for my $comp_unit ( @{(($comp_units))} ) {
                ($str = ($str . $comp_unit->emit_perl5_indented(0)))
            };
            ($str = ($str . ('1' . chr(59) . chr(10))));
            return scalar ($str)
        }
    }

;
    {
    package Val::Int;
        sub new { shift; bless { @_ }, "Val::Int" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            (Perl5::tab($level) . $self->{int})
        }
    }

;
    {
    package Val::Bit;
        sub new { shift; bless { @_ }, "Val::Bit" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            (Perl5::tab($level) . $self->{bit})
        }
    }

;
    {
    package Val::Num;
        sub new { shift; bless { @_ }, "Val::Num" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            (Perl5::tab($level) . $self->{num})
        }
    }

;
    {
    package Val::Buf;
        sub new { shift; bless { @_ }, "Val::Buf" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            (Perl5::tab($level) . Perl5::escape_string($self->{buf}))
        }
    }

;
    {
    package Lit::Block;
        sub new { shift; bless { @_ }, "Lit::Block" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            (Perl5::tab($level) . ('sub ' . chr(123) . chr(10)) . Main::join([ map { $_->emit_perl5_indented(($level + 1)) } @{( (defined $self->{stmts} ? $self->{stmts} : ($self->{stmts} ||= bless([], 'ARRAY'))) )} ], (chr(59) . chr(10))) . (chr(10)) . Perl5::tab($level) . (chr(125)))
        }
    }

;
    {
    package Lit::Array;
        sub new { shift; bless { @_ }, "Lit::Array" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            ((my  $ast) = $self->expand_interpolation());
            return scalar ($ast->emit_perl5_indented($level))
        }
    }

;
    {
    package Lit::Hash;
        sub new { shift; bless { @_ }, "Lit::Hash" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            ((my  $ast) = $self->expand_interpolation());
            return scalar ($ast->emit_perl5_indented($level))
        }
    }

;
    {
    package Index;
        sub new { shift; bless { @_ }, "Index" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            ($self->{obj}->emit_perl5_indented($level) . '->[' . $self->{index_exp}->emit_perl5() . ']')
        }
    }

;
    {
    package Lookup;
        sub new { shift; bless { @_ }, "Lookup" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            ($self->{obj}->emit_perl5_indented($level) . '->' . chr(123) . $self->{index_exp}->emit_perl5() . chr(125))
        }
    }

;
    {
    package Var;
        sub new { shift; bless { @_ }, "Var" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            ((my  $table) = do {
    (my  $Hash_a = bless {}, 'HASH');
    ($Hash_a->{chr(36)} = chr(36));
    ($Hash_a->{chr(64)} = chr(36) . 'List_');
    ($Hash_a->{chr(37)} = chr(36) . 'Hash_');
    ($Hash_a->{chr(38)} = chr(36) . 'Code_');
    $Hash_a
});
            ((my  $ns) = '');
            if ($self->{namespace}) {
                ($ns = ($self->{namespace} . '::'))
            }
            else {
                if ((((($self->{sigil} eq chr(64))) && (($self->{twigil} eq '*'))) && (($self->{name} eq 'ARGS')))) {
                    return scalar ((Perl5::tab($level) . '(' . chr(92) . chr(64) . 'ARGV)'))
                };
                if (($self->{twigil} eq '.')) {
                    if (($self->{sigil} eq chr(37))) {
                        return scalar ((Perl5::tab($level) . '(' . 'defined ' . chr(36) . 'self->' . chr(123) . $self->{name} . chr(125) . ' ' . chr(63) . ' ' . chr(36) . 'self->' . chr(123) . $self->{name} . chr(125) . ' ' . ': (' . chr(36) . 'self->' . chr(123) . $self->{name} . (chr(125) . ' ' . chr(61) . ' bless(' . chr(123) . chr(125) . ', ' . chr(39) . 'HASH' . chr(39) . ')))')))
                    }
                    else {
                        if (($self->{sigil} eq chr(64))) {
                            return scalar ((Perl5::tab($level) . '(' . 'defined ' . chr(36) . 'self->' . chr(123) . $self->{name} . chr(125) . ' ' . chr(63) . ' ' . chr(36) . 'self->' . chr(123) . $self->{name} . chr(125) . ' ' . ': (' . chr(36) . 'self->' . chr(123) . $self->{name} . (chr(125) . ' ' . chr(124) . chr(124) . chr(61) . ' bless([], ' . chr(39) . 'ARRAY' . chr(39) . ')))')))
                        }
                        else {
                            return scalar ((Perl5::tab($level) . chr(36) . 'self->' . chr(123) . $self->{name} . chr(125)))
                        }
                    }
                };
                if (($self->{name} eq chr(47))) {
                    return scalar ((Perl5::tab($level) . $table->{$self->{sigil}} . 'MATCH'))
                }
            };
            return scalar ((Perl5::tab($level) . $table->{$self->{sigil}} . $ns . $self->{name}))
        };
        sub plain_name {
            my $self = $_[0];
            if ($self->{namespace}) {
                return scalar (($self->{namespace} . '::' . $self->{name}))
            };
            return scalar ($self->{name})
        }
    }

;
    {
    package Proto;
        sub new { shift; bless { @_ }, "Proto" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            (Perl5::tab($level) . $self->{name})
        }
    }

;
    {
    package Call;
        sub new { shift; bless { @_ }, "Call" }
        ((my  $Hash_method_perl5 = bless {}, 'HASH') = do {
    (my  $Hash_a = bless {}, 'HASH');
    ($Hash_a->{'perl'} = 'Main::perl');
    ($Hash_a->{'id'} = 'Main::id');
    ($Hash_a->{'yaml'} = 'Main::yaml');
    ($Hash_a->{'say'} = 'Main::say');
    ($Hash_a->{'join'} = 'Main::join');
    ($Hash_a->{'split'} = 'Main::split');
    ($Hash_a->{'chars'} = 'Main::chars');
    ($Hash_a->{'isa'} = 'Main::isa');
    ($Hash_a->{'pairs'} = 'Main::pairs');
    ($Hash_a->{'keys'} = 'Main::keys');
    ($Hash_a->{'values'} = 'Main::values');
    $Hash_a
});
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            ((my  $invocant) = $self->{invocant}->emit_perl5());
            if (($invocant eq 'self')) {
                ($invocant = chr(36) . 'self')
            };
            if (exists($Hash_method_perl5->{$self->{method}})) {
                if (($self->{hyper})) {
                    return scalar ((Perl5::tab($level) . 'bless [ map ' . chr(123) . ' ' . $Hash_method_perl5->{$self->{method}} . '( ' . chr(36) . '_, ' . ', ' . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ')' . ' ' . chr(125) . ' ' . chr(64) . chr(123) . '( ' . $invocant . ' )' . chr(125) . ' ], ' . chr(34) . 'ARRAY' . chr(34)))
                }
                else {
                    return scalar ((Perl5::tab($level) . $Hash_method_perl5->{$self->{method}} . '(' . $invocant . ', ' . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ')'))
                }
            };
            if (($self->{method} eq 'push')) {
                return scalar ((Perl5::tab($level) . 'push( ' . chr(64) . chr(123) . $invocant . chr(125) . ', ' . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ' )'))
            };
            if (($self->{method} eq 'unshift')) {
                return scalar ((Perl5::tab($level) . 'unshift( ' . chr(64) . chr(123) . $invocant . chr(125) . ', ' . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ' )'))
            };
            if (($self->{method} eq 'pop')) {
                return scalar ((Perl5::tab($level) . 'pop( ' . chr(64) . chr(123) . $invocant . chr(125) . ' )'))
            };
            if (($self->{method} eq 'shift')) {
                return scalar ((Perl5::tab($level) . 'shift( ' . chr(64) . chr(123) . $invocant . chr(125) . ' )'))
            };
            if (($self->{method} eq 'elems')) {
                return scalar ((Perl5::tab($level) . 'scalar( ' . chr(64) . chr(123) . $invocant . chr(125) . ' )'))
            };
            ((my  $meth) = $self->{method});
            if (($meth eq 'postcircumfix:<( )>')) {
                ($meth = '')
            };
            ((my  $call) = ('->' . $meth . '(' . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ')'));
            if (($self->{hyper})) {
                if (!(((Main::isa($self->{invocant}, 'Apply') && ($self->{invocant}->code() eq 'prefix:<' . chr(64) . '>'))))) {
                    ($invocant = (chr(64) . chr(123) . '( ' . $invocant . ' )' . chr(125)))
                };
                return scalar ((Perl5::tab($level) . '[ map ' . chr(123) . ' ' . chr(36) . '_' . $call . ' ' . chr(125) . ' ' . $invocant . ' ]'))
            }
            else {
                (Perl5::tab($level) . $invocant . $call)
            }
        }
    }

;
    {
    package Apply;
        sub new { shift; bless { @_ }, "Apply" }
        ((my  $Hash_op_prefix_perl5 = bless {}, 'HASH') = do {
    (my  $Hash_a = bless {}, 'HASH');
    ($Hash_a->{'say'} = 'Main::say');
    ($Hash_a->{'print'} = 'Main::print');
    ($Hash_a->{'map'} = 'Main::map');
    ($Hash_a->{'grep'} = 'Main::grep');
    ($Hash_a->{'sort'} = 'Main::sort');
    ($Hash_a->{'warn'} = 'warn');
    ($Hash_a->{'Int'} = '0+');
    ($Hash_a->{'Num'} = '0+');
    ($Hash_a->{'bool'} = chr(33) . chr(33));
    ($Hash_a->{'prefix:<' . chr(126) . '>'} = chr(34) . chr(34) . '.');
    ($Hash_a->{'prefix:<' . chr(33) . '>'} = chr(33));
    ($Hash_a->{'prefix:<' . chr(63) . '>'} = chr(33) . chr(33));
    ($Hash_a->{'prefix:<++>'} = '++');
    ($Hash_a->{'prefix:<-->'} = '--');
    $Hash_a
});
        ((my  $Hash_op_infix_perl5 = bless {}, 'HASH') = do {
    (my  $Hash_a = bless {}, 'HASH');
    ($Hash_a->{'list:<' . chr(126) . '>'} = ' . ');
    ($Hash_a->{'infix:<+>'} = ' + ');
    ($Hash_a->{'infix:<->'} = ' - ');
    ($Hash_a->{'infix:<*>'} = ' * ');
    ($Hash_a->{'infix:<' . chr(47) . '>'} = ' ' . chr(47) . ' ');
    ($Hash_a->{'infix:<>>'} = ' > ');
    ($Hash_a->{'infix:<<>'} = ' < ');
    ($Hash_a->{'infix:<>' . chr(61) . '>'} = ' >' . chr(61) . ' ');
    ($Hash_a->{'infix:<<' . chr(61) . '>'} = ' <' . chr(61) . ' ');
    ($Hash_a->{'infix:<x>'} = ' x ');
    ($Hash_a->{'infix:<' . chr(38) . chr(38) . '>'} = ' ' . chr(38) . chr(38) . ' ');
    ($Hash_a->{'infix:<' . chr(124) . chr(124) . '>'} = ' ' . chr(124) . chr(124) . ' ');
    ($Hash_a->{'infix:<and>'} = ' and ');
    ($Hash_a->{'infix:<or>'} = ' or ');
    ($Hash_a->{'infix:<' . chr(47) . chr(47) . '>'} = ' ' . chr(47) . chr(47) . ' ');
    ($Hash_a->{'infix:<eq>'} = ' eq ');
    ($Hash_a->{'infix:<ne>'} = ' ne ');
    ($Hash_a->{'infix:<le>'} = ' le ');
    ($Hash_a->{'infix:<ge>'} = ' ge ');
    ($Hash_a->{'infix:<' . chr(61) . chr(61) . '>'} = ' ' . chr(61) . chr(61) . ' ');
    ($Hash_a->{'infix:<' . chr(33) . chr(61) . '>'} = ' ' . chr(33) . chr(61) . ' ');
    ($Hash_a->{'infix:<' . chr(61) . '>>'} = ' ' . chr(61) . '> ');
    $Hash_a
});
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            ((my  $apply) = $self->op_assign());
            if ($apply) {
                return scalar ($apply->emit_perl5_indented($level))
            };
            ((my  $ns) = '');
            if ($self->{namespace}) {
                ($ns = ($self->{namespace} . '::'))
            };
            ((my  $code) = ($ns . $self->{code}));
            if (Main::isa($code, 'Str')) {

            }
            else {
                return scalar ((Perl5::tab($level) . '(' . $self->{code}->emit_perl5() . ')->(' . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ')'))
            };
            if (exists($Hash_op_infix_perl5->{$code})) {
                return scalar ((Perl5::tab($level) . '(' . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), $Hash_op_infix_perl5->{$code}) . ')'))
            };
            if (exists($Hash_op_prefix_perl5->{$code})) {
                return scalar ((Perl5::tab($level) . $Hash_op_prefix_perl5->{$code} . '(' . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ')'))
            };
            if (($code eq 'self')) {
                return scalar ((Perl5::tab($level) . chr(36) . 'self'))
            };
            if (($code eq 'Mu')) {
                return scalar ((Perl5::tab($level) . 'undef()'))
            };
            if (($code eq 'make')) {
                return scalar ((Perl5::tab($level) . '(' . chr(36) . 'MATCH->' . chr(123) . 'capture' . chr(125) . ' ' . chr(61) . ' (' . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . '))'))
            };
            if (($code eq 'array')) {
                return scalar ((Perl5::tab($level) . chr(64) . chr(123) . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ' ') . chr(125)))
            };
            if (($code eq 'pop')) {
                return scalar ((Perl5::tab($level) . 'pop( ' . chr(64) . chr(123) . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ' ') . chr(125) . ' )'))
            };
            if (($code eq 'push')) {
                return scalar ((Perl5::tab($level) . 'push( ' . chr(64) . chr(123) . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0])->emit_perl5() . chr(125) . ', ' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[1])->emit_perl5() . ' )'))
            };
            if (($code eq 'shift')) {
                return scalar ((Perl5::tab($level) . 'shift( ' . chr(64) . chr(123) . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ' ') . chr(125) . ' )'))
            };
            if (($code eq 'unshift')) {
                return scalar ((Perl5::tab($level) . 'unshift( ' . chr(64) . chr(123) . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ' ') . chr(125) . ' )'))
            };
            if (($code eq 'prefix:<' . chr(36) . '>')) {
                return scalar ((Perl5::tab($level) . chr(36) . chr(123) . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ' ') . chr(125)))
            };
            if (($code eq 'prefix:<' . chr(64) . '>')) {
                return scalar ((Perl5::tab($level) . '(' . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ' ') . ')'))
            };
            if (($code eq 'prefix:<' . chr(37) . '>')) {
                return scalar ((Perl5::tab($level) . chr(37) . chr(123) . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ' ') . chr(125)))
            };
            if (($code eq 'postfix:<++>')) {
                return scalar ((Perl5::tab($level) . '(' . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ' ') . ')++'))
            };
            if (($code eq 'postfix:<-->')) {
                return scalar ((Perl5::tab($level) . '(' . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ' ') . ')--'))
            };
            if (($code eq 'infix:<..>')) {
                return scalar ((Perl5::tab($level) . '(bless [' . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ' .. ') . ('], ' . chr(39) . 'ARRAY' . chr(39) . ')')))
            };
            if (($code eq 'infix:<' . chr(61) . chr(61) . chr(61) . '>')) {
                return scalar ((Perl5::tab($level) . '(Main::id(' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0])->emit_perl5() . ') eq Main::id(' . ((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[1])->emit_perl5() . '))'))
            };
            if (($code eq 'ternary:<' . chr(63) . chr(63) . ' ' . chr(33) . chr(33) . '>')) {
                return scalar ((Perl5::tab($level) . '(' . (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0]->emit_perl5() . ' ' . chr(63) . ' ' . (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[1]->emit_perl5() . ' : ' . (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[2]->emit_perl5() . ')'))
            };
            if (($code eq 'circumfix:<( )>')) {
                return scalar ((Perl5::tab($level) . '(' . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ')'))
            };
            if (($code eq 'infix:<' . chr(61) . '>')) {
                return scalar ((Perl5::tab($level) . emit_perl5_bind((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[0], (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))->[1])))
            };
            if (($code eq 'return')) {
                if (((defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) && (scalar( @{(defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY')))} ) == 1))) {
                    return scalar ((Perl5::tab($level) . 'return scalar (' . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ')'))
                };
                return scalar ((Perl5::tab($level) . 'return (' . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ')'))
            };
            (Perl5::tab($level) . $code . '(' . Main::join(([ map { $_->emit_perl5() } @{( (defined $self->{arguments} ? $self->{arguments} : ($self->{arguments} ||= bless([], 'ARRAY'))) )} ]), ', ') . ')')
        };
        sub emit_perl5_bind {
            my $parameters = $_[0];
            my $arguments = $_[1];
            if (Main::isa($parameters, 'Call')) {
                ((my  $a) = $parameters);
                return scalar (('((' . ($a->invocant())->emit_perl5() . ')->' . chr(123) . $a->method() . chr(125) . ' ' . chr(61) . ' ' . $arguments->emit_perl5() . ')'))
            };
            if (((Main::isa($parameters, 'Var') && ($parameters->sigil() eq chr(64))) || (Main::isa($parameters, 'Decl') && ($parameters->var()->sigil() eq chr(64))))) {
                ($arguments = Lit::Array->new(('array1' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, $arguments );
    $List_a
})))
            }
            else {
                if (((Main::isa($parameters, 'Var') && ($parameters->sigil() eq chr(37))) || (Main::isa($parameters, 'Decl') && ($parameters->var()->sigil() eq chr(37))))) {
                    ($arguments = Lit::Hash->new(('hash1' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, $arguments );
    $List_a
})))
                }
            };
            ('(' . $parameters->emit_perl5() . ' ' . chr(61) . ' ' . $arguments->emit_perl5() . ')')
        }
    }

;
    {
    package If;
        sub new { shift; bless { @_ }, "If" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            return scalar ((Perl5::tab($level) . 'if (' . $self->{cond}->emit_perl5() . (') ' . chr(123) . chr(10)) . (($self->{body} ? (Main::join([ map { $_->emit_perl5_indented(($level + 1)) } @{( $self->{body}->stmts() )} ], (chr(59) . chr(10))) . (chr(10))) : '')) . Perl5::tab($level) . (chr(125)) . ((($self->{otherwise} && scalar( @{$self->{otherwise}->stmts()} )) ? ((chr(10) . Perl5::tab($level) . ('else ' . chr(123) . chr(10)) . Main::join([ map { $_->emit_perl5_indented(($level + 1)) } @{( $self->{otherwise}->stmts() )} ], (chr(59) . chr(10))) . (chr(10)) . Perl5::tab($level) . (chr(125)))) : ''))))
        }
    }

;
    {
    package While;
        sub new { shift; bless { @_ }, "While" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            ((my  $cond) = $self->{cond});
            if ((Main::isa($cond, 'Var') && ($cond->sigil() eq chr(64)))) {
                ($cond = Apply->new(('code' => 'prefix:<' . chr(64) . '>'), ('arguments' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, $cond );
    $List_a
})))
            };
            (Perl5::tab($level) . 'for ( ' . (($self->{init} ? ($self->{init}->emit_perl5() . chr(59) . ' ') : chr(59) . ' ')) . (($cond ? ($cond->emit_perl5() . chr(59) . ' ') : chr(59) . ' ')) . (($self->{continue} ? ($self->{continue}->emit_perl5() . ' ') : ' ')) . ') ' . chr(123) . (chr(10)) . Main::join([ map { $_->emit_perl5_indented(($level + 1)) } @{( $self->{body}->stmts() )} ], (chr(59) . chr(10))) . (chr(10)) . Perl5::tab($level) . (chr(125)))
        }
    }

;
    {
    package For;
        sub new { shift; bless { @_ }, "For" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            ((my  $cond) = $self->{cond});
            if (!(((Main::isa($cond, 'Var') && ($cond->sigil() eq chr(64)))))) {
                ($cond = Lit::Array->new(('array1' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, $cond );
    $List_a
})))
            };
            (my  $sig);
            if ($self->{body}->sig()) {
                ($sig = ('my ' . $self->{body}->sig()->emit_perl5() . ' '))
            };
            return scalar ((Perl5::tab($level) . 'for ' . $sig . '( ' . chr(64) . chr(123) . $cond->emit_perl5() . chr(125) . ' ) ' . chr(123) . (chr(10)) . Main::join([ map { $_->emit_perl5_indented(($level + 1)) } @{( $self->{body}->stmts() )} ], (chr(59) . chr(10))) . (chr(10)) . Perl5::tab($level) . (chr(125))))
        }
    }

;
    {
    package Decl;
        sub new { shift; bless { @_ }, "Decl" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            ((my  $decl) = $self->{decl});
            ((my  $name) = $self->{var}->plain_name());
            if (($decl eq 'has')) {
                return scalar ((Perl5::tab($level) . 'sub ' . $name . ' ' . chr(123) . ' ' . chr(36) . '_[0]->' . chr(123) . $name . chr(125) . ' ' . chr(125)))
            };
            ((my  $str) = ('(' . $self->{decl} . ' ' . $self->{type} . ' ' . $self->{var}->emit_perl5()));
            if ((($self->{var})->sigil() eq chr(37))) {
                ($str = ($str . ' ' . chr(61) . ' bless ' . chr(123) . chr(125) . ', ' . chr(39) . 'HASH' . chr(39) . ')'))
            }
            else {
                if ((($self->{var})->sigil() eq chr(64))) {
                    ($str = ($str . ' ' . chr(61) . ' bless [], ' . chr(39) . 'ARRAY' . chr(39) . ')'))
                }
                else {
                    ($str = ($str . ')'))
                }
            };
            return scalar ((Perl5::tab($level) . $str))
        }
    }

;
    {
    package Method;
        sub new { shift; bless { @_ }, "Method" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            ((my  $sig) = $self->{sig});
            ((my  $invocant) = $sig->invocant());
            ((my  $pos) = $sig->positional());
            ((my  $str) = '');
            ((my  $i) = 1);
            for my $field ( @{($pos)} ) {
                ($str = ($str . (Perl5::tab(($level + 1)) . 'my ' . $field->emit_perl5() . ' ' . chr(61) . ' ' . chr(36) . '_[' . $i . ']' . chr(59) . (chr(10)))));
                ($i = ($i + 1))
            };
            (Perl5::tab($level) . 'sub ' . $self->{name} . (' ' . chr(123) . chr(10)) . Perl5::tab(($level + 1)) . 'my ' . $invocant->emit_perl5() . ' ' . chr(61) . ' ' . chr(36) . '_[0]' . chr(59) . (chr(10)) . $str . "".(Main::join(([ map { $_->emit_perl5_indented(($level + 1)) } @{( (defined $self->{block} ? $self->{block} : ($self->{block} ||= bless([], 'ARRAY'))) )} ]), (chr(59) . chr(10)))) . (chr(10)) . Perl5::tab($level) . (chr(125)))
        }
    }

;
    {
    package Sub;
        sub new { shift; bless { @_ }, "Sub" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            ((my  $sig) = $self->{sig});
            ((my  $pos) = $sig->positional());
            ((my  $str) = '');
            ((my  $i) = 0);
            for my $field ( @{($pos)} ) {
                ($str = ($str . (Perl5::tab(($level + 1)) . 'my ' . $field->emit_perl5() . ' ' . chr(61) . ' ' . chr(36) . '_[' . $i . ']' . chr(59) . (chr(10)))));
                ($i = ($i + 1))
            };
            (Perl5::tab($level) . 'sub ' . $self->{name} . (' ' . chr(123) . chr(10)) . $str . Main::join(([ map { $_->emit_perl5_indented(($level + 1)) } @{( (defined $self->{block} ? $self->{block} : ($self->{block} ||= bless([], 'ARRAY'))) )} ]), (chr(59) . chr(10))) . (chr(10)) . Perl5::tab($level) . (chr(125)))
        }
    }

;
    {
    package Do;
        sub new { shift; bless { @_ }, "Do" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            ((my  $block) = $self->simplify()->block());
            (Perl5::tab($level) . ('do ' . chr(123) . chr(10)) . Main::join(([ map { $_->emit_perl5_indented(($level + 1)) } @{( $block )} ]), (chr(59) . chr(10))) . (chr(10)) . Perl5::tab($level) . (chr(125)))
        }
    }

;
    {
    package Use;
        sub new { shift; bless { @_ }, "Use" }
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            if (($self->{mod} eq 'v6')) {
                return scalar ((chr(10) . Perl5::tab($level) . (chr(35) . ' use ' . $self->{mod} . ' ' . chr(10))))
            };
            (Perl5::tab($level) . 'use ' . $self->{mod})
        }
    }


}

1;