PK::Auto doc patch from dwc
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / PK / Auto.pm
1 package DBIx::Class::PK::Auto;
2
3 #use base qw/DBIx::Class::PK/;
4 use base qw/DBIx::Class/;
5 use strict;
6 use warnings;
7
8 =head1 NAME 
9
10 DBIx::Class::PK::Auto - Automatic Primary Key class
11
12 =head1 SYNOPSIS
13
14     # In your table classes (replace PK::Auto::SQLite with your
15     # database)
16     __PACKAGE__->load_components(qw/PK::Auto::SQLite Core/);
17     __PACKAGE__->set_primary_key('id');
18
19 =head1 DESCRIPTION
20
21 This class overrides the insert method to get automatically
22 incremented primary keys.
23
24 You don't want to be using this directly - instead load the
25 appropriate one for your database, e.g. C<PK::Auto::SQLite>, before
26 C<Core>.
27
28 =head1 LOGIC
29
30 PK::Auto does this by letting the database assign the primary key
31 field and fetching the assigned value afterwards.
32
33 =head1 METHODS
34
35 =head2 insert
36
37 Overrides insert so that it will get the value of autoincremented
38 primary keys.
39
40 =cut
41
42 sub insert {
43   my ($self, @rest) = @_;
44   my $ret = $self->next::method(@rest);
45
46   # if all primaries are already populated, skip auto-inc
47   my $populated = 0;
48   map { $populated++ if defined $self->get_column($_) } $self->primary_columns;
49   return $ret if ( $populated == scalar $self->primary_columns );
50
51   my ($pri, $too_many) =
52     (grep { $self->column_info($_)->{'auto_increment'} }
53        $self->primary_columns)
54     || $self->primary_columns;
55   $self->throw( "More than one possible key found for auto-inc on ".ref $self )
56     if $too_many;
57   unless (defined $self->get_column($pri)) {
58     $self->throw( "Can't auto-inc for $pri on ".ref $self.": no _last_insert_id method" )
59       unless $self->can('last_insert_id');
60     my $id = $self->last_insert_id;
61     $self->throw( "Can't get last insert id" ) unless $id;
62     $self->store_column($pri => $id);
63   }
64   return $ret;
65 }
66
67 =head2 sequence
68
69 Manually define the correct sequence for your table, to avoid the overhead
70 associated with looking up the sequence automatically.
71
72 =cut
73
74 __PACKAGE__->mk_classdata('sequence');
75
76 1;
77
78 =head1 AUTHORS
79
80 Matt S. Trout <mst@shadowcatsystems.co.uk>
81
82 =head1 LICENSE
83
84 You may distribute this code under the same terms as Perl itself.
85
86 =cut
87