Re: [Catalyst] access stash outside methods

2007-08-22 Thread Jason Kohles

On Aug 21, 2007, at 3:48 PM, Aditya Verma wrote:


Hi All,

I want all of my controllers to register there respective URLs with  
description. this data will be used in template to create dynamic  
HTML pages.

controllers will register URLs at catalyst startup.

I have to store this data into variable (not in any file or  
database) which will be accessible in all the controllers.
To get the registration work I have to write statement outside of  
all controller methods to execute the same at the time of catalyst  
startup.


hope you guys can understand my requirement.

Data that only gets registered at startup like this doesn't belong in  
the stash anyway, I usually do this with class data...


package MyApp::Controller;
use base qw( Catalyst::Controller );
__PACKAGE__-mk_classdata( 'url_descriptions' = {} );

sub describe_url {
my ( $self, $url, $description ) = @_;

my $class = ref( $self ) || $self;
$class-url_descriptions-{ $url } = $description;
}


package MyApp::Controller::Root;
use base qw( MyApp::Controller );
__PACKAGE__-describe_url( '/' = 'The Main Page' );


package MyApp::Controller::PageListing;
use base qw( MyApp::Controller );
use Class::Inspector;

sub assemble_url_descriptions {
my ( $self ) = @_;

my %descriptions = ();
for my $class ( Class::Inspector-subclasses( 'MyApp::Controller' ) ) {
while ( my ( $url, $desc ) = each %{ $class-url_descriptions } 
) {
$descriptions{ $url } = $desc;
}
}

return \%descriptions;
}

--
Jason Kohles
[EMAIL PROTECTED]
http://www.jasonkohles.com/
A witty saying proves nothing.  -- Voltaire



___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


[Catalyst] access stash outside methods

2007-08-21 Thread Aditya Verma
Hi,

I am running catalyst under apache configured with mod_perl.

Can I somehow access stash out methods.

I want to declare a global variable inside controller and outside methods
which will be accessible in all controllers.
stash could be a solution but outside methods context object is not
available so i don't have access to stash.

please help me solve the problem.

Thanks,
Aditya
___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] access stash outside methods

2007-08-21 Thread Aditya Verma
Hi All,

I want all of my controllers to register there respective URLs with
description. this data will be used in template to create dynamic HTML
pages.
controllers will register URLs at catalyst startup.

I have to store this data into variable (not in any file or database) which
will be accessible in all the controllers.
To get the registration work I have to write statement outside of all
controller methods to execute the same at the time of catalyst startup.

hope you guys can understand my requirement.

Thanks,
Aditya

On 8/21/07, John Napiorkowski [EMAIL PROTECTED] wrote:


 --- Aditya Verma [EMAIL PROTECTED] wrote:

  Hi,
 
  I am running catalyst under apache configured with
  mod_perl.
 
  Can I somehow access stash out methods.
 
  I want to declare a global variable inside
  controller and outside methods
  which will be accessible in all controllers.
  stash could be a solution but outside methods
  context object is not
  available so i don't have access to stash.
 
  please help me solve the problem.
 
  Thanks,
  Aditya

 Hi,

 I may not fully understand your use case, but
 typically the stash is used for a particular context,
 not as a global thing.

 You can alway pass the context to methods that need
 it.  I know it seems cumbersome, but the reason is to
 make you really think if you need it, the idea being
 that you should try to decouple your context as much
 as possible.

 If you need some global information there are a few
 ways I can think of:

 1) put it into the configuration file.  This is great
 for static stuff, like admin email address, etc.
 2) Create a model that provides the information you
 need.  If this information is based on the current
 context you can inherit from
 Catalyst::Component::ACCEPT_CONTEXT to build it.
 3) Create a base controller with a method that gets
 the information you need.  The have the controllers
 that need this information inherit from that.

 You might get the suggestion to make this a catalyst
 plugin, but that's no longer recommended best
 practices.  Plugins should be reserved for when you
 are trulying enhancing/extending the basic Catalyst
 features.

 Please share with us the details of the use case and
 maybe we can help.

 --John




 
 Choose the right car based on your needs.  Check out Yahoo! Autos new Car
 Finder tool.
 http://autos.yahoo.com/carfinder/

 ___
 List: Catalyst@lists.rawmode.org
 Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
 Searchable archive:
 http://www.mail-archive.com/catalyst@lists.rawmode.org/
 Dev site: http://dev.catalyst.perl.org/

___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] access stash outside methods

2007-08-21 Thread Jonathan Rockway
Aditya Verma wrote:
 Hi All,

 I want all of my controllers to register there respective URLs with
 description. this data will be used in template to create dynamic HTML
 pages.
 controllers will register URLs at catalyst startup.

 I have to store this data into variable (not in any file or database)
 which will be accessible in all the controllers.
 To get the registration work I have to write statement outside of all
 controller methods to execute the same at the time of catalyst startup. 

How about using attributes?

   pacakge MyApp::Controller::Anything;
   use base 'MyApp::Controler::HasDescription';
  
   sub some_action
  :Path :Args(1) :URL('/some_action/*') :Description('Some
action!') {
  # your action
   }
   # etc.

Those get parsed at startup time, and you can probably shove them in
$app-config or somewhere similarly convenient.  You can also just walk
all actions and look for the URL and Description attributes.  This is
pretty easy to do, but I don't know the details so I will let you glean
them from the code/docs. $c-action_for('/some_action')-attributes
should be close.  Have fun.

Regards,
Jonathan Rockway






signature.asc
Description: OpenPGP digital signature
___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/