427ab0101ca15945ab7175962b98d6ee5d82f8d3
[dbsrgits/DBIx-Class-ResultSet-HashRef.git] / lib / DBIx / Class / ResultSet / HashRef.pm
1 package DBIx::Class::ResultSet::HashRef;
2
3 use warnings;
4 use strict;
5 use Carp;
6 use base qw( DBIx::Class::ResultSet );
7 use DBIx::Class::ResultClass::HashRefInflator;
8
9 our $VERSION = '1.002';
10
11 =head1 NAME
12
13 DBIx::Class::ResultSet::HashRef - Adds syntactic sugar to skip the fancy objects
14
15 =head1 SYNOPSIS
16
17     # in your resultsource class
18     __PACKAGE__->resultset_class( 'DBIx::Class::ResultSet::HashRef' );
19     
20     # in your calling code
21     my $rs = $schema->resultset('User')->search( { } )->hashref_rs;
22     while (my $row = $rs->next) {
23         print Dumper $row;
24     }
25     
26     You can chain up every L<DBIx::Class::ResultSet> method to ->hashref_rs:
27     
28     * ->hashref_rs->all (same as ->hashref_array)
29
30     * ->hashref_rs->first (same as ->hashref_first)
31     
32 =head1 DESCRIPTION
33
34 This is a simple way to allow you to set result_class to L<DBIx::Class::ResultClass::HashRefInflator> to
35 skip the fancy objects.
36
37 =head1 INSTALLATION
38
39     perl Makefile.PL
40     make
41     make test
42     make install
43
44 =head1 METHODS
45
46 =head2 hashref_rs( )
47
48 Sets result_class to L<DBIx::Class::ResultClass::HashRefInflator> and returns the resultset.
49
50 =cut
51
52 sub hashref_rs {
53     my ($self) = @_;
54     $self->result_class('DBIx::Class::ResultClass::HashRefInflator');
55     return $self;
56 }
57
58 =head2 hashref_array( )
59
60 Calls ->hashref_rs->all and returns depending on the calling context an array or an reference to an array. 
61
62     my $rs = $schema->resultset('User')->search( { } )->hashref_array;
63     print Dumper $rs;
64
65     my @rs = $schema->resultset('User')->search( { } )->hashref_array;
66     print Dumper @rs;
67
68 =cut
69
70 sub hashref_array {
71     return wantarray ? shift->hashref_rs->all : [ shift->hashref_rs->all ];
72 }
73
74 =head2 hashref_first( )
75
76 Returns the first row of the resultset inflated by L<DBIx::Class::ResultClass::HashRefInflator>.
77
78     my $first_row = $schema->resultset('User')->search( { } )->hashref_first;
79     print Dumper $first_row
80
81 =cut
82
83 sub hashref_first {
84     return shift->hashref_rs->first;
85 }
86
87 =head2 hashref_pk( )
88
89 Calls hashref_array and returns a reference to a hash containing the primary key. For each key the corresponding value is a reference to a hash of the resultset inflated by L<DBIx::Class::ResultClass::HashRefInflator>.
90
91     my $hashref_pk = $schema->resultset('User')->search( { } )->hashref_pk;
92     print Dumper $hashref_pk
93
94 =cut
95
96 sub hashref_pk{
97     my $self = shift;
98     my @primary_columns = $self->result_source->primary_columns;
99     croak "Multi-column primary keys are not supported." if (scalar @primary_columns > 1 );
100     croak "No primary key found." if (scalar @primary_columns == 0 );
101     my $primary_key = shift @primary_columns;
102     my %hash_pk = ();
103     %hash_pk = map { $_->{$primary_key} => $_ } $self->hashref_array;
104     return wantarray ? %hash_pk : \%hash_pk ;
105 }
106
107 =head1 AUTHOR
108
109 Johannes Plunien E<lt>plu@cpan.orgE<gt>
110
111 =head1 CONTRIBUTORS
112
113 Robert Bohne E<lt>rbo@cpan.orgE<gt>
114
115 =head1 COPYRIGHT AND LICENSE
116
117 Copyright 2008 by Johannes Plunien
118
119 This library is free software; you can redistribute it and/or modify
120 it under the same terms as Perl itself.
121
122 Thanks to mst for his patience.
123
124 =head1 SEE ALSO
125
126 =over 4 
127
128 =item * L<DBIx::Class>
129
130 =item * L<DBIx::Class::ResultClass::HashRefInflator>
131
132 =back
133
134 =cut
135
136 1;