X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FAccessorGroup.pm;h=77cf85255f2f50c5d3d0044bd474a85a0bcb1e29;hb=7648acb5dd1f2f281ca84e2152efe314bcbf2c70;hp=51dd7bc223b2accac6049f758818e8cd0841ad3f;hpb=fe5d862bdaa631796cb26e5fea232a81458e68f8;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/AccessorGroup.pm b/lib/DBIx/Class/AccessorGroup.pm index 51dd7bc..77cf852 100644 --- a/lib/DBIx/Class/AccessorGroup.pm +++ b/lib/DBIx/Class/AccessorGroup.pm @@ -1,110 +1,81 @@ package DBIx::Class::AccessorGroup; -sub mk_group_accessors { - my($self, $group, @fields) = @_; +use strict; +use warnings; - $self->_mk_group_accessors('make_group_accessor', $group, @fields); -} - - -{ - no strict 'refs'; - - sub _mk_group_accessors { - my($self, $maker, $group, @fields) = @_; - my $class = ref $self || $self; +use base qw( DBIx::Class::MethodAttributes Class::Accessor::Grouped ); - # So we don't have to do lots of lookups inside the loop. - $maker = $self->can($maker) unless ref $maker; +use Scalar::Util 'blessed'; +use DBIx::Class::_Util 'fail_on_internal_call'; +use namespace::clean; - foreach my $field (@fields) { - if( $field eq 'DESTROY' ) { - require Carp; - &Carp::carp("Having a data accessor named DESTROY in ". - "'$class' is unwise."); - } - - my $accessor = $self->$maker($group, $field); - my $alias = "_${field}_accessor"; - - *{$class."\:\:$field"} = $accessor - unless defined &{$class."\:\:$field"}; - - *{$class."\:\:$alias"} = $accessor - unless defined &{$class."\:\:$alias"}; - } - } +sub mk_classdata { + DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call; + shift->mk_classaccessor(@_); } -sub mk_group_ro_accessors { - my($self, $group, @fields) = @_; - - $self->_mk_group_accessors('make_group_ro_accessor', $group, @fields); +sub mk_classaccessor { + my $self = shift; + $self->mk_group_accessors('inherited', $_[0]); + (@_ > 1) + ? $self->set_inherited(@_) + : ( DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call ) + ; } -sub mk_group_wo_accessors { - my($self, $group, @fields) = @_; - - $self->_mk_group_accessors('make_group_wo_accessor', $group, @fields); +sub get_component_class { + my $class = $_[0]->get_inherited($_[1]); + + no strict 'refs'; + if ( + defined $class + and + # inherited CAG can't be set to undef effectively, so people may use '' + length $class + and + # It's already an object, just go for it. + ! defined blessed $class + and + ! ${"${class}::__LOADED__BY__DBIC__CAG__COMPONENT_CLASS__"} + ) { + $_[0]->ensure_class_loaded($class); + + ${"${class}::__LOADED__BY__DBIC__CAG__COMPONENT_CLASS__"} + = do { \(my $anon = 'loaded') }; + } + + $class; +}; + +sub set_component_class { + $_[0]->set_inherited($_[1], $_[2]); + + # trigger a load for the case of $foo->component_accessor("bar")->new + $_[0]->get_component_class($_[1]) + if defined wantarray; } -sub make_group_accessor { - my ($class, $group, $field) = @_; - - my $set = "set_$group"; - my $get = "get_$group"; - - # Build a closure around $field. - return sub { - my $self = shift; +1; - if(@_) { - return $self->set($field, @_); - } - else { - return $self->get($field); - } - }; -} +=head1 NAME -sub make_group_ro_accessor { - my($class, $group, $field) = @_; +DBIx::Class::AccessorGroup - See Class::Accessor::Grouped - my $get = "get_$group"; +=head1 SYNOPSIS - return sub { - my $self = shift; +=head1 DESCRIPTION - if(@_) { - my $caller = caller; - require Carp; - Carp::croak("'$caller' cannot alter the value of '$field' on ". - "objects of class '$class'"); - } - else { - return $self->get($field); - } - }; -} +This class now exists in its own right on CPAN as Class::Accessor::Grouped -sub make_group_wo_accessor { - my($class, $group, $field) = @_; +=head1 FURTHER QUESTIONS? - my $set = "set_$group"; +Check the list of L. - return sub { - my $self = shift; +=head1 COPYRIGHT AND LICENSE - unless (@_) { - my $caller = caller; - require Carp; - Carp::croak("'$caller' cannot access the value of '$field' on ". - "objects of class '$class'"); - } - else { - return $self->set($field, @_); - } - }; -} +This module is free software L +by the L. You can +redistribute it and/or modify it under the same terms as the +L. -1; +=cut