Siesta

 view release on metacpan or  search on metacpan

lib/Siesta/List.pm  view on Meta::CPAN

use base 'Siesta::DBI';
use Carp qw( croak );
use POSIX qw( strftime );
__PACKAGE__->set_up_table('list');
__PACKAGE__->load_alias('name');
__PACKAGE__->has_a( owner => 'Siesta::Member' );
__PACKAGE__->has_many( members  => [ 'Siesta::Subscription' => 'member' ] );

# this is a bit funny, never mind
__PACKAGE__->has_many( _plugins => 'Siesta::Plugin', 'list',
                       { sort => 'rank' } );


=head1 NAME

Siesta::List - manipulate a list

=head1 METHODS

=head2 ->new ( %hash )

=cut

sub new { shift->create({ @_ }) }


=head2 ->name

the short name of the list

=head2 ->owner

the owner (a Siesta::Member)

=head2 ->post_address

the email address that people post to send to this list.

=cut

# the address to use to post to pipline $foo
sub address {
    my $self = shift;
    my $pipeline = shift;

    # XXX - hacky
    my $address = $self->post_address;
    return $address if !$pipeline || $pipeline eq 'post';
    $address =~ s/\@/-$pipeline\@/;
    return $address;
}

=head2 ->return_path

the email address that bounces should come back to

=head2 ->members

all of the L<Siesta::Member>s subscribed to this list

=head2 ->prefs

all of the preferences associated with this list

=head2 ->is_member( $member )

Returns true or false depending if member is a member of this
list.  This can take either a Member object or an email address.

=cut

sub is_member {
    my $self = shift;
    my $member = shift;

    $member = Siesta::Member->load( $member ) unless ref $member;
    return unless $member;
    Siesta::Subscription->search( member => $member, list => $self );
}


=head2 ->add_member( $member )

Adds a member to a list. This can take either a Member object
or an email address.

=cut

sub add_member {
    my $self = shift;
    my $member = shift;

    $member = Siesta::Member->find_or_create({ email => $member })
      unless ref $member;
    return if $self->is_member( $member );
    Siesta::Subscription->create({ member => $member, list => $self });
}


=head2 ->remove_member( $member )

Removes a member from a list. This can take either a Member
object or an email address.

=cut

sub remove_member {
    my $self = shift;
    my $member = shift;

    $member = Siesta::Member->load( $member ) unless ref $member;
    return unless $member;
    my ($record) = Siesta::Subscription->search( member => $member,
                                                 list => $self );
    return unless $record;
    $record->delete;
    return 1;
}


=head2 ->members



( run in 1.044 second using v1.01-cache-2.11-cpan-98e64b0badf )