X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema%2FLoader%2FBase.pm;h=e715268d2452ae7149c2a2c3541fbe26f1ee2038;hb=refs%2Ftags%2F0.05003;hp=45fe926399beb03bdf88aebde2fcb1530f4ec760;hpb=83b38372e2c0578e0bf793638863984151f046bb;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/lib/DBIx/Class/Schema/Loader/Base.pm b/lib/DBIx/Class/Schema/Loader/Base.pm index 45fe926..e715268 100644 --- a/lib/DBIx/Class/Schema/Loader/Base.pm +++ b/lib/DBIx/Class/Schema/Loader/Base.pm @@ -17,7 +17,7 @@ use Class::Unload; use Class::Inspector (); require DBIx::Class; -our $VERSION = '0.05002'; +our $VERSION = '0.05003'; __PACKAGE__->mk_group_ro_accessors('simple', qw/ schema @@ -33,6 +33,7 @@ __PACKAGE__->mk_group_ro_accessors('simple', qw/ skip_relationships skip_load_external moniker_map + custom_column_info inflect_singular inflect_plural debug @@ -54,6 +55,8 @@ __PACKAGE__->mk_group_ro_accessors('simple', qw/ monikers dynamic naming + datetime_timezone + datetime_locale /); @@ -379,11 +382,43 @@ made to Loader-generated code. Again, you should be using version control on your schema classes. Be careful with this option. +=head2 custom_column_info + +Hook for adding extra attributes to the +L for a column. + +Must be a coderef that returns a hashref with the extra attributes. + +Receives the table name, column name and column_info. + +For example: + + 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 on a non-datetime +column so it also receives the L and/or L. + +=head2 datetime_timezone + +Sets the timezone attribute for L for all +columns with the DATE/DATETIME/TIMESTAMP data_types. + +=head2 datetime_locale + +Sets the locale attribute for L 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. Anything you can find here -can also be found via standard L methods somehow. +users of L. Some are proxied via +L. =cut @@ -469,6 +504,10 @@ sub new { } $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; @@ -1312,7 +1351,7 @@ sub _setup_src_meta { 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); } @@ -1356,6 +1395,21 @@ sub _setup_src_meta { } +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 @@ -1494,9 +1548,11 @@ sub _make_pod { $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, @@ -1559,6 +1615,27 @@ sub _quote_table_name { sub _is_case_sensitive { 0 } +sub _custom_column_info { + my ( $self, $table_name, $column_name, $column_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;