summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2011-02-17 18:57:19 -0600
committerJesse Luehrs <doy@tozt.net>2011-02-17 18:57:19 -0600
commita7c37d5489611bf79889dd689abb0ac686d640c9 (patch)
tree68d9b965c581dcc049c36b5e6a5d9b877ff0312b /lib
parent251066735d9b3392ba7ea35da2fc0d6cd896e3a1 (diff)
downloadnarwhal-a7c37d5489611bf79889dd689abb0ac686d640c9.tar.gz
narwhal-a7c37d5489611bf79889dd689abb0ac686d640c9.zip
refactor this a bit
Diffstat (limited to 'lib')
-rw-r--r--lib/Narwhal.pm15
-rw-r--r--lib/Narwhal/Component/Wiki.pm65
-rw-r--r--lib/Narwhal/Component/Wiki/Edit.pm68
-rw-r--r--lib/Narwhal/Component/Wiki/Page.pm53
-rw-r--r--lib/Narwhal/RouteBuilder/HTTPMethod.pm64
5 files changed, 196 insertions, 69 deletions
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;