X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FAccessorGroup.pm;h=77cf85255f2f50c5d3d0044bd474a85a0bcb1e29;hb=4c90556806f286093d0806e858abdba329e6dfd3;hp=c999a6b496c60276eb1b10e52b543b6c59c97fed;hpb=0c11ad0ee5c8407f6b87d6e15c62a1b445076dc0;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/AccessorGroup.pm b/lib/DBIx/Class/AccessorGroup.pm index c999a6b..77cf852 100644 --- a/lib/DBIx/Class/AccessorGroup.pm +++ b/lib/DBIx/Class/AccessorGroup.pm @@ -3,33 +3,56 @@ package DBIx::Class::AccessorGroup; use strict; use warnings; -use base qw/Class::Accessor::Grouped/; -use Scalar::Util qw/weaken blessed/; +use base qw( DBIx::Class::MethodAttributes Class::Accessor::Grouped ); + +use Scalar::Util 'blessed'; +use DBIx::Class::_Util 'fail_on_internal_call'; use namespace::clean; -my $successfully_loaded_components; +sub mk_classdata { + DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call; + shift->mk_classaccessor(@_); +} + +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 get_component_class { my $class = $_[0]->get_inherited($_[1]); - # It's already an object, just go for it. - return $class if blessed $class; - - if (defined $class and ! $successfully_loaded_components->{$class} ) { + 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); - no strict 'refs'; - $successfully_loaded_components->{$class} - = ${"${class}::__LOADED__BY__DBIC__CAG__COMPONENT_CLASS__"} - = do { \(my $anon = 'loaded') }; - weaken($successfully_loaded_components->{$class}); + ${"${class}::__LOADED__BY__DBIC__CAG__COMPONENT_CLASS__"} + = do { \(my $anon = 'loaded') }; } $class; }; sub set_component_class { - shift->set_inherited(@_); + $_[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; } 1; @@ -44,13 +67,15 @@ DBIx::Class::AccessorGroup - See Class::Accessor::Grouped This class now exists in its own right on CPAN as Class::Accessor::Grouped -=head1 AUTHOR AND CONTRIBUTORS +=head1 FURTHER QUESTIONS? -See L and L in DBIx::Class +Check the list of L. -=head1 LICENSE +=head1 COPYRIGHT AND LICENSE -You may distribute this code under the same terms as Perl itself. +This module is free software L +by the L. You can +redistribute it and/or modify it under the same terms as the +L. =cut -