| version 1.6, 2010/01/18 03:51:40 |
version 1.8, 2010/01/19 03:18:34 |
|
|
| package Text::Todo::REST::API; |
package Text::Todo::REST::API; |
| |
|
| # $AFresh1: API.pm,v 1.5 2010/01/18 03:10:42 andrew Exp $ |
# $AFresh1: API.pm,v 1.7 2010/01/18 13:47:53 andrew Exp $ |
| |
|
| use warnings; |
use warnings; |
| use strict; |
use strict; |
|
|
| use Text::Todo; |
use Text::Todo; |
| |
|
| use Class::Std::Utils; |
use Class::Std::Utils; |
| |
use Digest::MD5 qw/ md5_hex /; |
| |
|
| use Module::Pluggable |
use Module::Pluggable |
| require => 1, |
instantiate => 'new', |
| search_path => __PACKAGE__ . '::Representations', |
search_path => __PACKAGE__ . '::Representations', |
| sub_name => 'representations'; |
sub_name => 'representations'; |
| use Digest::MD5 qw/ md5_hex /; |
|
| use File::Spec; |
|
| |
|
| use version; our $VERSION = qv('0.0.1'); |
use version; our $VERSION = qv('0.0.1'); |
| |
|
|
|
| my @attr_refs = \( |
my @attr_refs = \( |
| my %todo_of, |
my %todo_of, |
| |
|
| my %basedir_of, |
|
| my %subdir_of, |
|
| |
|
| my %suffix_of, |
my %suffix_of, |
| my %file_regex_of, |
my %file_regex_of, |
| |
|
| |
my %format_of, |
| my %user_of, |
my %user_of, |
| my %list_of, |
my %list_of, |
| my %action_of, |
my %action_of, |
|
|
| sub new { |
sub new { |
| my ( $class, $options ) = @_; |
my ( $class, $options ) = @_; |
| |
|
| my $format = $options->{default_format}; |
my $self = bless anon_scalar(), $class; |
| |
my $ident = ident($self); |
| |
|
| |
$format_of{$ident} = $options->{default_format}; |
| if ( $options->{format} ) { |
if ( $options->{format} ) { |
| $format = $options->{format}; |
$format_of{$ident} = $options->{format}; |
| } |
} |
| elsif ($options->{path_info} |
elsif ($options->{path_info} |
| && $options->{path_info} =~ s/\.(\w+)$//xms ) |
&& $options->{path_info} =~ s/\.(\w+)$//xms ) |
| { |
{ |
| $format = $1; |
$format_of{$ident} = $1; |
| } |
} |
| |
|
| my $self = bless anon_scalar(), $class; |
$suffix_of{$ident} = $options->{suffix} || '.txt'; |
| my $ident = ident($self); |
|
| |
|
| if ( ref $self eq __PACKAGE__ && $format ) { |
|
| my $found_handler = 0; |
|
| REP: foreach my $rep ( $self->representations ) { |
|
| if ( $rep->_handles($format) ) { |
|
| $self = $rep->new($options); |
|
| $found_handler = 1; |
|
| last REP; |
|
| } |
|
| } |
|
| if ( !$found_handler ) { |
|
| croak("Unable to find handler for [$format]\n"); |
|
| } |
|
| } |
|
| |
|
| $basedir_of{$ident} = $options->{basedir}; |
|
| $subdir_of{$ident} = $options->{subdir}; |
|
| $suffix_of{$ident} = $options->{suffix} || '.txt'; |
|
| |
|
| $file_regex_of{$ident} = $options->{file_regex} || qr{ |
$file_regex_of{$ident} = $options->{file_regex} || qr{ |
| .* |
.* |
| todo |
todo |
|
|
| $ |
$ |
| }ixms; |
}ixms; |
| |
|
| if ( !$basedir_of{$ident} ) { |
|
| return $self->fail('Required option [basedir]'); |
|
| } |
|
| |
|
| $options->{path_info} ||= q{}; |
$options->{path_info} ||= q{}; |
| $options->{path_info} =~ s{^/}{}xms; |
$options->{path_info} =~ s{^/}{}xms; |
| ( $user_of{$ident}, $list_of{$ident}, |
( $list_of{$ident}, $action_of{$ident}, @{ $args_of{$ident} }, ) |
| $action_of{$ident}, @{ $args_of{$ident} }, |
= split '/', $options->{path_info}; |
| ) = split '/', $options->{path_info}; |
|
| |
|
| if ( $list_of{$ident} ) { |
if ( $list_of{$ident} ) { |
| $action_of{$ident} ||= 'list'; |
$action_of{$ident} ||= 'list'; |
| } |
} |
| elsif ( $user_of{$ident} ) { |
else { |
| $action_of{$ident} = 'files'; |
$action_of{$ident} = 'files'; |
| } |
} |
| |
|
| my @todo_dir = $basedir_of{$ident}; |
eval { |
| |
$todo_of{$ident} = Text::Todo->new( |
| my $todo_dir; |
{ todo_dir => $options->{todo_dir}, |
| if ( $user_of{$ident} ) { |
todo_file => $options->{todo_file}, |
| push @todo_dir, $user_of{$ident}; |
} |
| if ( $subdir_of{$ident} ) { |
); |
| push @todo_dir, $subdir_of{$ident}; |
}; |
| } |
if ($@) { |
| |
$self->fail( 'Unable to create Text::Todo object' . $@ ); |
| $todo_dir = File::Spec->catdir(@todo_dir); |
|
| } |
} |
| |
|
| my $todo_file; |
|
| if ( $list_of{$ident} ) { |
|
| $todo_file = $list_of{$ident} . $suffix_of{$ident}; |
|
| } |
|
| |
|
| $todo_of{$ident} = Text::Todo->new( |
|
| { todo_dir => $todo_dir, |
|
| todo_file => $todo_file, |
|
| } |
|
| ) or $self->fail('Unable to create Text::Todo object'); |
|
| |
|
| $todo_of{$ident}->load('todo_file') |
$todo_of{$ident}->load('todo_file') |
| or $self->fail('Unable to create Text::Todo object'); |
or $self->fail('Unable to load todo_file in Text::Todo object'); |
| |
|
| return $self; |
return $self; |
| } |
} |
|
|
| |
|
| sub content_type {return} |
sub content_type {return} |
| |
|
| sub Dump { |
sub _handle_representation { |
| my ($self) = @_; |
my ( $self, $type, @args ) = @_; |
| return $self->fail( 'Unable to Dump [' . $self->_action . ']' ); |
|
| |
my $method = join q{_}, $type, $self->_action; |
| |
|
| |
foreach my $class ( $self->representations ) { |
| |
if ( $class->can_format( $self->_format ) |
| |
&& $class->can( $method ) ) |
| |
{ |
| |
return $class->$method($self->_format, @args); |
| |
} |
| |
} |
| |
|
| |
return $self->fail( |
| |
'Unable to ' . $type . ' [' . $self->_action . ']' ); |
| } |
} |
| |
|
| sub Load { |
sub Dump { |
| my ($self) = @_; |
my ( $self, @args ) = @_; |
| return $self->fail( 'Unable to Load [' . $self->_action . ']' ); |
return $self->_handle_representation( 'dump', @args ); |
| } |
} |
| |
|
| sub _handle_action { |
sub _handle_action { |
|
|
| } |
} |
| |
|
| sub _todo { my ($self) = @_; return $todo_of{ ident $self }; } |
sub _todo { my ($self) = @_; return $todo_of{ ident $self }; } |
| sub _basedir { my ($self) = @_; return $basedir_of{ ident $self}; } |
|
| sub _subdir { my ($self) = @_; return $subdir_of{ ident $self}; } |
|
| sub _suffix { my ($self) = @_; return $suffix_of{ ident $self}; } |
sub _suffix { my ($self) = @_; return $suffix_of{ ident $self}; } |
| sub _file_regex { my ($self) = @_; return $file_regex_of{ ident $self}; } |
sub _file_regex { my ($self) = @_; return $file_regex_of{ ident $self}; } |
| sub _user { my ($self) = @_; return $user_of{ ident $self}; } |
sub _user { my ($self) = @_; return $user_of{ ident $self}; } |
| sub _list { my ($self) = @_; return $list_of{ ident $self}; } |
sub _list { my ($self) = @_; return $list_of{ ident $self}; } |
| sub _action { my ($self) = @_; return $action_of{ ident $self}; } |
sub _action { my ($self) = @_; return $action_of{ ident $self}; } |
| |
sub _format { my ($self) = @_; return $format_of{ ident $self}; } |
| sub _args { my ($self) = @_; return $args_of{ ident $self}; } |
sub _args { my ($self) = @_; return $args_of{ ident $self}; } |
| |
|
| sub DESTROY { |
sub DESTROY { |