Commit | Line | Data |
75d07914 |
1 | package # hide from PAUSE |
c0e7b4e5 |
2 | DBIx::Class::CDBICompat::TempColumns; |
a1373054 |
3 | |
4 | use strict; |
5 | use warnings; |
5e0eea35 |
6 | use base 'DBIx::Class'; |
a1373054 |
7 | |
a6c52738 |
8 | use Carp; |
51ec0382 |
9 | use namespace::clean; |
a6c52738 |
10 | |
a1373054 |
11 | __PACKAGE__->mk_classdata('_temp_columns' => { }); |
12 | |
13 | sub _add_column_group { |
14 | my ($class, $group, @cols) = @_; |
d4daee7b |
15 | |
a6c52738 |
16 | return $class->next::method($group, @cols) unless $group eq 'TEMP'; |
17 | |
18 | my %new_cols = map { $_ => 1 } @cols; |
19 | my %tmp_cols = %{$class->_temp_columns}; |
20 | |
21 | for my $existing_col ( grep $new_cols{$_}, $class->columns ) { |
22 | # Already been declared TEMP |
23 | next if $tmp_cols{$existing_col}; |
24 | |
25 | carp "Declaring column $existing_col as TEMP but it already exists"; |
a1373054 |
26 | } |
a6c52738 |
27 | |
28 | $class->_register_column_group($group => @cols); |
29 | $class->mk_group_accessors('temp' => @cols); |
30 | |
31 | $class->_temp_columns({ %tmp_cols, %new_cols }); |
a1373054 |
32 | } |
33 | |
34 | sub new { |
35 | my ($class, $attrs, @rest) = @_; |
e60dc79f |
36 | |
37 | my $temp = $class->_extract_temp_data($attrs); |
38 | |
147dd158 |
39 | my $new = $class->next::method($attrs, @rest); |
e60dc79f |
40 | |
41 | $new->set_temp($_, $temp->{$_}) for keys %$temp; |
42 | |
a1373054 |
43 | return $new; |
44 | } |
45 | |
e60dc79f |
46 | sub _extract_temp_data { |
47 | my($self, $data) = @_; |
48 | |
49 | my %temp; |
50 | foreach my $key (keys %$data) { |
51 | $temp{$key} = delete $data->{$key} if $self->_temp_columns->{$key}; |
52 | } |
53 | |
54 | return \%temp; |
55 | } |
a1373054 |
56 | |
57 | sub find_column { |
58 | my ($class, $col, @rest) = @_; |
59 | return $col if $class->_temp_columns->{$col}; |
147dd158 |
60 | return $class->next::method($col, @rest); |
a1373054 |
61 | } |
62 | |
e60dc79f |
63 | sub set { |
64 | my($self, %data) = @_; |
d4daee7b |
65 | |
e60dc79f |
66 | my $temp_data = $self->_extract_temp_data(\%data); |
d4daee7b |
67 | |
e60dc79f |
68 | $self->set_temp($_, $temp_data->{$_}) for keys %$temp_data; |
d4daee7b |
69 | |
e60dc79f |
70 | return $self->next::method(%data); |
71 | } |
72 | |
a1373054 |
73 | sub get_temp { |
74 | my ($self, $column) = @_; |
701da8c4 |
75 | $self->throw_exception( "Can't fetch data as class method" ) unless ref $self; |
76 | $self->throw_exception( "No such TEMP column '${column}'" ) unless $self->_temp_columns->{$column} ; |
a1373054 |
77 | return $self->{_temp_column_data}{$column} |
78 | if exists $self->{_temp_column_data}{$column}; |
79 | return undef; |
80 | } |
81 | |
82 | sub set_temp { |
83 | my ($self, $column, $value) = @_; |
701da8c4 |
84 | $self->throw_exception( "No such TEMP column '${column}'" ) |
a1373054 |
85 | unless $self->_temp_columns->{$column}; |
701da8c4 |
86 | $self->throw_exception( "set_temp called for ${column} without value" ) |
a1373054 |
87 | if @_ < 3; |
88 | return $self->{_temp_column_data}{$column} = $value; |
89 | } |
90 | |
91 | sub has_real_column { |
103647d5 |
92 | return 1 if shift->has_column(shift); |
a1373054 |
93 | } |
94 | |
95 | 1; |