The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

use strict; use warnings;
sub get_generator {
my $class = shift;
my $subclass = shift;
my $module = join '::', $class, $subclass;
my @classpath = split /::/, $class;
my $pm_file = File::Spec->catfile( @classpath, "$subclass.pm" );
require $pm_file;
return $module->new( @_ );
}
1;
=head1 NAME
Java::Javap::Generator - Factory for Perl 6 generators
=head1 SYNOPSIS
use Java::Javap::Generator;
my $gen = Java::Javap::Generator->get_generator( 'NAME', @args );
my $output = $gen->generate( @more_args );
=head1 DESCRIPTION
This is a factory class which returns a Java -> Perl 6 generator.
All generators must live in the Java::Javap::Generator:: namespace.
They must supply a C<new> and C<generate> methods.
To use a particular generator, see its POD.
=head1 KNOWN GENERATORS
Java::Javap::Generator::Perl6 - uses TT templates
=head1 METHODS
This moduule provides only one method which returns an instance of the
supplied generating class.
=head2 get_generator
Call C<get_generator> with the name of the generator you want to use.
Pass any additional arguments expected by the C<new> method of your
genertor's class. Example:
my $generator = Java::Javap::Generator->get_generator( 'Perl6' );
=head1 GENERATOR API
Each generator must live in the Java::Javap::Generator:: namespace and
must implement two methods:
=head2 new
A constructor called by C<get_generator> in this module. Your constructor
will receive all of the parameters passed to C<get_generator>, except
the name of the subclass (but C<new> is invoked through the fully
qualified subclass name, so you get that too).
C<java2perl6api> allows callers to supply these parameters as a string on the
command line with the C<-p> (or C<--genopts>) flag, whose value is split
on whitespace before the call.
=head2 generate
This method returns a single string containing the full text of a Perl
module corresponding to the abstract syntax tree of a Java module.
Someone else will decide what to do with the output, all you need to do
is make the string. See the test files C<t/02_interface.t> and
C<t/03_class.t> for examples of the syntax tree data structure.
Parameters are supplied to your C<generate> in a single hash reference.
These are the ones supplied by the C<java2perl6api> command line tool:
=over 4
=item class_file
The name of the Java .class file which was run through javap.
=item ast
The abstract syntax tree made from the class file by C<Java::Javap::Grammar>.
Again, see the tests for examples of the tree data structure.
=item javap_flags
The command line flags passed to javap (like -classpath ...). These
are included so you can dump them into a comment in the generated output.
=back
=head2 EXPORT
None. Call C<get_generator> as a class method.
=head1 SEE ALSO
All the modules in the Java::Javap::Generator:: namespace.
=head1 AUTHOR
Phil Crow, E<lt>crow.phil@gmail.comE<gt>
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2007, Phil Crow
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.6 or,
at your option, any later version of Perl 5 you may have available.
=cut