NAME
Poet::Manual::Subclassing - Customizing Poet with subclasses
DESCRIPTION
You can subclass the following Poet classes for your application:
Poet::CachePoet::ConfPoet::LogPoet::MasonPoet::ImportPoet::Plack::RequestPoet::Plack::Response
and arrange things so that Poet always uses your subclass instead of its default class.
Place Poet subclasses under "lib/MyApp/Class.pm" in your environment, where "MyApp" is your app name and "Class" is the class you are subclassing minus the "Poet" prefix. A few of these subclasses are generated for you by "poet new".
For example, to subclass "Poet::Cache":
package MyApp::Cache;use Poet::Moose;extends 'Poet::Cache';# put your modifications here1;
(Note: Poet::Moose is Moose plus a few Poet standards. You could also use plain "Moose" here.)
Poet will automatically detect, load and use any such subclasses. Internally it uses the app_class environment method whenever it needs a classname, e.g.
# Do something with MyApp::Cache or Poet::Cache$poet->app_class('Cache')->...
Subclassing Mason
As long as you have even a bare-bones "Poet::Mason" subclass, e.g.
package MyApp::Mason;use Poet::Moose;extends 'Poet::Mason';1;
then your Mason subclasses will be autodetected as well, e.g.
package MyApp::Mason::Interp;use Moose;extends 'Mason::Interp';# put your modifications here1;
"poet new" will create the bare-bones subclass for you; it is otherwise harmless.
See Mason::Manual::Subclasses for more information.
EXAMPLES
Use INI instead of YAML for config files
package MyApp::Conf;use Config::INI;use Moose;extends 'Poet::Conf';override 'read_conf_file' => sub {my ($self, $file) = @_;return Config::INI::Reader->read_file($file);};
Perform tasks before and after each Mason request
package MyApp::Mason::Request;use Moose;extends 'Mason::Request';override 'run' => sub {my $self = shift;# Perform tasks before requestmy $result = super();# Perform tasks after requestreturn $result;};
Add Perl code to the top of every compiled component
package MyApp::Mason::Compilation;use Moose;extends 'Mason::Compilation';override 'output_class_header' => sub {return join("\n", super(), 'use Foo;', 'use Bar qw(baz);');};
Use Log::Dispatch instead of Log4perl for logging
package MyApp::Log;use Log::Any::Adapter;use Log::Dispatch;use Moose;extends 'Poet::Log';override 'initialize_logging' => sub {my $log = Log::Dispatch->new( ... );Log::Any::Adapter->set('Dispatch', dispatcher => $log);};
Add your own $dbh quick var
package MyApp::Importuse DBI;use Poet::Moose;extends 'Poet::Import';method provide_dbh ($caller, $poet) {$dbh = DBI->connect(...);}
SEE ALSO
Poet
AUTHOR
Jonathan Swartz <[email protected]>
COPYRIGHT AND LICENSE
This software is copyright (c) 2012 by Jonathan Swartz.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.