File Coverage

blib/lib/Data/RuledCluster.pm
Criterion Covered Total %
statement 61 68 89.7
branch 21 32 65.6
condition 2 4 50.0
subroutine 15 15 100.0
pod 8 9 88.8
total 107 128 83.5


line stmt bran cond sub pod time code
1             package Data::RuledCluster;
2 7     7   180954 use 5.008_001;
  7         31  
  7         282  
3 7     7   42 use strict;
  7         14  
  7         261  
4 7     7   36 use warnings;
  7         18  
  7         226  
5 7     7   35 use Carp ();
  7         11  
  7         159  
6 7     7   6569 use Class::Load ();
  7         303127  
  7         217  
7 7     7   16089 use Data::Util qw(is_array_ref is_hash_ref);
  7         8716  
  7         9427  
8              
9             our $VERSION = '0.05';
10              
11             sub new {
12 6     6 1 116 my $class = shift;
13 6 50       49 my %args = @_ == 1 ? %{$_[0]} : @_;
  0         0  
14 6         31 bless \%args, $class;
15             }
16              
17             sub resolver {
18 49     49 0 69 my ($self, $strategy) = @_;
19              
20 49         56 my $pkg = $strategy;
21 49 50       164 $pkg = $pkg =~ s/^\+// ? $pkg : "Data::RuledCluster::Strategy::$pkg";
22 49         144 Class::Load::load_class($pkg);
23 49         3166 $pkg;
24             }
25              
26             sub config {
27 8     8 1 16630 my ($self, $config) = @_;
28 8 100       65 $self->{config} = $config if $config;
29 8         35 $self->{config};
30             }
31              
32             sub resolve {
33 96     96 1 57333 my ($self, $cluster_or_node, $args, $options) = @_;
34              
35 96 50       270 Carp::croak("missing mandatory config.") unless $self->{config};
36              
37 96 100       205 if ( $self->is_cluster($cluster_or_node) ) {
    50          
38 49 50       191 if ( is_hash_ref($args) ) {
39 0 0       0 Carp::croak("args has not 'strategy' field") unless $args->{strategy};
40 0         0 my ( $resolved_node, @keys ) = $self->resolver($args->{strategy})->resolve(
41             $self,
42             $cluster_or_node,
43             $args,
44             $options,
45             );
46 0         0 return $self->resolve( $resolved_node, \@keys );
47             }
48             else {
49 49         116 my $cluster_info = $self->cluster_info($cluster_or_node);
50 49 100       210 if (is_array_ref($cluster_info)) {
    50          
51 8         29 my ( $resolved_node, @keys ) = $self->resolver('Key')->resolve(
52             $self,
53             $cluster_or_node,
54             +{ key => $args, },
55             $options,
56             );
57 8         40 return $self->resolve( $resolved_node, \@keys, $options );
58             }
59             elsif (is_hash_ref($cluster_info)) {
60 41         105 my ( $resolved_node, @keys ) = $self->resolver($cluster_info->{strategy})->resolve(
61             $self,
62             $cluster_or_node,
63             +{ %$cluster_info, key => $args, },
64             $options,
65             );
66 39         887 return $self->resolve( $resolved_node, \@keys, $options );
67             }
68             }
69             }
70             elsif ( $self->is_node($cluster_or_node) ) {
71             return +{
72 47         329 node => $cluster_or_node,
73             node_info => $self->{config}->{node}->{$cluster_or_node},
74             };
75             }
76              
77 0         0 Carp::croak("$cluster_or_node is not defined.");
78             }
79              
80             sub resolve_node_keys {
81 5     5 1 2007 my ($self, $cluster_or_node, $keys, $args, $options) = @_;
82              
83 5         11 my %node_keys;
84 5         11 for my $key ( @$keys ) {
85 21 50       56 if ( is_hash_ref $args ) {
86 0   0     0 $args->{strategy} ||= 'Key';
87 0         0 $args->{key} = $key;
88             }
89             else {
90 21         30 $args = $key;
91             }
92              
93 21         47 my $resolved = $self->resolve( $cluster_or_node, $args, $options );
94 21   100     106 $node_keys{$resolved->{node}} ||= [];
95 21         22 push @{$node_keys{$resolved->{node}}}, $key;
  21         76  
96             }
97              
98 5 50       30 return wantarray ? %node_keys : \%node_keys;
99             }
100              
101             sub cluster_info {
102 66     66 1 83 my ($self, $cluster) = @_;
103 66         159 $self->{config}->{clusters}->{$cluster};
104             }
105              
106             sub clusters {
107 17     17 1 9372 my ($self, $cluster) = @_;
108 17         38 my $cluster_info = $self->cluster_info($cluster);
109 17 100       75 my @nodes = is_array_ref($cluster_info) ? @$cluster_info : @{ $cluster_info->{nodes} };
  7         16  
110 17 100       73 wantarray ? @nodes : \@nodes;
111             }
112              
113             sub is_cluster {
114 98     98 1 136 my ($self, $cluster) = @_;
115 98 100       405 exists $self->{config}->{clusters}->{$cluster} ? 1 : 0;
116             }
117              
118             sub is_node {
119 51     51 1 71 my ($self, $node) = @_;
120 51 50       235 exists $self->{config}->{node}->{$node} ? 1 : 0;
121             }
122              
123             1;
124             __END__