[Dancer-users] Modular approach without anonymous subrefs

Alfie John alfiej at opera.com
Tue Sep 25 01:01:24 CEST 2012


Hi guys,

I'm new to Dancer but this is the way that I've gone down too. I'll
probably get scorned on the list since I'm not yet sure on best
practices (and there are probably hooks to do what I want), but I've
also wrapped the methods so I can do other things around *all* requests:

Note that I'm doing this for an JSON API:

# {{{ API Version 1

  prefix '/some/url/v1';

  get '/url1' => handle( &My::Module1::Method1 );
  get '/url2' => handle( &My::Module2::Method2 );
  ...
  get '/urlN' => handle( &My::ModuleN::MethodN );

# }}}

sub Handle {
  my ( $handler ) = @_;

  set serializer => 'JSON';

  my $result;

  return sub {
    my $user = ...

    if ( not $user ) {
      log_stuff();
      client_error( "User not found or incorrect password", 401 );
    }

    var user => $user;

    other_stuff();

    $result = $handler->( @_ );
  };

  if ( $@ ) {
    status( 500 );
    error( $@ );

    return {
      Status            => 'Error',
      ErrorMessage => 'Internal server error',
    };
  }

  return $result;
}

# where client_error() is just a convenience method around send_error()
and logging

There's probably a better way at doing this but I couldn't find the
rights hooks at the time where I needed them for each step while
developing. This works for me so I'll be sticking with it for now. If
somebody has a better solution I'd like to know for the next project (or
v2) :)

(Also, if you're wondering why the exception handler, I needed to
customise the JSON response.)

Alfie

On Tue, Sep 25, 2012, at 12:03 AM, Stefan Hornburg (Racke) wrote:
> On 09/24/2012 03:24 PM, Alex C wrote:
> > On 23 September 2012 01:27, gvim<gvimrc at gmail.com>  wrote:
> >> I'm converting a CGI::Application web app to Dancer and have always used a
> >> modular approach so am I missing something if I prefer to do it this way:
> >
> > I think this is a very nice technique. My Routes.pm is growing to
> >> 3000 lines and I think I will refactor it using this same technique
> > you have suggested.
> >
> > The only disadvantage I can think of, is if you have many routes, then
> > that might slow down startup as each file has to be read from disk.
> >
> > Alex
> 
> IMHO that should be negligible on a decent system, especially as already
> read a lot of files (modules from Dancer and prerequisites).
> 
> In most cases (code) maintenance costs are greater than costs for
> resources.
> 
> Regards
> 	Racke
> 
> -- 
> LinuXia Systems => http://www.linuxia.de/
> Expert Interchange Consulting and System Administration
> ICDEVGROUP => http://www.icdevgroup.org/
> Interchange Development Team
> 
> _______________________________________________
> Dancer-users mailing list
> Dancer-users at perldancer.org
> http://www.backup-manager.org/cgi-bin/listinfo/dancer-users


-- 
  Alfie John
  alfiej at opera.com


More information about the Dancer-users mailing list