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 Perlito 7.0
use v5;
use utf8;
use strict;
use warnings;
no warnings ('redefine', 'once', 'void', 'uninitialized', 'misc', 'recursion');
use Perlito::Perl5::Runtime;
use Perlito::Perl5::Prelude;
our $MATCH = Perlito::Match->new();
{
package GLOBAL;
    sub new { shift; bless { @_ }, "GLOBAL" }

    # use v6 
;
    {
    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 name { $_[0]->{name} };
        sub body { $_[0]->{body} };
        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 ( @{$self->{body}} ) {
                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 Perlito::Perl5::Runtime' . chr(59) . chr(10)) . ('use Perlito::Perl5::Prelude' . chr(59) . chr(10)) . ('our ' . chr(36) . 'MATCH ' . chr(61) . ' Perlito::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 int { $_[0]->{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 bit { $_[0]->{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 num { $_[0]->{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 buf { $_[0]->{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 sig { $_[0]->{sig} };
        sub stmts { $_[0]->{stmts} };
        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)) } @{( $self->{stmts} )} ], (chr(59) . chr(10))) . (chr(10)) . Perl5::tab($level) . (chr(125)))
        }
    }

;
    {
    package Lit::Array;
        sub new { shift; bless { @_ }, "Lit::Array" }
        sub array1 { $_[0]->{array1} };
        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 hash1 { $_[0]->{hash1} };
        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 obj { $_[0]->{obj} };
        sub index_exp { $_[0]->{index_exp} };
        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 obj { $_[0]->{obj} };
        sub index_exp { $_[0]->{index_exp} };
        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 sigil { $_[0]->{sigil} };
        sub twigil { $_[0]->{twigil} };
        sub namespace { $_[0]->{namespace} };
        sub name { $_[0]->{name} };
        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 '.')) {
                    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 name { $_[0]->{name} };
        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" }
        sub invocant { $_[0]->{invocant} };
        sub hyper { $_[0]->{hyper} };
        sub method { $_[0]->{method} };
        sub arguments { $_[0]->{arguments} };
        ((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() } @{( $self->{arguments} )} ]), ', ') . ')' . ' ' . 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() } @{( $self->{arguments} )} ]), ', ') . ')'))
                }
            };
            if (($self->{method} eq 'push')) {
                return scalar ((Perl5::tab($level) . 'push( ' . chr(64) . chr(123) . $invocant . chr(125) . ', ' . Main::join(([ map { $_->emit_perl5() } @{( $self->{arguments} )} ]), ', ') . ' )'))
            };
            if (($self->{method} eq 'unshift')) {
                return scalar ((Perl5::tab($level) . 'unshift( ' . chr(64) . chr(123) . $invocant . chr(125) . ', ' . Main::join(([ map { $_->emit_perl5() } @{( $self->{arguments} )} ]), ', ') . ' )'))
            };
            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() } @{( $self->{arguments} )} ]), ', ') . ')'));
            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" }
        sub code { $_[0]->{code} };
        sub arguments { $_[0]->{arguments} };
        sub namespace { $_[0]->{namespace} };
        ((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() } @{( $self->{arguments} )} ]), ', ') . ')'))
            };
            if (exists($Hash_op_infix_perl5->{$code})) {
                return scalar ((Perl5::tab($level) . '(' . Main::join(([ map { $_->emit_perl5() } @{( $self->{arguments} )} ]), $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() } @{( $self->{arguments} )} ]), ', ') . ')'))
            };
            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() } @{( $self->{arguments} )} ]), ', ') . '))'))
            };
            if (($code eq 'array')) {
                return scalar ((Perl5::tab($level) . chr(64) . chr(123) . Main::join(([ map { $_->emit_perl5() } @{( $self->{arguments} )} ]), ' ') . chr(125)))
            };
            if (($code eq 'pop')) {
                return scalar ((Perl5::tab($level) . 'pop( ' . chr(64) . chr(123) . Main::join(([ map { $_->emit_perl5() } @{( $self->{arguments} )} ]), ' ') . chr(125) . ' )'))
            };
            if (($code eq 'push')) {
                return scalar ((Perl5::tab($level) . 'push( ' . chr(64) . chr(123) . ($self->{arguments}->[0])->emit_perl5() . chr(125) . ', ' . ($self->{arguments}->[1])->emit_perl5() . ' )'))
            };
            if (($code eq 'shift')) {
                return scalar ((Perl5::tab($level) . 'shift( ' . chr(64) . chr(123) . Main::join(([ map { $_->emit_perl5() } @{( $self->{arguments} )} ]), ' ') . chr(125) . ' )'))
            };
            if (($code eq 'unshift')) {
                return scalar ((Perl5::tab($level) . 'unshift( ' . chr(64) . chr(123) . Main::join(([ map { $_->emit_perl5() } @{( $self->{arguments} )} ]), ' ') . chr(125) . ' )'))
            };
            if (($code eq 'prefix:<' . chr(36) . '>')) {
                return scalar ((Perl5::tab($level) . chr(36) . chr(123) . Main::join(([ map { $_->emit_perl5() } @{( $self->{arguments} )} ]), ' ') . chr(125)))
            };
            if (($code eq 'prefix:<' . chr(64) . '>')) {
                return scalar ((Perl5::tab($level) . '(' . Main::join(([ map { $_->emit_perl5() } @{( $self->{arguments} )} ]), ' ') . ')'))
            };
            if (($code eq 'prefix:<' . chr(37) . '>')) {
                return scalar ((Perl5::tab($level) . chr(37) . chr(123) . Main::join(([ map { $_->emit_perl5() } @{( $self->{arguments} )} ]), ' ') . chr(125)))
            };
            if (($code eq 'postfix:<++>')) {
                return scalar ((Perl5::tab($level) . '(' . Main::join(([ map { $_->emit_perl5() } @{( $self->{arguments} )} ]), ' ') . ')++'))
            };
            if (($code eq 'postfix:<-->')) {
                return scalar ((Perl5::tab($level) . '(' . Main::join(([ map { $_->emit_perl5() } @{( $self->{arguments} )} ]), ' ') . ')--'))
            };
            if (($code eq 'infix:<..>')) {
                return scalar ((Perl5::tab($level) . '(bless [' . Main::join(([ map { $_->emit_perl5() } @{( $self->{arguments} )} ]), ' .. ') . ('], ' . chr(39) . 'ARRAY' . chr(39) . ')')))
            };
            if (($code eq 'infix:<' . chr(61) . chr(61) . chr(61) . '>')) {
                return scalar ((Perl5::tab($level) . '(Main::id(' . ($self->{arguments}->[0])->emit_perl5() . ') eq Main::id(' . ($self->{arguments}->[1])->emit_perl5() . '))'))
            };
            if (($code eq 'ternary:<' . chr(63) . chr(63) . ' ' . chr(33) . chr(33) . '>')) {
                return scalar ((Perl5::tab($level) . '(' . $self->{arguments}->[0]->emit_perl5() . ' ' . chr(63) . ' ' . $self->{arguments}->[1]->emit_perl5() . ' : ' . $self->{arguments}->[2]->emit_perl5() . ')'))
            };
            if (($code eq 'circumfix:<( )>')) {
                return scalar ((Perl5::tab($level) . '(' . Main::join(([ map { $_->emit_perl5() } @{( $self->{arguments} )} ]), ', ') . ')'))
            };
            if (($code eq 'infix:<' . chr(61) . '>')) {
                return scalar ((Perl5::tab($level) . emit_perl5_bind($self->{arguments}->[0], $self->{arguments}->[1])))
            };
            if (($code eq 'return')) {
                if (($self->{arguments} && (scalar( @{$self->{arguments}} ) == 1))) {
                    return scalar ((Perl5::tab($level) . 'return scalar (' . Main::join(([ map { $_->emit_perl5() } @{( $self->{arguments} )} ]), ', ') . ')'))
                };
                return scalar ((Perl5::tab($level) . 'return (' . Main::join(([ map { $_->emit_perl5() } @{( $self->{arguments} )} ]), ', ') . ')'))
            };
            (Perl5::tab($level) . $code . '(' . Main::join(([ map { $_->emit_perl5() } @{( $self->{arguments} )} ]), ', ') . ')')
        };
        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, 'Lit::Array')) {
                ((my  $a) = $parameters->array1());
                ((my  $str) = 'do ' . chr(123) . ' ');
                ((my  $i) = 0);
                for my $var ( @{($a)} ) {
                    ($str = ($str . (' ' . emit_perl5_bind($var, Index->new(('obj' => $arguments), ('index_exp' => Val::Int->new(('int' => $i))))) . chr(59) . ' ')));
                    ($i = ($i + 1))
                };
                return scalar (($str . $parameters->emit_perl5() . ' ' . chr(125)))
            };
            if (Main::isa($parameters, 'Lit::Hash')) {
                ((my  $a) = $parameters->hash1());
                ((my  $b) = $arguments->hash1());
                ((my  $str) = 'do ' . chr(123) . ' ');
                ((my  $i) = 0);
                (my  $arg);
                for my $var ( @{($a)} ) {
                    ($arg = Apply->new(('code' => 'Mu'), ('arguments' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    $List_a
})));
                    for my $var2 ( @{($b)} ) {
                        if ((($var2->[0])->buf() eq ($var->[0])->buf())) {
                            ($arg = $var2->[1])
                        }
                    };
                    ($str = ($str . (' ' . emit_perl5_bind($var->[1], $arg) . chr(59) . ' ')));
                    ($i = ($i + 1))
                };
                return scalar (($str . $parameters->emit_perl5() . ' ' . chr(125)))
            };
            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 cond { $_[0]->{cond} };
        sub body { $_[0]->{body} };
        sub otherwise { $_[0]->{otherwise} };
        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 init { $_[0]->{init} };
        sub cond { $_[0]->{cond} };
        sub continue { $_[0]->{continue} };
        sub body { $_[0]->{body} };
        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 cond { $_[0]->{cond} };
        sub body { $_[0]->{body} };
        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 decl { $_[0]->{decl} };
        sub type { $_[0]->{type} };
        sub var { $_[0]->{var} };
        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 Sig;
        sub new { shift; bless { @_ }, "Sig" }
        sub invocant { $_[0]->{invocant} };
        sub positional { $_[0]->{positional} };
        sub named { $_[0]->{named} };
        sub emit_perl5 {
            my $self = $_[0];
            $self->emit_perl5_indented(0)
        };
        sub emit_perl5_indented {
            my $self = $_[0];
            my $level = $_[1];
            ' print ' . chr(39) . 'Signature - TODO' . chr(39) . chr(59) . ' die ' . chr(39) . 'Signature - TODO' . chr(39) . chr(59) . ' '
        }
    }

;
    {
    package Method;
        sub new { shift; bless { @_ }, "Method" }
        sub name { $_[0]->{name} };
        sub sig { $_[0]->{sig} };
        sub block { $_[0]->{block} };
        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)) } @{( $self->{block} )} ]), (chr(59) . chr(10)))) . (chr(10)) . Perl5::tab($level) . (chr(125)))
        }
    }

;
    {
    package Sub;
        sub new { shift; bless { @_ }, "Sub" }
        sub name { $_[0]->{name} };
        sub sig { $_[0]->{sig} };
        sub block { $_[0]->{block} };
        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)) } @{( $self->{block} )} ]), (chr(59) . chr(10))) . (chr(10)) . Perl5::tab($level) . (chr(125)))
        }
    }

;
    {
    package Do;
        sub new { shift; bless { @_ }, "Do" }
        sub block { $_[0]->{block} };
        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 mod { $_[0]->{mod} };
        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;