in reply to Re^3: OX and routing: how to declare something like /api/action.:format ($DEBUG++ MANIFEST)
in thread OX and routing: how to declare something like /api/action.:format

That's true, explicit declaration is kind of clean. But if I end up doing this in several projects, then I'll want to make a plugin out of it. I'm not sure how yet. Maybe a role that adds a router_REST function to OX?Adding a keyword would even be better, but I'm not sure how to go about that. (see Post Scriptum at the end of this message)

At the moment that seems to be OX's biggest weak points: the lack of shared plugins on CPAN. In a way its strength compensates for this: it's easy to leverage CPAN to write your own and plug them to a project. But still...

PS: So, how to add a keyword? Either it can simply be a function, which has to be declared earlier so that it doesn't need parenthesis (is that right?); I'm not sure how to achieve this with a role. Or one can create a keyword using the pluggable keyword. Unfortunately there seems to be a pretty steep learning curve (any link to a friendly tutorial?). Haha!! I just found Keyword::Simple, I don't know how good or bad that is. It is very new.

  • Comment on Re^4: OX and routing: how to declare something like /api/action.:format ($DEBUG++ MANIFEST)
  • Download Code

Replies are listed 'Best First'.
Re^5: OX and routing: how to declare something like /api/action.:format ($DEBUG++ MANIFEST)
by tobyink (Canon) on Dec 08, 2013 at 23:45 UTC

    Keyword::Simple is super easy to use. You choose a keyword, say, "foo", and set up a handler for it like this:

    package My::Keyword; use Keyword::Simple; sub import { Keyword::Simple::define(foo => \&_parse_foo); } sub _parse_foo { ...; } 1;

    Then when someone uses your keyword (this is at compile time!) the _parse_foo sub will be called. It will be given a single parameter: a scalar ref - the reference to the string of Perl code currently being compiled. Now the _parse_foo can change that string, to change what gets compiled by Perl.

    Syntax::Keyword::Val is a really simple example. The val keyword simply gets rewritten to Data::Lock::dlock my, so when people code this:

    val $foo = 42;

    That Perl code is rewritten to:

    Data::Lock::dlock my $foo = 42;

    Moops employs a lot of Keyword::Simple trickery.

    use Moops; class Cow :rw { has name => (default => 'Ermintrude') }; say Cow->new->name
      Cheers Toby! You made me much more confident to use it :-)