use Class::Inspector ();
require DBIx::Class;
-our $VERSION = '0.05002';
+our $VERSION = '0.05003';
__PACKAGE__->mk_group_ro_accessors('simple', qw/
schema
monikers
dynamic
naming
+ datetime_timezone
+ datetime_locale
/);
=head2 custom_column_info
-Must be a coderef, returing a hashref with the custom column informations.
+Hook for adding extra attributes to the
+L<column_info|DBIx::Class::ResultSource/column_info> for a column.
-Example:
+Must be a coderef that returns a hashref with the extra attributes.
- custom_column_info => sub {
- my $info = shift;
+Receives the table name, column name and column_info.
- if ( $info->{TYPE_NAME} eq 'DATE' ){
- return { timezone => "Europe/Berlin" };
- }
- return;
- }
+For example:
-Add to all columns with type DATE the attribute timezone => "Europe/Berlin".
+ custom_column_info => sub {
+ my ($table_name, $column_name, $column_info) = @_;
+
+ if ($column_name eq 'dog' && $column_info->{default_value} eq 'snoopy') {
+ return { is_snoopy => 1 };
+ }
+ },
+
+This attribute can also be used to set C<inflate_datetime> on a non-datetime
+column so it also receives the L</datetime_timezone> and/or L</datetime_locale>.
+
+=head2 datetime_timezone
+
+Sets the timezone attribute for L<DBIx::Class::InflateColumn::DateTime> for all
+columns with the DATE/DATETIME/TIMESTAMP data_types.
+
+=head2 datetime_locale
+
+Sets the locale attribute for L<DBIx::Class::InflateColumn::DateTime> for all
+columns with the DATE/DATETIME/TIMESTAMP data_types.
=head1 METHODS
None of these methods are intended for direct invocation by regular
-users of L<DBIx::Class::Schema::Loader>. Anything you can find here
-can also be found via standard L<DBIx::Class::Schema> methods somehow.
+users of L<DBIx::Class::Schema::Loader>. Some are proxied via
+L<DBIx::Class::Schema::Loader>.
=cut
}
$self->{naming} ||= {};
+ if ($self->custom_column_info && ref $self->custom_column_info ne 'CODE') {
+ croak 'custom_column_info must be a CODE ref';
+ }
+
$self->_check_back_compat;
$self->use_namespaces(1) unless defined $self->use_namespaces;
my $cols = $self->_table_columns($table);
my $col_info;
- eval { $col_info = $self->_columns_info_for($table) };
+ eval { $col_info = $self->__columns_info_for($table) };
if($@) {
$self->_dbic_stmt($table_class,'add_columns',@$cols);
}
}
+sub __columns_info_for {
+ my ($self, $table) = @_;
+
+ my $result = $self->_columns_info_for($table);
+
+ while (my ($col, $info) = each %$result) {
+ $info = { %$info, %{ $self->_custom_column_info ($table, $col, $info) } };
+ $info = { %$info, %{ $self->_datetime_column_info($table, $col, $info) } };
+
+ $result->{$col} = $info;
+ }
+
+ return $result;
+}
+
=head2 tables
Returns a sorted list of loaded tables, using the original database table
$self->_pod( $class,
join "\n", map {
my $s = $attrs->{$_};
- $s = !defined $s ? 'undef' :
- length($s) == 0 ? '(empty string)' :
- $s;
+ $s = !defined $s ? 'undef' :
+ length($s) == 0 ? '(empty string)' :
+ ref($s) eq 'SCALAR' ? $$s :
+ $s
+ ;
" $_: $s"
} sort keys %$attrs,
sub _is_case_sensitive { 0 }
sub _custom_column_info {
- my ( $self, $info ) = @_;
+ my ( $self, $table_name, $column_name, $column_info ) = @_;
- if( ref $self->custom_column_info eq 'CODE' ) {
- return $self->custom_column_info->($info);
+ if (my $code = $self->custom_column_info) {
+ return $code->($table_name, $column_name, $column_info) || {};
}
return {};
}
+sub _datetime_column_info {
+ my ( $self, $table_name, $column_name, $column_info ) = @_;
+ my $result = {};
+ my $type = $column_info->{data_type} || '';
+ if ((grep $_, @{ $column_info }{map "inflate_$_", qw/date datetime timestamp/})
+ or ($type =~ /date|timestamp/i)) {
+ $result->{timezone} = $self->datetime_timezone if $self->datetime_timezone;
+ $result->{locale} = $self->datetime_locale if $self->datetime_locale;
+ }
+ return $result;
+}
+
# remove the dump dir from @INC on destruction
sub DESTROY {
my $self = shift;