NAME

Poet::Manual::Subclassing - Customizing Poet with subclasses

DESCRIPTION

You can subclass the following Poet classes for your application:

Poet::Cache
Poet::Conf
Poet::Log
Poet::Mason
Poet::Import
Poet::Plack::Request
Poet::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 here

1;

(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 here
1;

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 request
    my $result = super();
    # Perform tasks after request

    return $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::Import
use DBI;
use Poet::Moose;
extends 'Poet::Import';

method provide_dbh ($caller, $poet) {
    $dbh = DBI->connect(...);
}

SEE ALSO

Poet

AUTHOR

Jonathan Swartz <swartz@pobox.com>

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.