Provided by: libsql-translator-perl_1.65-1_all
NAME
SQL::Translator::Producer::TT::Base - TT (Template Toolkit) based Producer base class.
SYNOPSIS
# Create a producer using a template in the __DATA__ section. package SQL::Translator::Producer::Foo; use base qw/SQL::Translator::Producer::TT::Base/; # Convert produce call into a method call on our new class sub produce { return __PACKAGE__->new( translator => shift )->run; }; # Configure the Template object. sub tt_config { ( INTERPOLATE => 1 ); } # Extra vars to add to the template sub tt_vars { ( foo => "bar" ); } # Put template in DATA section (or use file with ttfile producer arg) __DATA__ Schema Database: [% schema.database %] Foo: $foo ...
DESCRIPTION
A base class producer designed to be sub-classed to create new TT based producers cheaply - by simply giving the template to use and sprinkling in some extra template variables and config. You can find an introduction to this module in SQL::Translator::Manual. The 1st thing the module does is convert the produce sub routine call we get from SQL::Translator into a method call on an object, which we can then sub-class. This is done with the following code which needs to appear in all sub classes. # Convert produce call into an object method call sub produce { return __PACKAGE__->new( translator => shift )->run; }; See "PRODUCER OBJECT" below for details. The upshot of this is we can make new template producers by sub classing this base class, adding the above snippet and a template. The module also provides a number of hooks into the templating process, see "SUB CLASS HOOKS" for details. See the "SYNOPSIS" above for an example of creating a simple producer using a single template stored in the producers DATA section.
SUB CLASS HOOKS
Sub-classes can override these methods to control the templating by giving the template source, adding variables and giving config to the Tempate object. tt_config sub tt_config { ( INTERPOLATE => 1 ); } Return hash of Template config to add to that given to the Template "new" method. tt_schema sub tt_schema { "foo.tt"; } sub tt_schema { local $/ = undef; \<DATA>; } The template to use, return a file name or a scalar ref of TT source, or an IO::Handle. See Template for details, as the return from this is passed on to it's "produce" method. The default implementation uses the producer arg "ttfile" as a filename to read the template from. If the arg isn't there it will look for a "__DATA__" section in the class, reading it as template source if found. Returns undef if both these fail, causing the produce call to fail with a 'no template!' error. tt_vars sub tt_vars { ( foo => "bar" ); } Return hash of template vars to use in the template. Nothing added here by default, but see "tt_default_vars" for the variables you get for free. tt_default_vars Return a hash-ref of the default vars given to the template. You wouldn't normally over- ride this, just inherit the default implementation, to get the "translator" & "schema" variables, then over-ride "tt_vars" to add your own. The current default variables are: schema The schema to template. translator The SQL::Translator object. pre_process_schema WARNING: This method is Experimental so may change! Called with the SQL::Translator::Schema object and should return one (it doesn't have to be the same one) that will become the "schema" variable used in the template. Gets called from tt_default_vars.
PRODUCER OBJECT
The rest of the methods in the class set up a sub-classable producer object. You normally just inherit them. new my $tt_producer = TT::Base->new( translator => $translator ); Construct a new TT Producer object. Takes a single, named arg of the SQL::Translator object running the translation. Dies if this is not given. translator Return the SQL::Translator object. schema Return the SQL::Translator::Schema we are translating. This is equivalent to "$tt_producer->translator->schema". run Called to actually produce the output, calling the sub class hooks. Returns the produced text. args Util wrapper method around "TT::Base->translator->producer_args" for (mostly) readonly access to the producer args. How it works depends on the number of arguments you give it and the context. No args - Return hashref (the actual hash in Translator) or hash of args. 1 arg - Return value of the arg with the passed name. 2+ args - List of names. In list context returns values of the given arg names, returns as a hashref in scalar context. Any names given that don't exist in the args are returned as undef. This is still a bit messy but is a handy way to access the producer args when you use your own to drive the templating.
SEE ALSO
perl, SQL::Translator, Template.
TODO
- Add support for a sqlf template repository, set as an INCLUDE_PATH, so that sub-classes can easily include file based templates using relative paths. - Pass in template vars from the producer args and command line. - Merge in TT::Table. - Hooks to pre-process the schema and post-process the output.
AUTHOR
Mark Addison <grommit@users.sourceforge.net>.