[Catalyst] Global 'helper' methods

Craig Chant craig at homeloanpartnership.com
Tue Oct 30 14:39:59 GMT 2012


Well I opted for putting my globals (methods and constants) in MyApp.pm

It's working grand with $c->myMethod or $c->MY_CONSTANT

I use to have them working as a bareword within my application , but $c->MY_CONSTANT is just as easy!

Many thanks for all the input and help, it really is appreciated.

-----Original Message-----
From: Lukas Thiemeier [mailto:spamcatcher at thiemeier.net]
Sent: 30 October 2012 13:56
To: catalyst at lists.scsys.co.uk
Subject: Re: [Catalyst] Global 'helper' methods

Hi Craig,

Writing helpers in your main App.pm and using roles is not either-or.

Roles are one possibility to modify your classes in a reusable way.

If your helpers are really global, which means that they are used by all, or almost all your controllers, I would put them into your main application class.

If you have more than one application which make use of the same
helpers: Put them into a role:

YourHelperRole.pm:

  package YourHelperRole;
  use Moose::Role;

  has "some_attribute" => ( ... ); # if you need attributes

  sub helpermethod1{
        my ($self, $other, $args) = @_;
        do_something();
  }

  sub helpermethod2{
        my ($self, $other, $args) = @_;
        do_something_different();
  }

  no Moose::Role; # or use namespace::autoclean or MooseX::MarkAsMethod
  1;

App.pm:

  use Catalyst qw( ... );
  extends "Catalyst";
  with qw/YourHelperRole/;

  ...

In my opinion, extending your main App.pm with roles is only useful if you need the same helpers in different locations, too.
If you only need them for that single application,  avoid the overhead related to using roles.

If you have helpers which are only needed by some controllers, create a role for your controllers. You can not only implement helpers in you roles, you can also create method-modifiers, which change the way your methods behave.

Here is an example, which writes sth to the log, after the "delete"
method was called:

YourLogRole.pm:

  package YourLogRole;

  use Moose::Role;
  requires qw/delete/; #die if the consuming class has no "delete"

  after "delete" => sub{
        my ($self, $c) = @_;
        $c->log->debug("DELETE called");
  };

  no Moose::Role;
  1;

Controller1.pm: (has the helpers, but no logging)

  package Controller1;
  use Moose;
  extends "Catalyst::Controller";
  with qw/
        YourHelperRole
  /;

  sub someaction :Local {
        my ($self, $c) =@_;
        $self->helpermethod1();
  }

  ...

Controller2.pm: (has helpers AND logging)

  package Controller2;
  use Moose;
  extends "Catalyst::Controller";
  with qw/
        YourLogRole
        YourHelperRole
  /;

  sub delete :Local :Args(1) { ... }

Controller3.pm (has logging, but no helpers)

  package Controller3;
  use Moose;
  extends "Catalyst::Controller";
  with qw/
        YourLogRole
  /;

  sub delete :Local :Args(1) { ... }

Roles are very powerful tools. I use them a lot.
Read the Moose docs for more information.

If you don't want to learn Moose, roles and so on now, just remember:

1. write sth in a role
2. consume the role in a moose class, using "with"
3. your roles methods and attributes will be available in the consuming class

Lukas

On 10/30/2012 02:03 PM, Craig Chant wrote:
> Hi,
>
>
>
> Please could you advise the best way of having a global 'helper' class
> that has all commonly used methods in it accessible for any part of
> the catalyst app.
>
>
>
> I found this thread
> http://stackoverflow.com/questions/11941836/catalyst-global-subroutine
> s
>
>
>
> With one indicating it's ok to put them in the main MyApp.pm and
> another saying to use Moose & Roles.
>
>
>
> What is considered the correct way and could you provide an example of
> how I create this helper class and bolt it to the Catalyst application.
>
>
>
> Many thanks,
>
>
>
> */Craig Chant/*
>
> I.T. Manager
>
> Description: cid:image001.png at 01CD5F4A.17E848D0
>
> Main Line            01903 602664
>
> Direct Line           01903 227753
>
> Visit our website http://www.homeloanpartnership.com
>
> *HomeLoan Partnership have been named the Best Mortgage Network, 2012,
> at the myintroducer.com Industry Awards*
>
>
>
> This Email and any attachments contain confidential information and is
> intended solely for the individual to whom it is addressed. If this
> Email has been misdirected, please notify the author as soon as
> possible. If you are not the intended recipient you must not disclose,
> distribute, copy, print or rely on any of the information contained,
> and all copies must be deleted immediately. Whilst we take reasonable
> steps to try to identify any software viruses, any attachments to this
> e-mail may nevertheless contain viruses, which our anti-virus software
> has failed to identify. You should therefore carry out your own
> anti-virus checks before opening any documents. HomeLoan Partnership
> will not accept any liability for damage caused by computer viruses
> emanating from any attachment or other document supplied with this e-mail.
> HomeLoan Partnership reserves the right to monitor and archive all
> e-mail communications through its network. No representative or
> employee of HomeLoan Partnership has the authority to enter into any
> contract on behalf of HomeLoan Partnership by email. HomeLoan
> Partnership is a trading name of H L Partnership Limited, registered
> in England and Wales with Registration Number 5011722. Registered
> office: 26-34 Old Street, London, EC1V 9QQ. H L Partnership Limited is
> authorised and regulated by the Financial Services Authority.
>
>
> _______________________________________________
> List: Catalyst at lists.scsys.co.uk
> Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
> Searchable archive:
> http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
> Dev site: http://dev.catalyst.perl.org/


_______________________________________________
List: Catalyst at lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/
This Email and any attachments contain confidential information and is intended solely for the individual to whom it is addressed. If this Email has been misdirected, please notify the author as soon as possible. If you are not the intended recipient you must not disclose, distribute, copy, print or rely on any of the information contained, and all copies must be deleted immediately. Whilst we take reasonable steps to try to identify any software viruses, any attachments to this e-mail may nevertheless contain viruses, which our anti-virus software has failed to identify. You should therefore carry out your own anti-virus checks before opening any documents. HomeLoan Partnership will not accept any liability for damage caused by computer viruses emanating from any attachment or other document supplied with this e-mail. HomeLoan Partnership reserves the right to monitor and archive all e-mail communications through its network. No representative or employee of HomeLoan Partnership has the authority to enter into any contract on behalf of HomeLoan Partnership by email. HomeLoan Partnership is a trading name of H L Partnership Limited, registered in England and Wales with Registration Number 5011722. Registered office: 26-34 Old Street, London, EC1V 9QQ. H L Partnership Limited is authorised and regulated by the Financial Services Authority.



More information about the Catalyst mailing list