use BUILDARGS intead of wrapping new, added make_immutable, removed unnneeded test...
[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 List::Util qw(shuffle);
4 use Moose;
5 with 'DBIx::Class::Storage::DBI::Replicated::Balancer';
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   
47   return $active_replicants[int(rand($count_active_replicants +1))];
48 }
49
50 =head1 AUTHOR
51
52 John Napiorkowski <john.napiorkowski@takkle.com>
53
54 =head1 LICENSE
55
56 You may distribute this code under the same terms as Perl itself.
57
58 =cut
59
60 __PACKAGE__->meta->make_immutable;
61
62 1;