summaryrefslogtreecommitdiff
path: root/lib/Net/Riak/Role/Hosts.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Net/Riak/Role/Hosts.pm')
-rw-r--r--lib/Net/Riak/Role/Hosts.pm44
1 files changed, 44 insertions, 0 deletions
diff --git a/lib/Net/Riak/Role/Hosts.pm b/lib/Net/Riak/Role/Hosts.pm
new file mode 100644
index 0000000..5171928
--- /dev/null
+++ b/lib/Net/Riak/Role/Hosts.pm
@@ -0,0 +1,44 @@
+package Net::Riak::Role::Hosts;
+
+use Moose::Role;
+use Moose::Util::TypeConstraints;
+
+subtype 'RiakHost' => as 'ArrayRef[HashRef]';
+
+coerce 'RiakHost' => from 'Str' => via {
+ [{node => $_, weight => 1}];
+};
+coerce 'RiakHost' => from 'ArrayRef' => via {
+ my $backends = $_;
+ my $weight = 1 / @$backends;
+ [map { {node => $_, weight => $weight} } @$backends];
+};
+coerce 'RiakHost' => from 'HashRef' => via {
+ my $backends = $_;
+ my $total = 0;
+ $total += $_ for values %$backends;
+ [map { {node => $_, weight => $backends->{$_} / $total} }
+ keys %$backends];
+};
+
+has host => (
+ is => 'rw',
+ isa => 'RiakHost',
+ coerce => 1,
+ default => sub {'http://127.0.0.1:8098'}
+);
+
+sub get_host {
+ my $self = shift;
+
+ my $choice;
+ my $rand = rand;
+
+ for (@{$self->host}) {
+ $choice = $_->{node};
+ ($rand -= $_->{weight}) <= 0 and last;
+ }
+ $choice;
+}
+
+1;