| version 1.21, 2010/01/18 00:19:55 | version 1.27, 2010/02/13 23:06:34 | 
|  |  | 
| package Text::Todo::Entry; | package Text::Todo::Entry; | 
|  |  | 
| # $AFresh1: Entry.pm,v 1.20 2010/01/12 20:09:02 andrew Exp $ | # $AFresh1: Entry.pm,v 1.26 2010/01/22 01:30:45 andrew Exp $ | 
|  |  | 
| use warnings; | use warnings; | 
| use strict; | use strict; | 
| use Carp; | use Carp; | 
|  |  | 
| use Class::Std; | use Class::Std::Utils; | 
| use List::Util qw/ first /; |  | 
|  |  | 
| use version; our $VERSION = qv('0.0.1'); | use version; our $VERSION = qv('0.1.1'); | 
|  |  | 
| { | { | 
| my ( %text_of, %tags_of, %priority_of, %completion_status_of, |  | 
| %known_tags_of, ) : ATTR; |  | 
|  |  | 
|  | my @attr_refs = \( | 
|  | my %text_of, | 
|  |  | 
|  | my %tags_of, | 
|  | my %priority_of, | 
|  | my %completion_status_of, | 
|  | my %known_tags_of, | 
|  | ); | 
|  |  | 
| # XXX Should the completion (x) be case sensitive? | # XXX Should the completion (x) be case sensitive? | 
| my $priority_completion_regex = qr{ | my $priority_completion_regex = qr{ | 
| ^ \s* | ^ \s* | 
|  |  | 
| (?i:\( ([A-Z]) \)   \s*)? | (?i:\( ([A-Z]) \)   \s*)? | 
| }xms; | }xms; | 
|  |  | 
| sub BUILD { | sub new { | 
| my ( $self, $ident, $options ) = @_; | my ( $class, $options ) = @_; | 
|  |  | 
|  | my $self = bless anon_scalar(), $class; | 
|  | my $ident = ident($self); | 
|  |  | 
| if ( !ref $options ) { | if ( !ref $options ) { | 
| $options = { text => $options }; | $options = { text => $options }; | 
| } | } | 
|  |  | 
| return; | return; | 
| } | } | 
|  |  | 
|  | sub known_tags { | 
|  | my ( $self ) = @_; | 
|  | return $known_tags_of{ ident($self) }; | 
|  | } | 
|  |  | 
| sub _tags { | sub _tags { | 
| my ( $self, $tag ) = @_; | my ( $self, $tag ) = @_; | 
| my $ident = ident($self); | my $ident = ident($self); | 
|  |  | 
|  |  | 
| sub _is_in { | sub _is_in { | 
| my ( $self, $tags, $item ) = @_; | my ( $self, $tags, $item ) = @_; | 
| return defined first { $_ eq $item } $self->$tags; | foreach ($self->$tags) { | 
|  | return 1 if $_ eq $item; | 
|  | } | 
|  | return 0; | 
| } | } | 
|  |  | 
| sub text { | sub text { | 
|  |  | 
|  |  | 
| sub done { | sub done { | 
| my ($self) = @_; | my ($self) = @_; | 
| my $ident = ident($self); | return $completion_status_of{ ident($self) }; | 
|  |  | 
| return $completion_status_of{$ident}; |  | 
| } | } | 
|  |  | 
|  | sub DESTROY { | 
|  | my ($self) = @_; | 
|  | my $ident = ident $self; | 
|  | foreach my $attr_ref (@attr_refs) { | 
|  | delete $attr_ref->{$ident}; | 
|  | } | 
|  | } | 
| } | } | 
| 1;    # Magic true value required at end of module | 1;    # Magic true value required at end of module | 
| __END__ | __END__ | 
|  |  | 
|  |  | 
| =head1 INTERFACE | =head1 INTERFACE | 
|  |  | 
| =head2 BUILD | =head2 new | 
|  |  | 
| Creates an entry that can be manipulated. | Creates an entry that can be manipulated. | 
|  |  | 
|  |  | 
|  |  | 
| Each tag type generates two accessor functions {tag}s and in_{tag}. | Each tag type generates two accessor functions {tag}s and in_{tag}. | 
|  |  | 
| Current tags are context (@) and project (+). | Default tags are context (@) and project (+). | 
|  |  | 
| When creating a new object you can pass in new tags to recognize. | When creating a new object you can pass in new tags to recognize. | 
|  |  | 
|  |  | 
|  |  | 
| my @due_dates = $entry->due_dates; | my @due_dates = $entry->due_dates; | 
|  |  | 
| then @due_dates eq ( '2011-01-01' ); | then @due_dates is ( '2011-01-01' ); | 
|  |  | 
| and you could also: | and you could also: | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
| =over | =over | 
|  |  | 
|  | =item known_tags | 
|  |  | 
|  | $known_tags = $entry->known_tags; | 
|  |  | 
|  | $known_tags by default would be: | 
|  |  | 
|  | { context => '@', | 
|  | project => '+', | 
|  | } | 
|  |  | 
| =item {tag}s | =item {tag}s | 
|  |  |