Replicated - fixup types and namespace::clean
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / Replicated / Balancer / Random.pm
1 package DBIx::Class::Storage::DBI::Replicated::Balancer::Random;
2
3 use Moose;
4 with 'DBIx::Class::Storage::DBI::Replicated::Balancer';
5 use namespace::clean -except => 'meta';
6
7 =head1 NAME
8
9 DBIx::Class::Storage::DBI::Replicated::Balancer::Random - A 'random' Balancer
10
11 =head1 SYNOPSIS
12
13 This class is used internally by L<DBIx::Class::Storage::DBI::Replicated>.  You
14 shouldn't need to create instances of this class.
15     
16 =head1 DESCRIPTION
17
18 Given a pool (L<DBIx::Class::Storage::DBI::Replicated::Pool>) of replicated
19 database's (L<DBIx::Class::Storage::DBI::Replicated::Replicant>), defines a
20 method by which query load can be spread out across each replicant in the pool.
21
22 This Balancer uses L<List::Util> keyword 'shuffle' to randomly pick an active
23 replicant from the associated pool.  This may or may not be random enough for
24 you, patches welcome.
25
26 =head1 ATTRIBUTES
27
28 This class defines the following attributes.
29
30 =head1 METHODS
31
32 This class defines the following methods.
33
34 =head2 next_storage
35
36 Returns an active replicant at random.  Please note that due to the nature of
37 the word 'random' this means it's possible for a particular active replicant to
38 be requested several times in a row.
39
40 =cut
41
42 sub next_storage {
43   my $self = shift @_;
44   my @active_replicants = $self->pool->active_replicants;
45   my $count_active_replicants = $#active_replicants +1;
46   my $random_replicant = int(rand($count_active_replicants));
47   
48   return $active_replicants[$random_replicant];
49 }
50
51 =head1 AUTHOR
52
53 John Napiorkowski <john.napiorkowski@takkle.com>
54
55 =head1 LICENSE
56
57 You may distribute this code under the same terms as Perl itself.
58
59 =cut
60
61 __PACKAGE__->meta->make_immutable;
62
63 1;