On 1 Jan 2012, at 04:58, Bill Moseley wrote:
Then I have Controller classes inheriting from this class that are simply config setting the "model_class" attribute:

package MyApp::Controller::Service::Bolt;
use base 'MyApp::ControllerBase::Inventory;
__PACKAGE__->config(  model_class => 'Inventory::Bolt',);
1;

Which means the base class just does $c->model( $self->model_class ) to get at the Inventory::Bolt model.

Then, likewise, I have a Model base class that uses ACCEPT_CONTEXT to return specific instances:

package MyApp::ModelBase::Inventory;
use Moose;
use namespace::autoclean;
extends 'Catalyst::Model';

has service => ( is => 'rw' );  # instance of model

has service_class => (
    is => 'ro',
    isa => 'Str',
    required => 1,
);


# wrapping "setup_components" might be another approach
sub ACCEPT_CONTEXT {
    my ( $self, $c, @args ) = @_;

    my $service = $self->service;

    unless ( $service ) {
        my $service_class = $self->service_class;
        Class::MOP::load_class( $service_class );

        $service = $service_class->new;

        # Save our instance
        $self->service( $service );
    }

    return $service;
}


__PACKAGE__->meta->make_immutable;
1;

And then the specific model classes are simply:

package MyApp::Model::Inventory::Bolt;
use base 'MyApp::ModelBase::Inventory';
__PACKAGE__->config( service_class => 'Inventory::Service::Bolt' );
1;

Of course, after doing that a few times I'd rather use a programatic solution.


Why are you messing around with ACCEPT_CONTEXT to do this?

Why not just use COMPONENT to return the service class once?

I.E., what does your current solution do which using Catalyst::Model::Adaptor doesn't do (and that does the initialisation of the service classes as startup, rather than at first request - which is nicer for catching issues, and memory usage).

So, what I'd like is to remove the need to create those stub Controller and Model classes and instead use config (or maybe detection of available subclasses at startup).

Have a look at this:

https://github.com/bobtfish/CatalystX-JobServer/blob/master/lib/CatalystX/JobServer/Web/Plugin/ModelsFromConfig.pm #L7

Which is code to do exactly what you want - i.e. setup any models there is config for, but which don't have an explicit class on-disk, and then go on to setup controllers for each model setup.

Cheers
t0m


_______________________________________________
List: [email protected]
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/[email protected]/
Dev site: http://dev.catalyst.perl.org/

Reply via email to