Start setting the 'c3' mro unambiguously everywhere
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / AccessorGroup.pm
index a7e85be..12a8744 100644 (file)
@@ -3,120 +3,68 @@ package DBIx::Class::AccessorGroup;
 use strict;
 use warnings;
 
-use NEXT;
+use base qw/Class::Accessor::Grouped/;
+use Scalar::Util qw/weaken blessed/;
+use namespace::clean;
 
-sub mk_group_accessors {
-    my($self, $group, @fields) = @_;
-
-    $self->_mk_group_accessors('make_group_accessor', $group, @fields);
+sub mk_classdata {
+  shift->mk_classaccessor(@_);
 }
 
+sub mk_classaccessor {
+  my $self = shift;
+  $self->mk_group_accessors('inherited', $_[0]);
+  $self->set_inherited(@_) if @_ > 1;
+}
 
-{
-    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' ) {
-                require Carp;
-                &Carp::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";
+my $successfully_loaded_components;
 
-            #warn "$class $group $field $alias";
+sub get_component_class {
+  my $class = $_[0]->get_inherited($_[1]);
 
-            *{$class."\:\:$name"}  = $accessor;
-              #unless defined &{$class."\:\:$field"}
+  # It's already an object, just go for it.
+  return $class if blessed $class;
 
-            *{$class."\:\:$alias"}  = $accessor;
-              #unless defined &{$class."\:\:$alias"}
-        }
-    }
-}
+  if (defined $class and ! $successfully_loaded_components->{$class} ) {
+    $_[0]->ensure_class_loaded($class);
 
-sub mk_group_ro_accessors {
-    my($self, $group, @fields) = @_;
+    mro::set_mro( $class, 'c3' );
 
-    $self->_mk_group_accessors('make_group_ro_accessor', $group, @fields);
-}
+    no strict 'refs';
+    $successfully_loaded_components->{$class}
+      = ${"${class}::__LOADED__BY__DBIC__CAG__COMPONENT_CLASS__"}
+        = do { \(my $anon = 'loaded') };
+    weaken($successfully_loaded_components->{$class});
+  }
 
-sub mk_group_wo_accessors {
-    my($self, $group, @fields) = @_;
+  $class;
+};
 
-    $self->_mk_group_accessors('make_group_wo_accessor', $group, @fields);
+sub set_component_class {
+  shift->set_inherited(@_);
 }
 
-sub make_group_accessor {
-    my ($class, $group, $field) = @_;
+1;
 
-    my $set = "set_$group";
-    my $get = "get_$group";
+=head1 NAME
 
-    # Build a closure around $field.
-    return sub {
-        my $self = shift;
+DBIx::Class::AccessorGroup - See Class::Accessor::Grouped
 
-        if(@_) {
-            return $self->$set($field, @_);
-        }
-        else {
-            return $self->$get($field);
-        }
-    };
-}
+=head1 SYNOPSIS
 
-sub make_group_ro_accessor {
-    my($class, $group, $field) = @_;
+=head1 DESCRIPTION
 
-    my $get = "get_$group";
+This class now exists in its own right on CPAN as Class::Accessor::Grouped
 
-    return sub {
-        my $self = shift;
+=head1 FURTHER QUESTIONS?
 
-        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);
-        }
-    };
-}
+Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
 
-sub make_group_wo_accessor {
-    my($class, $group, $field) = @_;
+=head1 COPYRIGHT AND LICENSE
 
-    my $set = "set_$group";
+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>.
 
-    return sub {
-        my $self = shift;
-
-        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, @_);
-        }
-    };
-}
-
-1;
+=cut