[Catalyst] Two questions regarding components
Christian Hansen
ch at ngmedia.com
Tue Jun 28 17:24:53 CEST 2005
On 2005-06-28, at 16.55, Bernhard Bauer wrote:
> 1. As far as I can tell, every component is require'd and instantiated
> via new(). The instances are then stored in
> $c->components->{$component_name}, making them some sort of singleton
> objects. While this makes sense to me for controllers (which don't
> carry a state) and views (which really are Adapters to the respective
> template system), I see some problems here for models.
All packages that lives in MyApp::[MVC]|Model|View|Controller are
loaded during setup, but only components that inherit from
Catalyst::Base are instantiated.
> Specifically, is there a way to make new() in the base class for your
> application models setup the model (and return the package name for
> example) while having new() in a derived class return a new instance?
> Or could the Engine maybe call a method shared_instance() which
> returns the singleton instance of the component, while new() returns a
> new instance every time it is called?
You don't have to do anything, just don't inherit from Catalyst::Base
and your component will be loaded and available in $c->component.
$c->component('MyApp::Model::Package') will return the class.
> 2. Is there a way for a plugin (or component) which depends on another
> plugin to load it? For example, have a controller which uses
> Catalyst::Plugin::Textile load it at startup without having to
> explicitly specify it in the plugin list?
Currently not, but i usually document it and do a check in setup:
sub setup {
my $c = shift;
unless ( $c->isa('Catalyst::Plugin::Textile') ) {
die __PACKAGE__ . ' requires Catalyst::Plugin::Textile';
}
$c->NEXT::setup;
}
--
Christian Hansen
nGmedia
+46 40 660 17 50
More information about the Catalyst
mailing list