moved shit to trunk
[catagits/Reaction.git] / lib / Catalyst / Model / Reaction / InterfaceModel / DBIC.pm
1 package Catalyst::Model::Reaction::InterfaceModel::DBIC;
2
3 use Reaction::Class;
4
5 use Catalyst::Utils;
6 use Catalyst::Component;
7 use Class::MOP;
8
9 #XXX so yeah, thisis kinda hacky. big whop though, i need it.
10 #this may just all together go away in the future
11
12 class DBIC, is 'Reaction::Object', is 'Catalyst::Component', which {
13
14   has  '_schema' => (isa => 'DBIx::Class::Schema', is => 'ro', required => 1);
15
16   implements 'COMPONENT' => as {
17     my ($class, $app, $args) = @_;
18     my %cfg = %{ Catalyst::Utils::merge_hashes($class->config, $args) };
19
20     my $im_class = $cfg{im_class};
21     Class::MOP::load_class($im_class);
22
23     my $model_name = $class;
24     $model_name =~ s/^[\w:]+::(?:Model|M):://;
25
26     #XXXthis could be cut out later for a more elegant method
27     my @domain_models = $im_class->domain_models;
28     confess "Unable to locate domain model in ${im_class}"
29       if @domain_models < 1;
30     confess 'ModelBase does not yet support multiple domain models'
31       if @domain_models > 1;
32     my $domain_model = shift @domain_models;
33     my $schema_class = $domain_model->_isa_metadata;
34     Class::MOP::load_class($schema_class);
35
36     {
37       #I should probably MOPize this at some point maybe? nahhhh
38       #XXXMaybe I should just fix CRUDController and eliminate this shit period.
39       #pure bloat and namespace pollution
40       no strict 'refs';
41       foreach my $collection ( $im_class->parameter_attributes ){
42         my $classname = join '::', $class, $collection->name, 'ACCEPT_CONTEXT';
43         my $reader  = $collection->get_read_method;
44         *$classname = sub{ $_[1]->model($model_name)->$reader };
45       }
46     }
47
48     my $params = $cfg{db_params} || {};
49     my $schema = $schema_class
50       ->connect($cfg{db_dsn}, $cfg{db_user}, $cfg{db_password}, $params);
51
52     return $class->new(_schema => $schema);
53   };
54
55   implements 'ACCEPT_CONTEXT' => as {
56     my ($self, $ctx) = @_;
57     return $self->CONTEXTUAL_CLONE($ctx) unless ref $ctx;
58     return $ctx->stash->{ref($self)} ||= $self->CONTEXTUAL_CLONE($ctx);
59   };
60
61   #XXXto do build in support for RestrictByUser natively or by subclass
62   implements 'CONTEXTUAL_CLONE' => as {
63     my ($self, $ctx) = @_;
64     my $schema = $self->_schema->clone;
65
66     my $im_class = $self->config->{im_class};
67
68     #XXXthis could be cut out later for a more elegant method
69     my @domain_models = $im_class->domain_models;
70     confess "Unable to locate domain model in ${im_class}"
71       if @domain_models < 1;
72     confess 'ModelBase does not yet support multiple domain models'
73       if @domain_models > 1;
74     my $domain_model = shift @domain_models;
75
76     return $im_class->new($domain_model->name => $schema);
77   };
78
79 };
80
81
82 1;
83
84 =head1 NAME
85
86 Catalyst::Model::Reaction::InterfaceModel::DBIC
87
88 =head1 DESCRIPTION
89
90 =head2 COMPONENT
91
92 =head2 ACCEPT_CONTEXT
93
94 =head2 CONTEXTUAL_CLONE
95
96 =head1 CONFIG OPTIONS
97
98 =head2 db_dsn
99
100 =head2 db_user
101
102 =head2 db_password
103
104 =head2 db_params
105
106 =head2 im_class
107
108 =head1 AUTHORS
109
110 See L<Reaction::Class> for authors.
111
112 =head1 LICENSE
113
114 See L<Reaction::Class> for the license.
115
116 =cut