X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FCDBICompat%2FRelationships.pm;h=0a4b4755db0090e1d8448d804f8a445511ca34a3;hb=c959e8d06362537fbc865d703786b399d0806212;hp=559a624496a7a3253f3dc868ab0c785e2caba24c;hpb=a9c8094b88e8802b1508c46512ded65fe8cdc16f;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/CDBICompat/Relationships.pm b/lib/DBIx/Class/CDBICompat/Relationships.pm index 559a624..0a4b475 100644 --- a/lib/DBIx/Class/CDBICompat/Relationships.pm +++ b/lib/DBIx/Class/CDBICompat/Relationships.pm @@ -23,11 +23,22 @@ Emulate C, C, C and C. =cut sub has_a { + my($self, $col, @rest) = @_; + + $self->_declare_has_a($col, @rest); + $self->_mk_inflated_column_accessor($col); + + return 1; +} + + +sub _declare_has_a { my ($self, $col, $f_class, %args) = @_; - $self->throw_exception( "No such column ${col}" ) unless $self->has_column($col); + $self->throw_exception( "No such column ${col}" ) + unless $self->has_column($col); $self->ensure_class_loaded($f_class); - my $rel; + my $rel_info; if ($args{'inflate'} || $args{'deflate'}) { # Non-database has_a if (!ref $args{'inflate'}) { @@ -40,23 +51,30 @@ sub has_a { } $self->inflate_column($col, \%args); - $rel = { + $rel_info = { class => $f_class }; } else { $self->belongs_to($col, $f_class); - $rel = $self->result_source_instance->relationship_info($col); + $rel_info = $self->result_source_instance->relationship_info($col); } + $rel_info->{args} = \%args; + $self->_extend_meta( has_a => $col, - $rel + $rel_info ); - + return 1; } +sub _mk_inflated_column_accessor { + my($class, $col) = @_; + + return $class->mk_group_accessors('inflated_column' => $col); +} sub has_many { my ($class, $rel, $f_class, $f_key, $args) = @_; @@ -70,11 +88,19 @@ sub has_many { if (ref $f_key eq 'HASH' && !$args) { $args = $f_key; undef $f_key; }; $args ||= {}; - if (delete $args->{no_cascade_delete}) { + my $cascade = delete $args->{cascade} || ''; + if (delete $args->{no_cascade_delete} || $cascade eq 'None') { $args->{cascade_delete} = 0; } + elsif( $cascade eq 'Delete' ) { + $args->{cascade_delete} = 1; + } + elsif( length $cascade ) { + warn "Unemulated cascade option '$cascade' in $class->has_many($rel => $f_class)"; + } if( !$f_key and !@f_method ) { + $class->ensure_class_loaded($f_class); my $f_source = $f_class->result_source_instance; ($f_key) = grep { $f_source->relationship_info($_)->{class} eq $class } $f_source->relationships; @@ -82,9 +108,14 @@ sub has_many { $class->next::method($rel, $f_class, $f_key, $args); + my $rel_info = $class->result_source_instance->relationship_info($rel); + $args->{mapping} = \@f_method; + $args->{foreign_key} = $f_key; + $rel_info->{args} = $args; + $class->_extend_meta( has_many => $rel, - $class->result_source_instance->relationship_info($rel) + $rel_info ); if (@f_method) { @@ -113,10 +144,13 @@ sub might_have { $ret = $class->next::method($rel, $f_class, undef, { proxy => \@columns }); } - + + my $rel_info = $class->result_source_instance->relationship_info($rel); + $rel_info->{args}{import} = \@columns; + $class->_extend_meta( might_have => $rel, - $class->result_source_instance->relationship_info($rel) + $rel_info ); return $ret; @@ -135,6 +169,7 @@ sub _extend_meta { $class->__meta_info(\%hash); } + sub meta_info { my ($class, $type, $rel) = @_; my $meta = $class->__meta_info;