Start setting the 'c3' mro unambiguously everywhere
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / AccessorGroup.pm
index dd99da3..12a8744 100644 (file)
@@ -3,174 +3,68 @@ package DBIx::Class::AccessorGroup;
 use strict;
 use warnings;
 
-use Carp::Clan qw/^DBIx::Class/;
+use base qw/Class::Accessor::Grouped/;
+use Scalar::Util qw/weaken blessed/;
+use namespace::clean;
 
-=head1 NAME 
-
-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);
+sub mk_classdata {
+  shift->mk_classaccessor(@_);
 }
 
-
-{
-    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_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]);
+  $self->set_inherited(@_) if @_ > 1;
 }
 
-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) = @_;
-
-    my $set = "set_$group";
-    my $get = "get_$group";
+sub get_component_class {
+  my $class = $_[0]->get_inherited($_[1]);
 
-    # Build a closure around $field.
-    return sub {
-        my $self = shift;
+  # It's already an object, just go for it.
+  return $class if blessed $class;
 
-        if(@_) {
-            return $self->$set($field, @_);
-        }
-        else {
-            return $self->$get($field);
-        }
-    };
-}
+  if (defined $class and ! $successfully_loaded_components->{$class} ) {
+    $_[0]->ensure_class_loaded($class);
 
-sub make_group_ro_accessor {
-    my($class, $group, $field) = @_;
+    mro::set_mro( $class, 'c3' );
 
-    my $get = "get_$group";
+    no strict 'refs';
+    $successfully_loaded_components->{$class}
+      = ${"${class}::__LOADED__BY__DBIC__CAG__COMPONENT_CLASS__"}
+        = do { \(my $anon = 'loaded') };
+    weaken($successfully_loaded_components->{$class});
+  }
 
-    return sub {
-        my $self = shift;
+  $class;
+};
 
-        if(@_) {
-            my $caller = caller;
-            croak("'$caller' cannot alter the value of '$field' on ".
-                        "objects of class '$class'");
-        }
-        else {
-            return $self->$get($field);
-        }
-    };
+sub set_component_class {
+  shift->set_inherited(@_);
 }
 
-sub make_group_wo_accessor {
-    my($class, $group, $field) = @_;
-
-    my $set = "set_$group";
-
-    return sub {
-        my $self = shift;
-
-        unless (@_) {
-            my $caller = caller;
-            croak("'$caller' cannot access the value of '$field' on ".
-                        "objects of class '$class'");
-        }
-        else {
-            return $self->$set($field, @_);
-        }
-    };
-}
+1;
 
-sub get_simple {
-  my ($self, $get) = @_;
-  return $self->{$get};
-}
+=head1 NAME
 
-sub set_simple {
-  my ($self, $set, $val) = @_;
-  return $self->{$set} = $val;
-}
+DBIx::Class::AccessorGroup - See Class::Accessor::Grouped
 
-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 <mst@shadowcatsystems.co.uk>
+Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
 
-=head1 LICENSE
+=head1 COPYRIGHT AND LICENSE
 
-You may distribute this code under the same terms as Perl itself.
+This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
+by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
+redistribute it and/or modify it under the same terms as the
+L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.
 
 =cut
-