[Catalyst-commits] r10532 - in trunk/Catalyst-Model-DBIC-Schema: .
lib/Catalyst lib/Catalyst/Model/DBIC lib/Catalyst/Model/DBIC/Schema
lib/Catalyst/Model/DBIC/Schema/Trait lib/Catalyst/TraitFor
lib/Catalyst/TraitFor/Model lib/Catalyst/TraitFor/Model/DBIC
lib/Catalyst/TraitFor/Model/DBIC/Schema
caelum at dev.catalyst.perl.org
caelum at dev.catalyst.perl.org
Sun Jun 14 02:49:37 GMT 2009
Author: caelum
Date: 2009-06-14 02:49:36 +0000 (Sun, 14 Jun 2009)
New Revision: 10532
Added:
trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/TraitFor/
trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/TraitFor/Model/
trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/TraitFor/Model/DBIC/
trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/TraitFor/Model/DBIC/Schema/
trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/TraitFor/Model/DBIC/Schema/Caching.pm
trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/TraitFor/Model/DBIC/Schema/Replicated.pm
Removed:
trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/Model/DBIC/Schema/Trait/Caching.pm
trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/Model/DBIC/Schema/Trait/Replicated.pm
Modified:
trunk/Catalyst-Model-DBIC-Schema/Makefile.PL
trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/Model/DBIC/Schema.pm
trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/Model/DBIC/Schema/Types.pm
Log:
switch to CX::Component::Traits
Modified: trunk/Catalyst-Model-DBIC-Schema/Makefile.PL
===================================================================
--- trunk/Catalyst-Model-DBIC-Schema/Makefile.PL 2009-06-14 02:40:06 UTC (rev 10531)
+++ trunk/Catalyst-Model-DBIC-Schema/Makefile.PL 2009-06-14 02:49:36 UTC (rev 10532)
@@ -3,9 +3,9 @@
name 'Catalyst-Model-DBIC-Schema';
all_from 'lib/Catalyst/Model/DBIC/Schema.pm';
-requires 'DBIx::Class' => '0.08103';
+requires 'DBIx::Class' => '0.08107';
requires 'Catalyst::Runtime' => '5.80005';
-requires 'MooseX::Traits' => '0.05';
+requires 'CatalystX::Component::Traits';
requires 'Moose';
requires 'Moose::Autobox';
requires 'MooseX::Types';
Deleted: trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/Model/DBIC/Schema/Trait/Caching.pm
===================================================================
--- trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/Model/DBIC/Schema/Trait/Caching.pm 2009-06-14 02:40:06 UTC (rev 10531)
+++ trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/Model/DBIC/Schema/Trait/Caching.pm 2009-06-14 02:49:36 UTC (rev 10532)
@@ -1,122 +0,0 @@
-package Catalyst::Model::DBIC::Schema::Trait::Caching;
-
-use namespace::autoclean;
-use Moose::Role;
-use Carp::Clan '^Catalyst::Model::DBIC::Schema';
-use Catalyst::Model::DBIC::Schema::Types 'CursorClass';
-use MooseX::Types::Moose qw/Int Str/;
-
-=head1 NAME
-
-Catalyst::Model::DBIC::Schema::Trait::Caching - Query caching support for
-Catalyst::Model::DBIC::Schema
-
-=head1 SYNOPSIS
-
- __PACKAGE__->config({
- traits => ['Caching'],
- connect_info =>
- ['dbi:mysql:db', 'user', 'pass'],
- });
-
- $c->model('DB::Table')->search({ foo => 'bar' }, { cache_for => 18000 });
-
-=head1 DESCRIPTION
-
-Enable caching support using L<DBIx::Class::Cursor::Cached> and
-L<Catalyst::Plugin::Cache>.
-
-In order for this to work, L<Catalyst::Plugin::Cache> must be configured and
-loaded. A possible configuration would look like this:
-
- <Plugin::Cache>
- <backend>
- class Cache::FastMmap
- unlink_on_exit 1
- </backend>
- </Plugin::Cache>
-
-Then in your queries, set the C<cache_for> ResultSet attribute to the number of
-seconds you want the query results to be cached for, eg.:
-
- $c->model('DB::Table')->search({ foo => 'bar' }, { cache_for => 18000 });
-
-=head1 CONFIG PARAMETERS
-
-=head2 caching
-
-Turn caching on or off, you can use:
-
- $c->model('DB')->caching(0);
-
-=cut
-
-has caching => (is => 'rw', isa => Int, default => 1);
-
-after setup => sub {
- my $self = shift;
-
- return if !$self->caching;
-
- $self->caching(0);
-
- my $cursor_class = $self->connect_info->{cursor_class}
- || 'DBIx::Class::Cursor::Cached';
-
- unless (eval { Class::MOP::load_class($cursor_class) }) {
- carp "Caching disabled, cannot load cursor class"
- . " $cursor_class: $@";
- return;
- }
-
- unless ($cursor_class->can('clear_cache')) {
- carp "Caching disabled, cursor_class $cursor_class does not"
- . " support it.";
- return;
- }
-
- $self->connect_info->{cursor_class} = $cursor_class;
- $self->caching(1);
-};
-
-before ACCEPT_CONTEXT => sub {
- my ($self, $c) = @_;
-
- return $self unless
- $self->caching;
-
- unless ($c->can('cache') && ref $c->cache) {
- $c->log->warn("DBIx::Class cursor caching disabled, you don't seem to"
- . " have a working Cache plugin.");
- $self->caching(0);
- $self->_reset_cursor_class;
- return $self;
- }
-
- if (ref $self->schema->default_resultset_attributes) {
- $self->schema->default_resultset_attributes->{cache_object} =
- $c->cache;
- } else {
- $self->schema->default_resultset_attributes({
- cache_object => $c->cache
- });
- }
-};
-
-=head1 SEE ALSO
-
-L<Catalyst::Model::DBIC::Schema>, L<DBIx::Class>, L<Catalyst::Plugin::Cache>,
-L<Cache::FastMmap>, L<DBIx::Class::Cursor::Cached>
-
-=head1 AUTHOR
-
-Rafael Kitover, C<rkitover at cpan.org>
-
-=head1 COPYRIGHT
-
-This program is free software, you can redistribute it and/or modify it
-under the same terms as Perl itself.
-
-=cut
-
-1;
Deleted: trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/Model/DBIC/Schema/Trait/Replicated.pm
===================================================================
--- trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/Model/DBIC/Schema/Trait/Replicated.pm 2009-06-14 02:40:06 UTC (rev 10531)
+++ trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/Model/DBIC/Schema/Trait/Replicated.pm 2009-06-14 02:49:36 UTC (rev 10532)
@@ -1,105 +0,0 @@
-package Catalyst::Model::DBIC::Schema::Trait::Replicated;
-
-use namespace::autoclean;
-use Moose::Role;
-use Moose::Autobox;
-use Carp::Clan '^Catalyst::Model::DBIC::Schema';
-
-use Catalyst::Model::DBIC::Schema::Types 'ConnectInfos';
-
-=head1 NAME
-
-Catalyst::Model::DBIC::Schema::Trait::Replicated - Replicated storage support for
-L<Catalyst::Model::DBIC::Schema>
-
-=head1 SYNOPSiS
-
- __PACKAGE__->config({
- traits => ['Replicated']
- connect_info =>
- ['dbi:mysql:master', 'user', 'pass'],
- replicants => [
- ['dbi:mysql:slave1', 'user', 'pass'],
- ['dbi:mysql:slave2', 'user', 'pass'],
- ['dbi:mysql:slave3', 'user', 'pass'],
- ],
- balancer_args => {
- master_read_weight => 0.3
- }
- });
-
-=head1 DESCRIPTION
-
-Sets your storage_type to L<DBIx::Class::Storage::DBI::Replicated> and connects
-replicants provided in config. See that module for supported resultset
-attributes.
-
-The default L<DBIx::Class::Storage::DBI::Replicated/balancer_type> is
-C<::Random>.
-
-Sets the
-L<DBIx::Class::Storage::DBI::Replicated::Balancer::Random/master_read_weight> to
-C<1> by default, meaning that you have the same chance of reading from master as
-you do from replicants. Set to C<0> to turn off reads from master.
-
-=head1 CONFIG PARAMETERS
-
-=head2 replicants
-
-Array of connect_info settings for every replicant.
-
-=cut
-
-has replicants => (
- is => 'ro', isa => ConnectInfos, coerce => 1, required => 1
-);
-
-after setup => sub {
- my $self = shift;
-
-# check storage_type compatibility (if configured)
- if (my $storage_type = $self->storage_type) {
- my $class = $storage_type =~ /^::/ ?
- "DBIx::Class::Storage$storage_type"
- : $storage_type;
-
- croak "This storage_type cannot be used with replication"
- unless $class->isa('DBIx::Class::Storage::DBI::Replicated');
- } else {
- $self->storage_type('::DBI::Replicated');
- }
-
- $self->connect_info->{balancer_type} ||= '::Random'
- unless $self->connect_info->{balancer_type};
-
- unless ($self->connect_info->{balancer_args} &&
- exists $self->connect_info->{balancer_args}{master_read_weight}) {
- $self->connect_info->{balancer_args}{master_read_weight} = 1;
- }
-};
-
-sub BUILD {}
-after BUILD => sub {
- my $self = shift;
-
- $self->storage->connect_replicants(map [ $_ ], $self->replicants->flatten);
-};
-
-=head1 SEE ALSO
-
-L<Catalyst::Model::DBIC::Schema>, L<DBIx::Class>,
-L<DBIx::Class::Storage::DBI::Replicated>,
-L<Cache::FastMmap>, L<DBIx::Class::Cursor::Cached>
-
-=head1 AUTHOR
-
-Rafael Kitover, C<rkitover at cpan.org>
-
-=head1 COPYRIGHT
-
-This program is free software, you can redistribute it and/or modify it
-under the same terms as Perl itself.
-
-=cut
-
-1;
Modified: trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/Model/DBIC/Schema/Types.pm
===================================================================
--- trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/Model/DBIC/Schema/Types.pm 2009-06-14 02:40:06 UTC (rev 10531)
+++ trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/Model/DBIC/Schema/Types.pm 2009-06-14 02:49:36 UTC (rev 10532)
@@ -13,6 +13,8 @@
use namespace::clean -except => 'meta';
+class_type 'DBIx::Class::Schema';
+
subtype SchemaClass,
as ClassName;
Modified: trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/Model/DBIC/Schema.pm
===================================================================
--- trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/Model/DBIC/Schema.pm 2009-06-14 02:40:06 UTC (rev 10531)
+++ trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/Model/DBIC/Schema.pm 2009-06-14 02:49:36 UTC (rev 10532)
@@ -2,8 +2,8 @@
use Moose;
use mro 'c3';
-with 'MooseX::Traits';
extends 'Catalyst::Model';
+with 'CatalystX::Component::Traits';
our $VERSION = '0.24';
@@ -308,17 +308,18 @@
Array of Traits to apply to the instance. Traits are L<Moose::Role>s.
-They are relative to the C<< MyApp::Model::DB::Trait:: >>, then the C<<
-Catalyst::Model::DBIC::Schema::Trait:: >> namespaces, unless prefixed with C<+>
+They are relative to the C<< MyApp::TraitFor::Model::DBIC::Schema:: >>, then the C<<
+Catalyst::TraitFor::Model::DBIC::Schema:: >> namespaces, unless prefixed with C<+>
in which case they are taken to be a fully qualified name. E.g.:
traits Caching
- traits +MyApp::DB::Trait::Foo
+ traits +MyApp::TraitFor::Model::Foo
A new instance is created at application time, so any consumed required
attributes, coercions and modifiers will work.
-Traits are applied at L<Catalyst::Component/COMPONENT> time using L<MooseX::Traits>.
+Traits are applied at L<Catalyst::Component/COMPONENT> time using
+L<CatalystX::Component::Traits>.
C<ref $self> will be an anon class if any traits are applied, C<<
$self->_original_class_name >> will be the original class.
@@ -330,9 +331,9 @@
=over 4
-=item L<Catalyst::Model::DBIC::Schema::Trait::Caching>
+=item L<Catalyst::TraitFor::Model::DBIC::Schema::Caching>
-=item L<Catalyst::Model::DBIC::Schema::Trait::Replicated>
+=item L<Catalyst::TraitFor::Model::DBIC::Schema::Replicated>
=back
@@ -361,16 +362,18 @@
C<::Model::> or C<::M::> in your class name. E.g. if your class name is
C<MyApp::Model::DB> the L</model_name> will be C<DB>.
-=head2 _original_class_name
-
-The class name of your model before any L</traits> are applied. E.g.
-C<MyApp::Model::DB>.
-
=head2 _default_cursor_class
What to reset your L<DBIx::Class::Storage::DBI/cursor_class> to if a custom one
doesn't work out. Defaults to L<DBIx::Class::Storage::DBI::Cursor>.
+=head1 ATTRIBUTES FROM L<MooseX::Traits::Pluggable>
+
+=head2 _original_class_name
+
+The class name of your model before any L</traits> are applied. E.g.
+C<MyApp::Model::DB>.
+
=head2 _traits
Unresolved arrayref of traits passed in the config.
@@ -448,9 +451,6 @@
lazy_build => 1,
);
-has _traits => (is => 'ro', isa => ArrayRef);
-has _resolved_traits => (is => 'ro', isa => ArrayRef);
-
has _default_cursor_class => (
is => 'ro',
isa => CursorClass,
@@ -458,32 +458,6 @@
coerce => 1
);
-has _original_class_name => (
- is => 'ro',
- required => 1,
- isa => Str,
- default => sub { blessed $_[0] },
-);
-
-sub COMPONENT {
- my ($class, $app, $args) = @_;
-
- $args = $class->merge_config_hashes($class->config, $args);
-
- if (my $traits = delete $args->{traits}) {
- my @traits = $class->_resolve_traits($traits->flatten);
- return $class->new_with_traits(
- traits => \@traits,
- _original_class_name => $class,
- _traits => $traits,
- _resolved_traits => \@traits,
- %$args
- );
- }
-
- return $class->new($args);
-}
-
sub BUILD {
my $self = shift;
my $class = $self->_original_class_name;
@@ -591,32 +565,6 @@
}
}
-sub _resolve_traits {
- my ($class, @names) = @_;
- my $base = 'Trait';
-
- my @search_ns = grep !/^(?:Moose|Class::MOP)::/,
- $class->meta->class_precedence_list;
-
- my @traits;
-
- OUTER: for my $name (@names) {
- if ($name =~ /^\+(.*)/) {
- push @traits, $1;
- next;
- }
- for my $ns (@search_ns) {
- my $full = "${ns}::${base}::${name}";
- if (eval { Class::MOP::load_class($full) }) {
- push @traits, $full;
- next OUTER;
- }
- }
- }
-
- return @traits;
-}
-
sub _build_model_name {
my $self = shift;
my $class = $self->_original_class_name;
@@ -642,8 +590,8 @@
Traits:
-L<Catalyst::Model::DBIC::Schema::Trait::Caching>,
-L<Catalyst::Model::DBIC::Schema::Trait::Replicated>
+L<Catalyst::TraitFor::Model::DBIC::Schema::Caching>,
+L<Catalyst::TraitFor::Model::DBIC::Schema::Replicated>
=head1 AUTHOR
Copied: trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/TraitFor/Model/DBIC/Schema/Caching.pm (from rev 10358, trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/Model/DBIC/Schema/Trait/Caching.pm)
===================================================================
--- trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/TraitFor/Model/DBIC/Schema/Caching.pm (rev 0)
+++ trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/TraitFor/Model/DBIC/Schema/Caching.pm 2009-06-14 02:49:36 UTC (rev 10532)
@@ -0,0 +1,122 @@
+package Catalyst::TraitFor::Model::DBIC::Schema::Caching;
+
+use namespace::autoclean;
+use Moose::Role;
+use Carp::Clan '^Catalyst::Model::DBIC::Schema';
+use Catalyst::Model::DBIC::Schema::Types 'CursorClass';
+use MooseX::Types::Moose qw/Int Str/;
+
+=head1 NAME
+
+Catalyst::TraitFor::Model::DBIC::Schema::Caching - Query caching support for
+Catalyst::Model::DBIC::Schema
+
+=head1 SYNOPSIS
+
+ __PACKAGE__->config({
+ traits => ['Caching'],
+ connect_info =>
+ ['dbi:mysql:db', 'user', 'pass'],
+ });
+
+ $c->model('DB::Table')->search({ foo => 'bar' }, { cache_for => 18000 });
+
+=head1 DESCRIPTION
+
+Enable caching support using L<DBIx::Class::Cursor::Cached> and
+L<Catalyst::Plugin::Cache>.
+
+In order for this to work, L<Catalyst::Plugin::Cache> must be configured and
+loaded. A possible configuration would look like this:
+
+ <Plugin::Cache>
+ <backend>
+ class Cache::FastMmap
+ unlink_on_exit 1
+ </backend>
+ </Plugin::Cache>
+
+Then in your queries, set the C<cache_for> ResultSet attribute to the number of
+seconds you want the query results to be cached for, eg.:
+
+ $c->model('DB::Table')->search({ foo => 'bar' }, { cache_for => 18000 });
+
+=head1 CONFIG PARAMETERS
+
+=head2 caching
+
+Turn caching on or off, you can use:
+
+ $c->model('DB')->caching(0);
+
+=cut
+
+has caching => (is => 'rw', isa => Int, default => 1);
+
+after setup => sub {
+ my $self = shift;
+
+ return if !$self->caching;
+
+ $self->caching(0);
+
+ my $cursor_class = $self->connect_info->{cursor_class}
+ || 'DBIx::Class::Cursor::Cached';
+
+ unless (eval { Class::MOP::load_class($cursor_class) }) {
+ carp "Caching disabled, cannot load cursor class"
+ . " $cursor_class: $@";
+ return;
+ }
+
+ unless ($cursor_class->can('clear_cache')) {
+ carp "Caching disabled, cursor_class $cursor_class does not"
+ . " support it.";
+ return;
+ }
+
+ $self->connect_info->{cursor_class} = $cursor_class;
+ $self->caching(1);
+};
+
+before ACCEPT_CONTEXT => sub {
+ my ($self, $c) = @_;
+
+ return $self unless
+ $self->caching;
+
+ unless ($c->can('cache') && ref $c->cache) {
+ $c->log->warn("DBIx::Class cursor caching disabled, you don't seem to"
+ . " have a working Cache plugin.");
+ $self->caching(0);
+ $self->_reset_cursor_class;
+ return $self;
+ }
+
+ if (ref $self->schema->default_resultset_attributes) {
+ $self->schema->default_resultset_attributes->{cache_object} =
+ $c->cache;
+ } else {
+ $self->schema->default_resultset_attributes({
+ cache_object => $c->cache
+ });
+ }
+};
+
+=head1 SEE ALSO
+
+L<Catalyst::Model::DBIC::Schema>, L<DBIx::Class>, L<Catalyst::Plugin::Cache>,
+L<Cache::FastMmap>, L<DBIx::Class::Cursor::Cached>
+
+=head1 AUTHOR
+
+Rafael Kitover, C<rkitover at cpan.org>
+
+=head1 COPYRIGHT
+
+This program is free software, you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
+1;
Copied: trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/TraitFor/Model/DBIC/Schema/Replicated.pm (from rev 10358, trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/Model/DBIC/Schema/Trait/Replicated.pm)
===================================================================
--- trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/TraitFor/Model/DBIC/Schema/Replicated.pm (rev 0)
+++ trunk/Catalyst-Model-DBIC-Schema/lib/Catalyst/TraitFor/Model/DBIC/Schema/Replicated.pm 2009-06-14 02:49:36 UTC (rev 10532)
@@ -0,0 +1,105 @@
+package Catalyst::TraitFor::Model::DBIC::Schema::Replicated;
+
+use namespace::autoclean;
+use Moose::Role;
+use Moose::Autobox;
+use Carp::Clan '^Catalyst::Model::DBIC::Schema';
+
+use Catalyst::Model::DBIC::Schema::Types 'ConnectInfos';
+
+=head1 NAME
+
+Catalyst::TraitFor::Model::DBIC::Schema::Replicated - Replicated storage support for
+L<Catalyst::Model::DBIC::Schema>
+
+=head1 SYNOPSiS
+
+ __PACKAGE__->config({
+ traits => ['Replicated']
+ connect_info =>
+ ['dbi:mysql:master', 'user', 'pass'],
+ replicants => [
+ ['dbi:mysql:slave1', 'user', 'pass'],
+ ['dbi:mysql:slave2', 'user', 'pass'],
+ ['dbi:mysql:slave3', 'user', 'pass'],
+ ],
+ balancer_args => {
+ master_read_weight => 0.3
+ }
+ });
+
+=head1 DESCRIPTION
+
+Sets your storage_type to L<DBIx::Class::Storage::DBI::Replicated> and connects
+replicants provided in config. See that module for supported resultset
+attributes.
+
+The default L<DBIx::Class::Storage::DBI::Replicated/balancer_type> is
+C<::Random>.
+
+Sets the
+L<DBIx::Class::Storage::DBI::Replicated::Balancer::Random/master_read_weight> to
+C<1> by default, meaning that you have the same chance of reading from master as
+you do from replicants. Set to C<0> to turn off reads from master.
+
+=head1 CONFIG PARAMETERS
+
+=head2 replicants
+
+Array of connect_info settings for every replicant.
+
+=cut
+
+has replicants => (
+ is => 'ro', isa => ConnectInfos, coerce => 1, required => 1
+);
+
+after setup => sub {
+ my $self = shift;
+
+# check storage_type compatibility (if configured)
+ if (my $storage_type = $self->storage_type) {
+ my $class = $storage_type =~ /^::/ ?
+ "DBIx::Class::Storage$storage_type"
+ : $storage_type;
+
+ croak "This storage_type cannot be used with replication"
+ unless $class->isa('DBIx::Class::Storage::DBI::Replicated');
+ } else {
+ $self->storage_type('::DBI::Replicated');
+ }
+
+ $self->connect_info->{balancer_type} ||= '::Random'
+ unless $self->connect_info->{balancer_type};
+
+ unless ($self->connect_info->{balancer_args} &&
+ exists $self->connect_info->{balancer_args}{master_read_weight}) {
+ $self->connect_info->{balancer_args}{master_read_weight} = 1;
+ }
+};
+
+sub BUILD {}
+after BUILD => sub {
+ my $self = shift;
+
+ $self->storage->connect_replicants(map [ $_ ], $self->replicants->flatten);
+};
+
+=head1 SEE ALSO
+
+L<Catalyst::Model::DBIC::Schema>, L<DBIx::Class>,
+L<DBIx::Class::Storage::DBI::Replicated>,
+L<Cache::FastMmap>, L<DBIx::Class::Cursor::Cached>
+
+=head1 AUTHOR
+
+Rafael Kitover, C<rkitover at cpan.org>
+
+=head1 COPYRIGHT
+
+This program is free software, you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
+1;
More information about the Catalyst-commits
mailing list