BEGIN {
$Language::Expr::Compiler::Base::VERSION = '0.08';
}
# ABSTRACT: Base class for Expr compilers
use 5.010;
use UUID::Tiny ':std';
# [[type, uuid, data], ...]
has markers => (is => 'rw', default => sub { [] });
has func_mapping => (is => 'rw', default => sub { {} });
sub new_marker {
my ($self, $type, $data) = @_;
my $uuid = UUID::Tiny::create_uuid_as_string(UUID_V4);
#my $uuid = int(9000*rand()+1000);
#print "DEBUG: Creating new marker: type=$type, uuid=$uuid, data=", ($data // "undef"), "\n\n";
push @{ $self->markers }, [$type, $uuid, $data];
$uuid;
}
sub marker_ids {
my ($self) = @_;
map {$_->[1]} @{ $self->markers };
}
sub marker_ids_re {
my ($self) = @_;
my $re = "(?:" . join("|", map {$_->[1]} @{ $self->markers }) . ")";
qr/$re/;
}
__PACKAGE__->meta->make_immutable;
no Any::Moose;
1;
__END__
=pod
=head1 NAME
Language::Expr::Compiler::Base - Base class for Expr compilers
=head1 VERSION
version 0.08
=head1 ATTRIBUTES
=head2 markers => ARRAYREF
Used to mark compile output string with various unique strings, and
later on revisit these markers and substitute for other, final
values. This technique is kind of a hack, used for subexpression,
inserting PHP use() statement (because they must be processed outward
to inward), etc.
=head2 func_mapping => HASHREF
Map Expr function to target language's function/method/property.
=head1 METHODS
=head2 new_marker(TYPE[, DATA]) => UUID
Create a new marker. Return a unique ID to be placed in compiled
output.
=head2 marker_ids() => ARRAY
Return an array of all marker IDs.
=head2 marker_ids_re() => STRING
Return a regex that matches marker IDs.
=head1 AUTHOR
Steven Haryanto <stevenharyanto@gmail.com>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2010 by Steven Haryanto.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut