From a7c37d5489611bf79889dd689abb0ac686d640c9 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 17 Feb 2011 18:57:19 -0600 Subject: refactor this a bit --- lib/Narwhal.pm | 15 ++++++-- lib/Narwhal/Component/Wiki.pm | 65 -------------------------------- lib/Narwhal/Component/Wiki/Edit.pm | 68 ++++++++++++++++++++++++++++++++++ lib/Narwhal/Component/Wiki/Page.pm | 53 ++++++++++++++++++++++++++ lib/Narwhal/RouteBuilder/HTTPMethod.pm | 64 ++++++++++++++++++++++++++++++++ 5 files changed, 196 insertions(+), 69 deletions(-) delete mode 100644 lib/Narwhal/Component/Wiki.pm create mode 100644 lib/Narwhal/Component/Wiki/Edit.pm create mode 100644 lib/Narwhal/Component/Wiki/Page.pm create mode 100644 lib/Narwhal/RouteBuilder/HTTPMethod.pm (limited to 'lib') diff --git a/lib/Narwhal.pm b/lib/Narwhal.pm index 66aabb7..82ad0ab 100644 --- a/lib/Narwhal.pm +++ b/lib/Narwhal.pm @@ -1,5 +1,6 @@ package Narwhal; use OX; +use Narwhal::RouteBuilder::HTTPMethod; with 'OX::Role::WithAppRoot'; @@ -11,7 +12,12 @@ config template_root => sub { component Redirect => 'Narwhal::Component::Redirect'; -component Wiki => 'Narwhal::Component::Wiki', ( +component WikiPage => 'Narwhal::Component::Wiki::Page', ( + kioku => depends_on('/Component/Kioku'), + tt => depends_on('/Component/TT'), +); + +component WikiEdit => 'Narwhal::Component::Wiki::Edit', ( kioku => depends_on('/Component/Kioku'), tt => depends_on('/Component/TT'), ); @@ -30,15 +36,16 @@ router as { route '/' => 'redirect.permanent', ( to => '/page/main', ); - route '/page/:page_name' => 'wiki.page', ( + route '/page/:page_name' => 'page', ( page_name => { isa => 'Str' }, ); - route '/edit/:page_name' => 'wiki.edit', ( + route '/edit/:page_name' => 'edit', ( page_name => { isa => 'Str' }, ); }, ( redirect => depends_on('/Component/Redirect'), - wiki => depends_on('/Component/Wiki'), + page => depends_on('/Component/WikiPage'), + edit => depends_on('/Component/WikiEdit'), ); no OX; diff --git a/lib/Narwhal/Component/Wiki.pm b/lib/Narwhal/Component/Wiki.pm deleted file mode 100644 index fa07342..0000000 --- a/lib/Narwhal/Component/Wiki.pm +++ /dev/null @@ -1,65 +0,0 @@ -package Narwhal::Component::Wiki; -use Moose; - -use Narwhal::Page; - -has kioku => ( - isa => 'KiokuX::Model', - required => 1, - handles => 'KiokuDB::Role::API', -); - -has tt => ( - isa => 'Template', - required => 1, - handles => ['process'], -); - -has scope => ( - is => 'ro', - isa => 'KiokuDB::LiveObjects::Scope', - lazy => 1, - default => sub { shift->new_scope }, -); - -sub BUILD { - my $self = shift; - $self->scope; -} - -sub page { - my $self = shift; - my ($req, $page) = @_; - my $page_obj = $self->lookup("page:$page"); - return $req->new_response(404) - unless $page_obj; - my $out; - $self->process('page.tt', { uri_for => sub { $req->uri_for({@_}) }, text => $page_obj->text, page => $page }, \$out); - return $req->new_response(200, [], $out); -} - -sub edit { - my $self = shift; - my ($req, $page) = @_; - if ($req->method eq 'POST') { - my $page_obj = Narwhal::Page->new(text => $req->param('text')); - $self->txn_do(sub { - $self->delete("page:$page"); - $self->insert("page:$page" => $page_obj); - }); - my $res = $req->new_response(303); - $res->location($req->uri_for({controller => 'wiki', action => 'page', page_name => $page})); - return $res; - } - else { - my $page_obj = $self->lookup("page:$page"); - my $out; - $self->process('edit.tt', { uri_for => sub { $req->uri_for({@_}) }, text => ($page_obj ? $page_obj->text : ''), page => $page }, \$out); - return $req->new_response(200, [], $out); - } -} - -__PACKAGE__->meta->make_immutable; -no Moose; - -1; diff --git a/lib/Narwhal/Component/Wiki/Edit.pm b/lib/Narwhal/Component/Wiki/Edit.pm new file mode 100644 index 0000000..fabeb0c --- /dev/null +++ b/lib/Narwhal/Component/Wiki/Edit.pm @@ -0,0 +1,68 @@ +package Narwhal::Component::Wiki::Edit; +use Moose; + +has kioku => ( + isa => 'KiokuX::Model', + required => 1, + handles => 'KiokuDB::Role::API', +); + +has tt => ( + isa => 'Template', + required => 1, + handles => ['process'], +); + +has scope => ( + is => 'ro', + isa => 'KiokuDB::LiveObjects::Scope', + lazy => 1, + default => sub { shift->new_scope }, +); + +sub BUILD { + my $self = shift; + $self->scope; +} + +sub get { + my $self = shift; + my ($req, $page) = @_; + + my $page_obj = $self->lookup("page:$page"); + my $out; + $self->process( + 'edit.tt', + { + uri_for => sub { $req->uri_for({@_}) }, + text => ($page_obj ? $page_obj->text : ''), + page => $page + }, + \$out, + ); + return $req->new_response(200, [], $out); +} + +sub post { + my $self = shift; + my ($req, $page) = @_; + + my $page_obj = Narwhal::Page->new(text => $req->param('text')); + $self->txn_do(sub { + $self->delete("page:$page"); + $self->insert("page:$page" => $page_obj); + }); + my $res = $req->new_response(303); + $res->location( + $req->uri_for({ + action => 'page', + page_name => $page + }) + ); + return $res; +} + +__PACKAGE__->meta->make_immutable; +no Moose; + +1; diff --git a/lib/Narwhal/Component/Wiki/Page.pm b/lib/Narwhal/Component/Wiki/Page.pm new file mode 100644 index 0000000..726439a --- /dev/null +++ b/lib/Narwhal/Component/Wiki/Page.pm @@ -0,0 +1,53 @@ +package Narwhal::Component::Wiki::Page; +use Moose; + +has kioku => ( + isa => 'KiokuX::Model', + required => 1, + handles => 'KiokuDB::Role::API', +); + +has tt => ( + isa => 'Template', + required => 1, + handles => ['process'], +); + +has scope => ( + is => 'ro', + isa => 'KiokuDB::LiveObjects::Scope', + lazy => 1, + default => sub { shift->new_scope }, +); + +sub BUILD { + my $self = shift; + $self->scope; +} + +sub get { + my $self = shift; + my ($req, $page) = @_; + + my $page_obj = $self->lookup("page:$page"); + return $req->new_response(404) + unless $page_obj; + + my $out; + $self->process( + 'page.tt', + { + uri_for => sub { $req->uri_for({@_}) }, + text => $page_obj->text, + page => $page + }, + \$out + ); + + return $req->new_response(200, [], $out); +} + +__PACKAGE__->meta->make_immutable; +no Moose; + +1; diff --git a/lib/Narwhal/RouteBuilder/HTTPMethod.pm b/lib/Narwhal/RouteBuilder/HTTPMethod.pm new file mode 100644 index 0000000..fb2f124 --- /dev/null +++ b/lib/Narwhal/RouteBuilder/HTTPMethod.pm @@ -0,0 +1,64 @@ +package Narwhal::RouteBuilder::HTTPMethod; +use Moose; + +with 'OX::RouteBuilder'; + +sub import { + my $meta = Class::MOP::class_of(caller); + $meta->add_route_builder( + class => __PACKAGE__, + route_spec => sub { + my $spec = shift; + return if ref($spec) || $spec !~ /^\w+$/; + return { + action => $spec, + }; + }, + ); +} + +sub compile_routes { + my $self = shift; + + my $spec = $self->route_spec; + my $params = $self->params; + + my ($defaults, $validations) = $self->extract_defaults_and_validations($params); + $defaults = { %$spec, %$defaults }; + + my $s = $self->service; + + return [ + $self->path, + defaults => $defaults, + target => sub { + my ($req) = @_; + + my %match = %{ $req->env->{'plack.router.match'}->mapping }; + my $a = $match{action}; + my $component = $s->get_dependency($a)->get; + my $method = lc($req->method); + + if ($component->can($method)) { + return $component->$method(@_); + } + elsif ($component->can('any')) { + return $component->any(@_); + } + else { + return [ + 500, + [], + ["Component $component has no method $method"] + ]; + } + + }, + validations => $validations, + ]; +} + +__PACKAGE__->meta->make_immutable; +no Moose; + +1; -- cgit v1.2.3-54-g00ecf