# $Id: /local/Mango/trunk/lib/Mango/Catalyst/Model/Provider.pm 259 2007-05-28T05:46:50.036668Z claco $
use strict;
BEGIN {
use base qw/Catalyst::Model Class::Accessor::Grouped/;
use Scalar::Util qw/blessed/;
__PACKAGE__->mk_group_accessors('inherited', qw/_provider_class _provider/);
};
sub COMPONENT {
my $self = shift->new(@_);
if (my $provider_class = delete $self->{'provider_class'}) {
$self->provider_class($provider_class);
};
if (!$self->provider_class) {
Mango::Exception->throw('PROVIDER_CLASS_NOT_SPECIFIED');
};
## hack for Handel Storage setup
## should fix this
my %config = %{$self};
delete $config{'_provider_class'};
delete $config{'_provider'};
$self->provider(
$self->provider_class->new({
connection_info => $_[0]->config->{'connection_info'},
%config
})
);
return $self;
};
sub provider_class {
my ($self, $provider_class) = @_;
if ($provider_class) {
if (!Class::Inspector->loaded($provider_class)) {
eval "use $provider_class"; ## no critic;
if ($@) {
Mango::Exception->throw('PROVIDER_CLASS_NOT_LOADED', $provider_class, $@);
};
};
$self->_provider_class($provider_class);
};
return $self->_provider_class;
};
sub provider {
my ($self, $provider) = @_;
if ($provider) {
$self->_provider($provider);
} elsif (!$self->_provider) {
## hack for Handel Storage setup
## should fix this
my %config = %{$self};
delete $config{'_provider_class'};
delete $config{'_provider'};
$self->_provider(
$self->provider_class->new(\%config)
);
$self->_provider_class(blessed $provider);
};
return $self->_provider;
};
sub AUTOLOAD {
my ($method) = (our $AUTOLOAD =~ /([^:]+)$/);
return if $method =~ /(DESTROY|ACCEPT_CONTEXT)/;
return shift->provider->$method(@_);
};
1;
__END__
=head1 NAME
Mango::Catalyst::Model::Provider - Catalyst::Model/Mango::Provider glue
=head1 DESCRIPTION
Mango::Catalyst::Model::Provider provides glue between Mango::Providers and
Catalyst models
=head1 CONFIGURATION
The following configuration options are used directly by this model:
=over
=item provider_class
See L</provider_class> for more information.
=back
All other configuration options are passed directly into
L<Mango::Provider/setup> for use by the providers themselves.
=head1 METHODS
=head2 COMPONENT
Creates an instance of the specified provider class, configures it and returns
the new model.
=head2 AUTOLOAD
Forwards all method calls to the underlying provider instance.
my $it = $model->search;
## same as this, but don't do that
my $it = $model->provider->search;
=head2 provider_class
=over
=item Arguments: $provider_class
=back
Gets/sets the provider class to be used by the current model.
$model->provider_class('Mango::Provider::Carts');
print ref $model->provider; # Mango::Provider::Carts
=head2 provider
Gets/sets the provider instance to used by the current model.
my $provider = $model->provider;
If the provider class is specified and no provider instance exists, one will
be created automatically using the available configuration.
=head1 SEE ALSO
L<Mango::Provider>, L<Mango::Provider::DBIC>
=head1 AUTHOR
Christopher H. Laco
CPAN ID: CLACO
claco@chrislaco.com