=================================================================== RCS file: /cvs/todotxt/Text-Todo-REST-API/lib/Text/Todo/REST/API.pm,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- todotxt/Text-Todo-REST-API/lib/Text/Todo/REST/API.pm 2010/01/18 13:47:53 1.7 +++ todotxt/Text-Todo-REST-API/lib/Text/Todo/REST/API.pm 2010/01/19 03:18:34 1.8 @@ -1,6 +1,6 @@ package Text::Todo::REST::API; -# $AFresh1: API.pm,v 1.6 2010/01/18 03:51:40 andrew Exp $ +# $AFresh1: API.pm,v 1.7 2010/01/18 13:47:53 andrew Exp $ use warnings; use strict; @@ -10,11 +10,12 @@ use Text::Todo; use Class::Std::Utils; +use Digest::MD5 qw/ md5_hex /; + use Module::Pluggable - require => 1, + instantiate => 'new', search_path => __PACKAGE__ . '::Representations', sub_name => 'representations'; -use Digest::MD5 qw/ md5_hex /; use version; our $VERSION = qv('0.0.1'); @@ -33,6 +34,7 @@ my %suffix_of, my %file_regex_of, + my %format_of, my %user_of, my %list_of, my %action_of, @@ -44,35 +46,21 @@ sub new { 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} ) { - $format = $options->{format}; + $format_of{$ident} = $options->{format}; } elsif ($options->{path_info} && $options->{path_info} =~ s/\.(\w+)$//xms ) { - $format = $1; + $format_of{$ident} = $1; } - my $self = bless anon_scalar(), $class; - my $ident = ident($self); + $suffix_of{$ident} = $options->{suffix} || '.txt'; - 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"); - } - } - - $suffix_of{$ident} = $options->{suffix} || '.txt'; - $file_regex_of{$ident} = $options->{file_regex} || qr{ .* todo @@ -83,8 +71,8 @@ $options->{path_info} ||= q{}; $options->{path_info} =~ s{^/}{}xms; - ( $list_of{$ident}, $action_of{$ident}, @{ $args_of{$ident} }, - ) = split '/', $options->{path_info}; + ( $list_of{$ident}, $action_of{$ident}, @{ $args_of{$ident} }, ) + = split '/', $options->{path_info}; if ( $list_of{$ident} ) { $action_of{$ident} ||= 'list'; @@ -93,13 +81,15 @@ $action_of{$ident} = 'files'; } - eval { $todo_of{$ident} = Text::Todo->new( - { todo_dir => $options->{todo_dir}, - todo_file => $options->{todo_file}, - } - ) }; + eval { + $todo_of{$ident} = Text::Todo->new( + { todo_dir => $options->{todo_dir}, + todo_file => $options->{todo_file}, + } + ); + }; if ($@) { - $self->fail('Unable to create Text::Todo object' . $@); + $self->fail( 'Unable to create Text::Todo object' . $@ ); } $todo_of{$ident}->load('todo_file') @@ -120,14 +110,26 @@ sub content_type {return} - sub Dump { - my ($self) = @_; - return $self->fail( 'Unable to Dump [' . $self->_action . ']' ); + sub _handle_representation { + my ( $self, $type, @args ) = @_; + + 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 { - my ($self) = @_; - return $self->fail( 'Unable to Load [' . $self->_action . ']' ); + sub Dump { + my ( $self, @args ) = @_; + return $self->_handle_representation( 'dump', @args ); } sub _handle_action { @@ -247,6 +249,7 @@ sub _user { my ($self) = @_; return $user_of{ ident $self}; } sub _list { my ($self) = @_; return $list_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 DESTROY {