X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FCDBICompat%2FRelationships.pm;h=58b29e06cc3a67d9a4158ecc4037404db1ed8125;hb=7f4433eb9bbe0650b4f5e2dff8bf817f4d28d3df;hp=f4109768e3239591ed9462ec7b8262efb8f347ec;hpb=4656f62f9425820ef15c30e2cc6bfb0bff2db423;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/CDBICompat/Relationships.pm b/lib/DBIx/Class/CDBICompat/Relationships.pm index f410976..58b29e0 100644 --- a/lib/DBIx/Class/CDBICompat/Relationships.pm +++ b/lib/DBIx/Class/CDBICompat/Relationships.pm @@ -3,7 +3,7 @@ package # hide from PAUSE use strict; use warnings; - +use Sub::Name (); use base qw/Class::Data::Inheritable/; use Clone; @@ -14,7 +14,7 @@ __PACKAGE__->mk_classdata('__meta_info' => {}); =head1 NAME -DBIx::Class::CDBICompat::Relationships +DBIx::Class::CDBICompat::Relationships - Emulate has_a(), has_many(), might_have() and meta_info() =head1 DESCRIPTION @@ -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'}) { @@ -39,24 +50,31 @@ sub has_a { $args{'deflate'} = sub { shift->$meth; }; } $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) = @_; @@ -90,16 +108,22 @@ 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) { no strict 'refs'; no warnings 'redefine'; my $post_proc = sub { my $o = shift; $o = $o->$_ for @f_method; $o; }; - *{"${class}::${rel}"} = + my $name = join '::', $class, $rel; + *$name = Sub::Name::subname $name, sub { my $rs = shift->search_related($rel => @_); $rs->{attrs}{record_filter} = $post_proc; @@ -113,7 +137,7 @@ sub has_many { sub might_have { my ($class, $rel, $f_class, @columns) = @_; - + my $ret; if (ref $columns[0] || !defined $columns[0]) { $ret = $class->next::method($rel, $f_class, @columns); @@ -121,12 +145,15 @@ 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; }