1 package # hide from PAUSE
2 DBIx::Class::CDBICompat::ColumnGroups;
9 use base qw/DBIx::Class::Row/;
11 __PACKAGE__->mk_classdata('_column_groups' => { });
15 my $class = ref $proto || $proto;
16 my $group = shift || "All";
17 $class->_init_result_source_instance();
19 $class->_add_column_group($group => @_) if @_;
20 return $class->all_columns if $group eq "All";
21 return $class->primary_column if $group eq "Primary";
22 return keys %{$class->_column_groups->{$group}};
25 sub _add_column_group {
26 my ($class, $group, @cols) = @_;
27 $class->add_columns(@cols);
28 $class->_register_column_group($group => @cols);
31 sub _register_column_group {
32 my ($class, $group, @cols) = @_;
34 # Must do a complete deep copy else column groups
35 # might accidentally be shared.
36 my $groups = dclone $class->_column_groups;
38 if ($group eq 'Primary') {
39 $class->set_primary_key(@cols);
40 $groups->{'Essential'}{$_} ||= 1 for @cols;
43 if ($group eq 'All') {
44 unless (exists $class->_column_groups->{'Primary'}) {
45 $groups->{'Primary'}{$cols[0]} = 1;
46 $class->set_primary_key($cols[0]);
48 unless (exists $class->_column_groups->{'Essential'}) {
49 $groups->{'Essential'}{$cols[0]} = 1;
53 $groups->{$group}{$_} ||= 1 for @cols;
55 $class->_column_groups($groups);
58 sub all_columns { return shift->result_source_instance->columns; }
62 my @pri = $class->primary_columns;
63 return wantarray ? @pri : $pri[0];
67 my ($class, $col) = @_;
68 return $col if $class->has_column($col);
73 my $grouper = { class => $class };
74 return bless($grouper, 'DBIx::Class::CDBICompat::ColumnGroups::GrouperShim');
78 my ($class, @col) = @_;
79 return map { $class->find_column($_) } @col;
82 package DBIx::Class::CDBICompat::ColumnGroups::GrouperShim;
85 my ($self, @cols) = @_;
87 foreach my $col (@cols) {
88 foreach my $group (keys %{$self->{class}->_column_groups}) {
89 $groups{$group} = 1 if $self->{class}->_column_groups->{$group}->{$col};