File Coverage

blib/lib/DBIx/Class/CDBICompat/ColumnsAsHash.pm
Criterion Covered Total %
statement 12 41 29.2
branch 0 10 0.0
condition n/a
subroutine 4 10 40.0
pod 0 2 0.0
total 16 63 25.4


line stmt bran cond sub pod time code
1             package
2             DBIx::Class::CDBICompat::ColumnsAsHash;
3              
4 2     2   1259 use strict;
  2         4  
  2         49  
5 2     2   8 use warnings;
  2         4  
  2         343  
6              
7              
8             =head1 NAME
9              
10             DBIx::Class::CDBICompat::ColumnsAsHash - Emulates the behavior of Class::DBI where the object can be accessed as a hash of columns.
11              
12             =head1 SYNOPSIS
13              
14             See DBIx::Class::CDBICompat for usage directions.
15              
16             =head1 DESCRIPTION
17              
18             Emulates the I<undocumented> behavior of Class::DBI where the object can be accessed as a hash of columns. This is often used as a performance hack.
19              
20             my $column = $result->{column};
21              
22             =head2 Differences from Class::DBI
23              
24             If C<DBIC_CDBICOMPAT_HASH_WARN> is true it will warn when a column is accessed as a hash key.
25              
26             =cut
27              
28             sub new {
29 0     0 0   my $class = shift;
30              
31 0           my $new = $class->next::method(@_);
32              
33 0           $new->_make_columns_as_hash;
34              
35 0           return $new;
36             }
37              
38             sub inflate_result {
39 0     0 0   my $class = shift;
40              
41 0           my $new = $class->next::method(@_);
42              
43 0           $new->_make_columns_as_hash;
44              
45 0           return $new;
46             }
47              
48              
49             sub _make_columns_as_hash {
50 0     0     my $self = shift;
51              
52 0           for my $col ($self->columns) {
53 0 0         if( exists $self->{$col} ) {
54 0           warn "Skipping mapping $col to a hash key because it exists";
55             }
56              
57 0           tie $self->{$col}, 'DBIx::Class::CDBICompat::Tied::ColumnValue',
58             $self, $col;
59             }
60             }
61              
62              
63             package DBIx::Class::CDBICompat::Tied::ColumnValue;
64              
65 2     2   14 use Carp;
  2         3  
  2         122  
66 2     2   12 use Scalar::Util qw(weaken isweak);
  2         4  
  2         539  
67              
68              
69             sub TIESCALAR {
70 0     0     my($class, $obj, $col) = @_;
71 0           my $self = [$obj, $col];
72 0           weaken $self->[0];
73              
74 0           return bless $self, $_[0];
75             }
76              
77             sub FETCH {
78 0     0     my $self = shift;
79 0           my($obj, $col) = @$self;
80              
81 0           my $class = ref $obj;
82 0           my $id = $obj->id;
83             carp "Column '$col' of '$class/$id' was fetched as a hash"
84 0 0         if $ENV{DBIC_CDBICOMPAT_HASH_WARN};
85              
86             return $obj->column_info($col)->{_inflate_info}
87 0 0         ? $obj->get_inflated_column($col)
88             : $obj->get_column($col);
89             }
90              
91             sub STORE {
92 0     0     my $self = shift;
93 0           my($obj, $col) = @$self;
94              
95 0           my $class = ref $obj;
96 0           my $id = $obj->id;
97             carp "Column '$col' of '$class/$id' was stored as a hash"
98 0 0         if $ENV{DBIC_CDBICOMPAT_HASH_WARN};
99              
100             return $obj->column_info($col)->{_inflate_info}
101 0 0         ? $obj->set_inflated_column($col => shift)
102             : $obj->set_column($col => shift);
103             }
104              
105             =head1 FURTHER QUESTIONS?
106              
107             Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
108              
109             =head1 COPYRIGHT AND LICENSE
110              
111             This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
112             by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
113             redistribute it and/or modify it under the same terms as the
114             L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.
115              
116             =cut
117              
118             1;