X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FAccessorGroup.pm;h=7c6dece4b3a4946b595d139e75bc07c9806a9c2e;hb=0130575a1a5ad9249a5cdc705c043286fabdf32c;hp=4e42b2777ca2885750a242327badecd4b5d83695;hpb=fc9690056f17278f057021803b1124ebbd5a0d2d;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/AccessorGroup.pm b/lib/DBIx/Class/AccessorGroup.pm index 4e42b27..7c6dece 100644 --- a/lib/DBIx/Class/AccessorGroup.pm +++ b/lib/DBIx/Class/AccessorGroup.pm @@ -3,175 +3,79 @@ package DBIx::Class::AccessorGroup; use strict; use warnings; -use Carp::Clan qw/^DBIx::Class/; +use base qw/Class::Accessor::Grouped/; +use mro 'c3'; -=head1 NAME +use Scalar::Util qw/weaken blessed/; +use DBIx::Class::_Util 'fail_on_internal_call'; +use namespace::clean; -DBIx::Class::AccessorGroup - Lets you build groups of accessors - -=head1 SYNOPSIS - -=head1 DESCRIPTION - -This class lets you build groups of accessors that will call different -getters and setters. - -=head1 METHODS - -=cut - -sub mk_group_accessors { - my($self, $group, @fields) = @_; - - $self->_mk_group_accessors('make_group_accessor', $group, @fields); -} - - -{ - no strict 'refs'; - no warnings 'redefine'; - - sub _mk_group_accessors { - my($self, $maker, $group, @fields) = @_; - my $class = ref $self || $self; - - # So we don't have to do lots of lookups inside the loop. - $maker = $self->can($maker) unless ref $maker; - - foreach my $field (@fields) { - if( $field eq 'DESTROY' ) { - carp("Having a data accessor named DESTROY in ". - "'$class' is unwise."); - } - - my $name = $field; - - ($name, $field) = @$field if ref $field; - - my $accessor = $self->$maker($group, $field); - my $alias = "_${name}_accessor"; - - #warn "$class $group $field $alias"; - - *{$class."\:\:$name"} = $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) = @_; +my $successfully_loaded_components; - $self->_mk_group_accessors('make_group_wo_accessor', $group, @fields); -} - -sub make_group_accessor { - my ($class, $group, $field) = @_; +sub get_component_class { + my $class = $_[0]->get_inherited($_[1]); - my $set = "set_$group"; - my $get = "get_$group"; + # It's already an object, just go for it. + return $class if blessed $class; - # Build a closure around $field. - return sub { - my $self = shift; + if (defined $class and ! $successfully_loaded_components->{$class} ) { + $_[0]->ensure_class_loaded($class); - if(@_) { - return $self->$set($field, @_); - } - else { - return $self->$get($field); - } - }; -} + mro::set_mro( $class, 'c3' ); -sub make_group_ro_accessor { - my($class, $group, $field) = @_; + no strict 'refs'; + $successfully_loaded_components->{$class} + = ${"${class}::__LOADED__BY__DBIC__CAG__COMPONENT_CLASS__"} + = do { \(my $anon = 'loaded') }; + weaken($successfully_loaded_components->{$class}); + } - my $get = "get_$group"; + $class; +}; - return sub { - my $self = shift; +sub set_component_class { + $_[0]->set_inherited($_[1], $_[2]); - if(@_) { - my $caller = caller; - croak("'$caller' cannot alter the value of '$field' on ". - "objects of class '$class'"); - } - else { - return $self->$get($field); - } - }; + # trigger a load for the case of $foo->component_accessor("bar")->new + $_[0]->get_component_class($_[1]) + if defined wantarray; } -sub make_group_wo_accessor { - my($class, $group, $field) = @_; - - my $set = "set_$group"; - - return sub { - my $self = shift; +1; - unless (@_) { - my $caller = caller; - require Carp; - croak("'$caller' cannot access the value of '$field' on ". - "objects of class '$class'"); - } - else { - return $self->$set($field, @_); - } - }; -} +=head1 NAME -sub get_simple { - my ($self, $get) = @_; - return $self->{$get}; -} +DBIx::Class::AccessorGroup - See Class::Accessor::Grouped -sub set_simple { - my ($self, $set, $val) = @_; - return $self->{$set} = $val; -} - -sub get_component_class { - my ($self, $get) = @_; - if (ref $self) { - return $self->{$get}; - } else { - $get = "_$get"; - return $self->can($get) ? $self->$get : undef; - } -} +=head1 SYNOPSIS -sub set_component_class { - my ($self, $set, $val) = @_; - eval "require $val"; - if (ref $self) { - return $self->{$set} = $val; - } else { - $set = "_$set"; - return $self->can($set) ? $self->$set($val) : $self->mk_classdata($set => $val); - } -} +=head1 DESCRIPTION -1; +This class now exists in its own right on CPAN as Class::Accessor::Grouped -=head1 AUTHORS +=head1 FURTHER QUESTIONS? -Matt S. Trout +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 -