=================================================================== RCS file: /cvs/todotxt/Text-Todo/lib/Text/Todo.pm,v retrieving revision 1.7 retrieving revision 1.9 diff -u -r1.7 -r1.9 --- todotxt/Text-Todo/lib/Text/Todo.pm 2010/01/09 05:26:51 1.7 +++ todotxt/Text-Todo/lib/Text/Todo.pm 2010/01/09 06:54:15 1.9 @@ -18,6 +18,7 @@ my %path_of; my %list_of; + my %loaded_of; sub new { my ( $class, $options ) = @_; @@ -130,28 +131,43 @@ my ( $self, $file ) = @_; my $ident = ident($self); + $loaded_of{$ident} = undef; + $file = $self->file($file); + if ( $list_of{$ident} = $self->listfile($file) ) { + $loaded_of{$ident} = $file; + return 1; + } + + return; + } + + sub listfile { + my ( $self, $file ) = @_; + + $file = $self->file($file); + if ( !defined $file ) { - croak q{todo file can't be found}; + carp q{file can't be found}; + return; } if ( !-e $file ) { - carp "todo file [$file] does not exist"; + carp "file [$file] does not exist"; return; } my @list; - my $line = 1; open my $fh, '<', $file or croak "Couldn't open [$file]: $!"; while (<$fh>) { s/\r?\n$//xms; + next if !length $_; push @list, Text::Todo::Entry->new($_); } close $fh or croak "Couldn't close [$file]: $!"; - $list_of{$ident} = \@list; - return 1; + return wantarray ? @list : \@list; } sub save { @@ -170,6 +186,8 @@ } close $fh or croak "Couldn't close [$file]: $!"; + $loaded_of{$ident} = $file; + return 1; } @@ -249,10 +267,68 @@ return wantarray ? @projects : \@projects; } - sub archive { carp 'unsupported'; return } - sub addto { carp 'unsupported'; return } - sub listfile { carp 'unsupported'; return } + sub archive { + my ($self) = @_; + my $ident = ident($self); + if ( !defined $loaded_of{$ident} + || $loaded_of{$ident} ne $self->file('todo_file') ) + { + carp 'todo_file not loaded'; + return; + } + + my $archived = 0; + ENTRY: foreach my $e ( $self->list ) { + if ( $e->done ) { + if ( $self->addto( 'done_file', $e ) && $self->del($e) ) { + $archived++; + } + else { + carp q{Couldn't archive entry [} . $e->text . ']'; + last ENTRY; + } + } + } + + if ($archived) { + $self->save; + } + + return $archived; + } + + sub addto { + my ( $self, $file, $entry ) = @_; + my $ident = ident($self); + + $file = $self->file($file); + if ( !defined $file ) { + croak q{file can't be found}; + } + + if ( ref $entry ) { + if ( ref $entry eq 'Text::Todo::Entry' ) { + $entry = $entry->text; + } + else { + carp 'Unknown ref [' . ref($entry) . ']'; + return; + } + } + + open my $fh, '>>', $file or croak "Couldn't open [$file]: $!"; + print {$fh} $entry, "\n" + or croak "Couldn't print to [$file]: $!"; + close $fh or croak "Couldn't close [$file]: $!"; + + if ( defined $loaded_of{$ident} && $file eq $loaded_of{$ident} ) { + return $self->load($file); + } + + return 1; + } + sub _find_entry_id { my ( $self, $entry ) = @_; my $ident = ident($self); @@ -292,7 +368,7 @@ Perhaps RCS Id is good enough? - $Id: Todo.pm,v 1.7 2010/01/09 05:26:51 andrew Exp $ + $Id: Todo.pm,v 1.9 2010/01/09 06:54:15 andrew Exp $ =head1 SYNOPSIS @@ -306,15 +382,29 @@ =head2 new +=head2 file + =head2 load =head2 save -=head2 file - =head2 list +=head2 listpri + +=head2 listproj + =head2 add + +=head2 del + +=head2 move + +=head2 archive + +=head2 addto + +=head2 listfile =head1 DIAGNOSTICS