X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema%2FLoader%2FBase.pm;h=ee75f062ed1141a4f2799b895316a2eeb20eea9d;hb=aa0867ee7faa8246a6552861b61bea59c6483487;hp=24826f3b73c00fae44282cf8d5d77be4d4c8d705;hpb=7d0ea6b94e009f9d2a325f968a067357fb0b820c;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 24826f3..ee75f06 100644 --- a/lib/DBIx/Class/Schema/Loader/Base.pm +++ b/lib/DBIx/Class/Schema/Loader/Base.pm @@ -3,7 +3,6 @@ package DBIx::Class::Schema::Loader::Base; use strict; use warnings; use base qw/Class::Accessor::Grouped Class::C3::Componentised/; -use namespace::autoclean; use Class::C3; use Carp::Clan qw/^DBIx::Class/; use DBIx::Class::Schema::Loader::RelBuilder; @@ -21,7 +20,10 @@ use Data::Dumper::Concise; use Scalar::Util 'looks_like_number'; use File::Slurp 'slurp'; use DBIx::Class::Schema::Loader::Utils 'split_name'; -require DBIx::Class; +use DBIx::Class::Schema::Loader::Optional::Dependencies (); +use Try::Tiny; +use DBIx::Class (); +use namespace::clean; our $VERSION = '0.07001'; @@ -258,10 +260,10 @@ relationship types override those set in 'all'. For example: relationship_attrs => { - belongs_to => { is_deferrable => 1 }, + belongs_to => { is_deferrable => 0 }, }, -use this to make your foreign key constraints DEFERRABLE. +use this to turn off DEFERRABLE on your foreign key constraints. =head2 debug @@ -476,8 +478,8 @@ __PACKAGE__->table >> calls, and to some other things like Oracle sequences. =head2 use_moose Creates Schema and Result classes that use L, L and -L. The default custom content also makes the classes -immutable. +L. The default content after the md5 sum also makes the +classes immutable. It is safe to upgrade your existing Schema to this option. @@ -544,15 +546,10 @@ sub new { $self->_validate_class_args; if ($self->use_moose) { - eval <<'EOF'; -package __DBICSL__DUMMY; -use Moose; -use MooseX::NonMoose; -use namespace::autoclean; -EOF - if ($@) { - die sprintf "You must install the following CPAN modules to enable the use_moose option: %s.\n", - "Moose, MooseX::NonMoose and namespace::autoclean"; + if (not DBIx::Class::Schema::Loader::Optional::Dependencies->req_ok_for('use_moose')) { + die sprintf "You must install the following CPAN modules to enable the use_moose option: %s.\nYou are missing: %s.\n", + "Moose, MooseX::NonMoose and namespace::autoclean", + DBIx::Class::Schema::Loader::Optional::Dependencies->req_missing_for('use_moose'); } } @@ -1108,7 +1105,7 @@ sub _reload_classes { local *Class::C3::reinitialize = sub {}; use warnings; - if ($class->can('meta')) { + if ($class->can('meta') && try { (ref $class->meta)->isa('Moose::Meta::Class') }) { $class->meta->make_mutable; } Class::Unload->unload($class) if $unload; @@ -1119,7 +1116,7 @@ sub _reload_classes { && ($resultset_class ne 'DBIx::Class::ResultSet') ) { my $has_file = Class::Inspector->loaded_filename($resultset_class); - if ($resultset_class->can('meta')) { + if ($resultset_class->can('meta') && try { (ref $resultset_class->meta)->isa('Moose::Meta::Class') }) { $resultset_class->meta->make_mutable; } Class::Unload->unload($resultset_class) if $unload; @@ -1234,7 +1231,15 @@ sub _dump_to_dir { . qq|# DO NOT MODIFY THE FIRST PART OF THIS FILE\n\n| . qq|use strict;\nuse warnings;\n\n|; if ($self->use_moose) { - $src_text.= qq|use Moose;\nuse MooseX::NonMoose;\nuse namespace::autoclean;\nextends '$result_base_class';\n\n|; + $src_text.= qq|use Moose;\nuse MooseX::NonMoose;\nuse namespace::autoclean;|; + + # these options 'use base' which is compile time + if (@{ $self->left_base_classes } || @{ $self->additional_base_classes }) { + $src_text .= qq|\nBEGIN { extends '$result_base_class' }\n\n|; + } + else { + $src_text .= qq|\nextends '$result_base_class';\n\n|; + } } else { $src_text .= qq|use base '$result_base_class';\n\n|; @@ -1432,11 +1437,13 @@ sub _use { sub _inject { my $self = shift; my $target = shift; - my $schema_class = $self->schema_class; my $blist = join(q{ }, @_); - warn "$target: use base qw/ $blist /;" if $self->debug && @_; - $self->_raw_stmt($target, "use base qw/ $blist /;") if @_; + + return unless $blist; + + warn "$target: use base qw/$blist/;" if $self->debug; + $self->_raw_stmt($target, "use base qw/$blist/;"); } sub _result_namespace { @@ -1530,7 +1537,7 @@ sub _resolve_col_accessor_collisions { my @methods; - for my $class ($base, @components) { + for my $class ($base, @components, $self->use_moose ? 'Moose::Object' : ()) { eval "require ${class};"; die $@ if $@; @@ -1540,6 +1547,9 @@ sub _resolve_col_accessor_collisions { my %methods; @methods{@methods} = (); + # futureproof meta + $methods{meta} = undef; + while (my ($col, $info) = each %$col_info) { my $accessor = $info->{accessor} || $col; @@ -1785,12 +1795,10 @@ sub _make_pod { my ($table) = @_; my $pcm = $self->pod_comment_mode; my ($comment, $comment_overflows, $comment_in_name, $comment_in_desc); - if ( $self->can('_table_comment') ) { - $comment = $self->_table_comment($table); - $comment_overflows = ($comment and length $comment > $self->pod_comment_spillover_length); - $comment_in_name = ($pcm eq 'name' or ($pcm eq 'auto' and !$comment_overflows)); - $comment_in_desc = ($pcm eq 'description' or ($pcm eq 'auto' and $comment_overflows)); - } + $comment = $self->__table_comment($table); + $comment_overflows = ($comment and length $comment > $self->pod_comment_spillover_length); + $comment_in_name = ($pcm eq 'name' or ($pcm eq 'auto' and !$comment_overflows)); + $comment_in_desc = ($pcm eq 'description' or ($pcm eq 'auto' and $comment_overflows)); $self->_pod( $class, "=head1 NAME" ); my $table_descr = $class; $table_descr .= " - " . $comment if $comment and $comment_in_name; @@ -1828,9 +1836,7 @@ sub _make_pod { } sort keys %$attrs, ); - if( $self->can('_column_comment') - and my $comment = $self->_column_comment( $self->{_class2table}{$class}, $col_counter) - ) { + if (my $comment = $self->__column_comment($self->{_class2table}{$class}, $col_counter)) { $self->_pod( $class, $comment ); } } @@ -1846,6 +1852,36 @@ sub _make_pod { } } +sub _filter_comment { + my ($self, $txt) = @_; + + $txt = '' if not defined $txt; + + $txt =~ s/(?:\015?\012|\015\012?)/\n/g; + + return $txt; +} + +sub __table_comment { + my $self = shift; + + if (my $code = $self->can('_table_comment')) { + return $self->_filter_comment($self->$code(@_)); + } + + return ''; +} + +sub __column_comment { + my $self = shift; + + if (my $code = $self->can('_column_comment')) { + return $self->_filter_comment($self->$code(@_)); + } + + return ''; +} + # Stores a POD documentation sub _pod { my ($self, $class, $stmt) = @_;