use Lingua::EN::Inflect::Number qw//;
use File::Temp qw//;
use Class::Unload;
+use Class::Inspector ();
require DBIx::Class;
-our $VERSION = '0.04999_14';
+our $VERSION = '0.05002';
__PACKAGE__->mk_group_ro_accessors('simple', qw/
schema
skip_relationships
skip_load_external
moniker_map
+ custom_column_info
inflect_singular
inflect_plural
debug
=head2 pod_comment_mode
-Controls where table comments appear in the generated POD. By default table
-comments are appended to the C<NAME> section of the documentation. You can
-force a C<DESCRIPTION> section to be generated with the comment instead, or
-choose the length threshold at which the comment is forced into the
-description.
+Controls where table comments appear in the generated POD. Smaller table
+comments are appended to the C<NAME> section of the documentation, and larger
+ones are inserted into C<DESCRIPTION> instead. You can force a C<DESCRIPTION>
+section to be generated with the comment always, only use C<NAME>, or choose
+the length threshold at which the comment is forced into the description.
- pod_comment_mode => 'name' # default behaviour
- pod_comment_mode => 'description' # force creation of DESCRIPTION section
- pod_comment_mode => 'auto' # use description if length > pod_comment_spillover_length
+=over 4
+
+=item name
+
+Use C<NAME> section only.
+
+=item description
+
+Force C<DESCRIPTION> always.
+
+=item auto
+
+Use C<DESCRIPTION> if length > L</pod_comment_spillover_length>, this is the
+default.
+
+=back
=head2 pod_comment_spillover_length
Again, you should be using version control on your schema classes. Be
careful with this option.
+=head2 custom_column_info
+
+Must be a coderef, returing a hashref with the custom column informations.
+
+Example:
+
+ sub _custom_column_info {
+ my $info = shift;
+
+ if ( $info->{TYPE_NAME} eq 'DATE' ){
+ return { timezone => "Europe/Berlin" };
+ }
+ return;
+ }
+
+Add to all columns with type DATE the attribute timezone => "Europe/Berlin".
+
=head1 METHODS
None of these methods are intended for direct invocation by regular
=cut
-use constant CURRENT_V => 'v5';
+use constant CURRENT_V => 'v5';
+
+use constant CLASS_ARGS => qw(
+ schema_base_class result_base_class additional_base_classes
+ left_base_classes additional_classes components resultset_components
+);
# ensure that a peice of object data is a valid arrayref, creating
# an empty one or encapsulating whatever's there.
resultset_components
/);
+ $self->_validate_class_args;
+
push(@{$self->{components}}, 'ResultSetManager')
if @{$self->{resultset_components}};
close $fh;
}
+sub _validate_class_args {
+ my $self = shift;
+ my $args = shift;
+
+ foreach my $k (CLASS_ARGS) {
+ next unless $self->$k;
+
+ my @classes = ref $self->$k eq 'ARRAY' ? @{ $self->$k } : $self->$k;
+ foreach my $c (@classes) {
+ # components default to being under the DBIx::Class namespace unless they
+ # are preceeded with a '+'
+ if ( $k =~ m/components$/ && $c !~ s/^\+// ) {
+ $c = 'DBIx::Class::' . $c;
+ }
+
+ # 1 == installed, 0 == not installed, undef == invalid classname
+ my $installed = Class::Inspector->installed($c);
+ if ( defined($installed) ) {
+ if ( $installed == 0 ) {
+ croak qq/$c, as specified in the loader option "$k", is not installed/;
+ }
+ } else {
+ croak qq/$c, as specified in the loader option "$k", is an invalid class name/;
+ }
+ }
+ }
+}
+
sub _find_file_in_inc {
my ($self, $file) = @_;
foreach my $prefix (@INC) {
my $fullpath = File::Spec->catfile($prefix, $file);
return $fullpath if -f $fullpath
- and Cwd::abs_path($fullpath) ne
- (Cwd::abs_path(File::Spec->catfile($self->dump_directory, $file)) || '');
+ # abs_path throws on Windows for nonexistant files
+ and eval { Cwd::abs_path($fullpath) } ne
+ (eval { Cwd::abs_path(File::Spec->catfile($self->dump_directory, $file)) } || '');
}
return;
sub _is_case_sensitive { 0 }
+sub _custom_column_info {
+ my ( $self, $info ) = @_;
+
+ if( ref $self->custom_column_info eq 'CODE' ) {
+ return $self->custom_column_info->($info);
+ }
+ return {};
+}
+
# remove the dump dir from @INC on destruction
sub DESTROY {
my $self = shift;