The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#
# (c) Jan Gehring <jan.gehring@gmail.com>
# 
# vim: set ts=3 sw=3 tw=0:
# vim: set expandtab:

package Rex::Group;

use strict;
use warnings;

use Rex::Logger;

use attributes;
use Rex::Group::Entry::Server;

use vars qw(%groups);
use Data::Dumper;

sub new {
   my $that = shift;
   my $proto = ref($that) || $that;
   my $self = { @_ };

   bless($self, $proto);

   return $self;
}


sub get_servers {
   my ($self) = @_;

   my @servers = map { ref($_->to_s) eq "CODE" ? &{ $_->to_s } : $_ } @{ $self->{servers} };

   return @servers;
}

sub set_auth {
   my ($self, %data) = @_;
   $self->{auth} = \%data;

   map { $_->set_auth(%{ $self->get_auth }) } $self->get_servers;
}

sub get_auth {
   my ($self) = @_;
   return $self->{auth};
}


################################################################################
# STATIC FUNCTIONS
################################################################################

sub create_group {
   my $class = shift;
   my $group_name = shift;
   my @server = @_;

   $groups{$group_name} = Rex::Group->new(servers => [ map {
                                                              if(ref($_) ne "Rex::Group::Entry::Server") {
                                                                 $_ = Rex::Group::Entry::Server->new(name => $_)
                                                              }
                                                              else {
                                                                 $_;
                                                              }
                                                           } @server 
                                                     ]
                                         );
}

# returns the servers in the group
sub get_group {
   my $class = shift;
   my $group_name = shift;

   return $groups{$group_name}->get_servers;
}

sub is_group {
   my $class = shift;
   my $group_name = shift;

   if(defined $groups{$group_name}) { return 1; }
   return 0;
}

sub get_groups {
   my $class = shift;
   my %ret = ();
   
   for my $key (keys %groups) {
      $ret{$key} = [ $groups{$key}->get_servers ];
   }

   return %ret;
}

sub get_group_object {
   my $class = shift;
   my $name = shift;

   return $groups{$name};
}

1;