————————————package
Text::Todo::Simple;
use
Carp;
use
warnings;
use
strict;
=head1 NAME
Text::Todo::Simple - Todo list manager that helps in finishing tasks, not organizing them
=head1 VERSION
Version 0.04
=cut
our
$VERSION
=
'0.04'
;
=head1 SYNOPSIS
Text::Todo::Simple is a simple and basic todo list manager, without all
the additional features that make people spending more time on organizing
tasks instead of completing them.
use Text::Todo::Simple;
my $todo = Text::Todo::Simple->new(todo_file => $todo_file,
done_file => $done_file);
$todo->add('Something to do');
$todo->list('Something');
$todo->edit(1, 'Something to do and more');
$todo->add('Something else to do');
$todo->move(2, 1);
$todo->remove(2);
$todo->do(1);
=head1 DESCRIPTION
Text::Todo::Simple tries to be as effective as possible doing the unique
thing it does without any surplus.
This simplicity is aimed to not distract the users from what really
matters: emptying the todo list. The time that one wastes in tagging,
prioritizing and organizing tasks, can be spent more effectively B<completing>
the tasks.
Text::Todo::Simple was inspired by stevelosh' L<t|<a href="http://stevelosh.com/projects/t/"></a>> project.
=head1 METHODS
=head2 new
Create a todo object
=cut
sub
new {
my
(
$class
,
%args
) =
@_
;
my
$self
=
bless
({
%args
},
$class
);
return
$self
;
}
=head2 add( $task )
Add $task to the todo list
=cut
sub
add {
my
(
$self
,
$task
) =
@_
;
_append(
$self
-> {
'todo_file'
},
$task
);
}
=head2 do( $id )
Move $id task to done file
=cut
sub
do
{
my
(
$self
,
$id
) =
@_
;
my
$task
= @{ _read(
$self
-> {
'todo_file'
}) }[
$id
-1];
_append(
$self
-> {
'done_file'
},
$task
);
$self
-> rm(
$id
);
}
=head2 list( $grep )
List task containing $grep (optional)
=cut
sub
list {
my
(
$self
,
$grep
) =
@_
;
my
$tasks
= _read(
$self
-> {
'todo_file'
});
for
(
my
$i
= 0;
$i
<
scalar
@$tasks
;
$i
++) {
substr
(
@$tasks
[
$i
], 0, 0, (
$i
+1).
" "
);
}
my
$find
=
$grep
?
$grep
:
"(.*?)"
;
my
@out
=
grep
(/
$find
/, @{
$tasks
});
foreach
my
$item
(
@out
) {
$item
,
"\n"
;
}
}
=head2 remove( $id )
Remove $id task
=cut
sub
remove {
my
(
$self
,
$id
) =
@_
;
my
$tasks
= _read(
$self
-> {
'todo_file'
});
splice
@$tasks
,
$id
-1, 1;
_write(
$self
-> {
'todo_file'
},
$tasks
);
}
=head2 edit( $id, $new )
Replace $id task with $new
=cut
sub
edit {
my
(
$self
,
$id
,
$new
) =
@_
;
my
$tasks
= _read(
$self
-> {
'todo_file'
});
@$tasks
[
$id
-1] =
$new
;
_write(
$self
-> {
'todo_file'
},
$tasks
);
}
=head2 move( $id, $new )
Move $id task to $new
=cut
sub
move {
my
(
$self
,
$id
,
$new
) =
@_
;
my
$tasks
= _read(
$self
-> {
'todo_file'
});
my
$task
=
@$tasks
[
$id
-1];
splice
@$tasks
,
$id
-1, 1;
splice
@$tasks
,
$new
-1, 0,
$task
;
_write(
$self
-> {
'todo_file'
},
$tasks
);
}
=head1 INTERNAL METHODS
=head2 _read( $file )
Read file to array reference
=cut
sub
_read {
my
$file
=
shift
;
open
(FILE,
"<$file"
) or croak
"Cannot open $file in read mode.\n"
;
my
@data
= <FILE>;
close
(FILE);
foreach
my
$item
(
@data
) {
chomp
$item
;
}
return
\
@data
;
}
=head2 _append( $file, $data )
Append string to file
=cut
sub
_append {
my
(
$file
,
$data
) =
@_
;
chomp
$data
;
open
(FILE,
">>$file"
) or croak
"Cannot open $file in append mode.\n"
;
FILE
$data
,
"\n"
;
close
(FILE);
}
=head2 _write( $file, $data )
Write array (by reference) to file
=cut
sub
_write {
my
(
$file
,
$data
) =
@_
;
open
(FILE,
">$file"
) or croak
"Cannot open $file in read mode.\n"
;
foreach
my
$item
(@{
$data
}) {
FILE
"$item\n"
;
}
close
(FILE);
}
=head1 AUTHOR
Alessandro Ghedini, C<< <alexbio at cpan.org> >>
=head1 BUGS
Please report any bugs or feature requests to C<bug-text-todo-simple at rt.cpan.org>, or through
the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Text-Todo-Simple>. I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.
=head1 SUPPORT
You can find documentation for this module with the perldoc command.
perldoc Text::Todo::Simple
perldoc t.pl
You can also look for information at:
=over 4
=item * GitHub page
=item * RT: CPAN's request tracker
=item * AnnoCPAN: Annotated CPAN documentation
=item * CPAN Ratings
=item * Search CPAN
=back
=head1 SEE ALSO
L<Text::Todo>
=head1 LICENSE AND COPYRIGHT
Copyright 2010 Alessandro Ghedini.
This program is free software; you can redistribute it and/or modify it
under the terms of either: the GNU General Public License as published
by the Free Software Foundation; or the Artistic License.
See http://dev.perl.org/licenses/ for more information.
=cut
1;
# End of Text::Todo::Simple