The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package SVN::Access::Group;

use 5.006001;
use strict;
use warnings;

our $VERSION = '0.11';

sub new {
    my ($class, %attr) = @_;
    return bless(\%attr, $class);
}

sub members {
    my ($self) = @_;
    my @members;
    foreach my $member (@{$self->{members}}) {
        push(@members, $member);
    }
    return (@members);
}

sub remove_member {
    my ($self, $remove) = @_;
    my @members;
    foreach my $member (@{$self->{members}}) {
        push(@members, $member) unless $member eq $remove;
    }
    $self->{members} = \@members;
}

sub add_member {
    my ($self, $new) = @_;
    if ($self->member_exists($new)) {
        return "Member $new already in group " . $self->name . "\n";
    } else {
        push(@{$self->{members}}, $new);
        return "Member $new successfully added to group " . $self->name . "\n";
    }
}

sub member_exists {
    my ($self, $search) = @_;
    foreach my $member (@{$self->{members}}) {
        return $member if $member eq $search;
    }
    return undef;
}

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

1;
__END__

=head1 NAME

B<SVN::Access::Group> - Object representing a SVN Access file group

=head1 SYNOPSIS

 use SVN::Access;
 
 my $acl = SVN::Access->new(acl_file => '/usr/local/svn/conf/badnews_svn_access.conf');

 # add a member to all groups.
 foreach my $group ($acl->groups) {
     $group->add_member("peter");
 }

=head1 DESCRIPTION

Object wrapper around the groups portion of the SVN access control file. 
Groups usually look like...

=over 2

[groups]
everyone = harry, sally, joe, frank, sally, jane

=back

=head1 METHODS

=over 4

=item B<new>

the constructor, takes anything you want in hash form but im looking for 
members (arrayref), and the name of the group.  the meat and potatoes if 
you will.

Example:

  my $group = SVN::Access::Group->new(
      members   => [qw/ray bob elle/],
      name      => "Carpenters",
  );

  $group->add_member("janette");

=item B<members>

returns a list of the group's members.

Example:

  my @members = $group->members;

=item B<remove_member>

removes a member from the group.

Example:

  $group->remove_member("ray");

=item B<add_member>

adds a member to the group.  returns an error string for some reason. this 
is inconsistent with the rest of the interface, so expect either other methods 
to start having this, or expect this functionality to go away.

Example:

  print $group->add_member("becky");
  # should print "Member becky successfully added to Carpenters\n"

  print $group->add_member("janette"):
  # should print "Member janette already in group Carpenters\n"

=item B<member_exists>

returns true (the member's name) if the member exists.

Example:

  if ($group->member_exists("ray")) {
      print "i thought i fired him...\n";
      $group->remove_member("ray"); # carpenters don't need SVN access anyway
  }

=item B<name>

light accessor method which returns the group's name.

=back

=head1 SEE ALSO

subversion (http://subversion.tigris.org/), SVN::ACL, svnserve.conf

=head1 AUTHOR

Michael Gregorowicz, E<lt>mike@mg2.orgE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2012-2017 by Michael Gregorowicz

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.8 or,
at your option, any later version of Perl 5 you may have available.


=cut