line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Catalyst::TraitFor::Model::DBIC::Schema::SchemaProxy; |
2
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
4674
|
use namespace::autoclean; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
15
|
|
4
|
1
|
|
|
1
|
|
99
|
use Moose::Role; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
10
|
|
5
|
1
|
|
|
1
|
|
6357
|
use Carp::Clan '^Catalyst::Model::DBIC::Schema'; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
10
|
|
6
|
1
|
|
|
1
|
|
124
|
use Catalyst::Model::DBIC::Schema::Types 'Schema'; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
18
|
|
7
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
=head1 NAME |
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
Catalyst::TraitFor::Model::DBIC::Schema::SchemaProxy - Proxy Schema Methods and |
11
|
|
|
|
|
|
|
Options from Model |
12
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
=head1 DESCRIPTION |
14
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
Allows you to call your L<DBIx::Class::Schema> methods directly on the Model |
16
|
|
|
|
|
|
|
instance, and passes config options to your L<DBIx::Class::Schema> and |
17
|
|
|
|
|
|
|
L<DBIx::Class::ResultSet> attributes at C<BUILD> time. |
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
Methods and attributes local to your C<Model> take precedence over |
20
|
|
|
|
|
|
|
L<DBIx::Class::Schema> or L<DBIx::Class::ResultSet> methods and attributes. |
21
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
=head1 CREATING SCHEMA CONFIG ATTRIBUTES |
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
To create attributes in your C<Schema.pm>, use either Moose or |
25
|
|
|
|
|
|
|
L<Class::Accessor::Grouped>, which is inherited from by all L<DBIx::Class> |
26
|
|
|
|
|
|
|
classes automatically. E.g.: |
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
__PACKAGE__->mk_group_accessors(simple => qw/ |
29
|
|
|
|
|
|
|
config_key1 |
30
|
|
|
|
|
|
|
config_key2 |
31
|
|
|
|
|
|
|
... |
32
|
|
|
|
|
|
|
/); |
33
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
Or with L<Moose>: |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
use Moose; |
37
|
|
|
|
|
|
|
has config_key1 => (is => 'rw', default => 'default_value'); |
38
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
This code can be added after the md5sum on L<DBIx::Class::Schema::Loader> |
40
|
|
|
|
|
|
|
generated schemas. |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
At app startup, any non-local options will be passed to these accessors, and can |
43
|
|
|
|
|
|
|
be accessed as usual via C<< $schema->config_key1 >>. |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
These config values go into your C<Model::DB> block, along with normal config |
46
|
|
|
|
|
|
|
values. |
47
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
=head1 CREATING RESULTSET CONFIG ATTRIBUTES |
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
You can create classdata on L<DBIx::Class::ResultSet> classes to hold values |
51
|
|
|
|
|
|
|
from L<Catalyst> config. |
52
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
The code for this looks something like this: |
54
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
package MySchema::ResultSet::Foo; |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
use base 'DBIx::Class::ResultSet'; |
58
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
__PACKAGE__->mk_group_accessors(inherited => qw/ |
60
|
|
|
|
|
|
|
rs_config_key1 |
61
|
|
|
|
|
|
|
rs_config_key2 |
62
|
|
|
|
|
|
|
... |
63
|
|
|
|
|
|
|
/); |
64
|
|
|
|
|
|
|
__PACKAGE__->rs_config_key1('default_value'); |
65
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
Or, if you prefer L<Moose>: |
67
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
package MySchema::ResultSet::Foo; |
69
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
use Moose; |
71
|
|
|
|
|
|
|
use MooseX::NonMoose; |
72
|
|
|
|
|
|
|
use MooseX::ClassAttribute; |
73
|
|
|
|
|
|
|
extends 'DBIx::Class::ResultSet'; |
74
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
sub BUILDARGS { $_[2] } # important |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
class_has rs_config_key1 => (is => 'rw', default => 'default_value'); |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
... |
80
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
__PACKAGE__->meta->make_immutable; |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
1; |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
In your catalyst config, use the generated Model name as the config key, e.g.: |
86
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
<Model::DB::Users> |
88
|
|
|
|
|
|
|
strict_passwords 1 |
89
|
|
|
|
|
|
|
</Model::DB::Users> |
90
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
=cut |
92
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
after setup => sub { |
94
|
|
|
|
|
|
|
my ($self, $args) = @_; |
95
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
my $schema = $self->schema; |
97
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
my $was_mutable = $self->meta->is_mutable; |
99
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
$self->meta->make_mutable; |
101
|
|
|
|
|
|
|
$self->meta->add_attribute('schema', |
102
|
|
|
|
|
|
|
is => 'rw', |
103
|
|
|
|
|
|
|
isa => Schema, |
104
|
|
|
|
|
|
|
handles => $self->_delegates # this removes the attribute too |
105
|
|
|
|
|
|
|
); |
106
|
|
|
|
|
|
|
$self->meta->make_immutable unless $was_mutable; |
107
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
$self->schema($schema) if $schema; |
109
|
|
|
|
|
|
|
}; |
110
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
after BUILD => sub { |
112
|
|
|
|
|
|
|
my ($self, $args) = @_; |
113
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
$self->_pass_options_to_schema($args); |
115
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
for my $source ($self->schema->sources) { |
117
|
|
|
|
|
|
|
my $config_key = 'Model::' . $self->model_name . '::' . $source; |
118
|
|
|
|
|
|
|
my $config = $self->app_class->config->{$config_key}; |
119
|
|
|
|
|
|
|
next unless $config; |
120
|
|
|
|
|
|
|
$self->_pass_options_to_resultset($source, $config); |
121
|
|
|
|
|
|
|
} |
122
|
|
|
|
|
|
|
}; |
123
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
sub _delegates { |
125
|
4
|
|
|
4
|
|
674
|
my $self = shift; |
126
|
|
|
|
|
|
|
|
127
|
4
|
|
|
|
|
173
|
my $schema_meta = Class::MOP::Class->initialize($self->schema_class); |
128
|
4
|
|
|
|
|
510
|
my @schema_methods = $schema_meta->get_all_method_names; |
129
|
|
|
|
|
|
|
|
130
|
|
|
|
|
|
|
# combine with any already added by other schemas |
131
|
4
|
|
|
|
|
10206
|
my @handles = eval { |
132
|
4
|
|
|
|
|
10
|
@{ $self->meta->find_attribute_by_name('schema')->handles } |
|
4
|
|
|
|
|
19
|
|
133
|
|
|
|
|
|
|
}; |
134
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
# now kill the attribute, otherwise add_attribute in BUILD will not do the right |
136
|
|
|
|
|
|
|
# thing (it clears the handles for some reason.) May be a Moose bug. |
137
|
4
|
|
|
|
|
550
|
eval { $self->meta->remove_attribute('schema') }; |
|
4
|
|
|
|
|
19
|
|
138
|
|
|
|
|
|
|
|
139
|
4
|
|
|
|
|
52530
|
my %schema_methods; |
140
|
4
|
|
|
|
|
163
|
@schema_methods{ @schema_methods, @handles } = (); |
141
|
4
|
|
|
|
|
71
|
@schema_methods = keys %schema_methods; |
142
|
|
|
|
|
|
|
|
143
|
4
|
|
|
|
|
27
|
my @my_methods = $self->meta->get_all_method_names; |
144
|
4
|
|
|
|
|
8052
|
my %my_methods; |
145
|
4
|
|
|
|
|
108
|
@my_methods{@my_methods} = (); |
146
|
|
|
|
|
|
|
|
147
|
4
|
|
|
|
|
10
|
my @delegates; |
148
|
4
|
|
|
|
|
19
|
for my $method (@schema_methods) { |
149
|
370
|
100
|
|
|
|
848
|
push @delegates, $method unless exists $my_methods{$method}; |
150
|
|
|
|
|
|
|
} |
151
|
|
|
|
|
|
|
|
152
|
4
|
|
|
|
|
125
|
return \@delegates; |
153
|
|
|
|
|
|
|
} |
154
|
|
|
|
|
|
|
|
155
|
|
|
|
|
|
|
sub _pass_options_to_schema { |
156
|
2
|
|
|
2
|
|
8
|
my ($self, $args) = @_; |
157
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
my @attributes = map { |
159
|
2
|
100
|
|
|
|
13
|
$_->init_arg || () |
|
30
|
|
|
|
|
426
|
|
160
|
|
|
|
|
|
|
} $self->meta->get_all_attributes; |
161
|
|
|
|
|
|
|
|
162
|
2
|
|
|
|
|
8
|
my %attributes; |
163
|
2
|
|
|
|
|
13
|
@attributes{@attributes} = (); |
164
|
|
|
|
|
|
|
|
165
|
2
|
|
|
|
|
13
|
for my $opt (keys %$args) { |
166
|
11
|
100
|
|
|
|
84
|
if (not exists $attributes{$opt}) { |
167
|
1
|
50
|
|
|
|
6
|
next unless $self->schema->can($opt); |
168
|
1
|
|
|
|
|
21
|
$self->schema->$opt($args->{$opt}); |
169
|
|
|
|
|
|
|
} |
170
|
|
|
|
|
|
|
} |
171
|
|
|
|
|
|
|
} |
172
|
|
|
|
|
|
|
|
173
|
|
|
|
|
|
|
sub _pass_options_to_resultset { |
174
|
2
|
|
|
2
|
|
9
|
my ($self, $source, $args) = @_; |
175
|
|
|
|
|
|
|
|
176
|
2
|
|
|
|
|
10
|
for my $opt (keys %$args) { |
177
|
2
|
|
|
|
|
11
|
my $rs_class = $self->schema->source($source)->resultset_class; |
178
|
2
|
100
|
|
|
|
307
|
next unless $rs_class->can($opt); |
179
|
1
|
|
|
|
|
36
|
$rs_class->$opt($args->{$opt}); |
180
|
|
|
|
|
|
|
} |
181
|
|
|
|
|
|
|
} |
182
|
|
|
|
|
|
|
|
183
|
|
|
|
|
|
|
=head1 SEE ALSO |
184
|
|
|
|
|
|
|
|
185
|
|
|
|
|
|
|
L<Catalyst::Model::DBIC::Schema>, L<DBIx::Class::Schema> |
186
|
|
|
|
|
|
|
|
187
|
|
|
|
|
|
|
=head1 AUTHOR |
188
|
|
|
|
|
|
|
|
189
|
|
|
|
|
|
|
See L<Catalyst::Model::DBIC::Schema/AUTHOR> and |
190
|
|
|
|
|
|
|
L<Catalyst::Model::DBIC::Schema/CONTRIBUTORS>. |
191
|
|
|
|
|
|
|
|
192
|
|
|
|
|
|
|
=head1 COPYRIGHT |
193
|
|
|
|
|
|
|
|
194
|
|
|
|
|
|
|
See L<Catalyst::Model::DBIC::Schema/COPYRIGHT>. |
195
|
|
|
|
|
|
|
|
196
|
|
|
|
|
|
|
=head1 LICENSE |
197
|
|
|
|
|
|
|
|
198
|
|
|
|
|
|
|
This program is free software, you can redistribute it and/or modify it |
199
|
|
|
|
|
|
|
under the same terms as Perl itself. |
200
|
|
|
|
|
|
|
|
201
|
|
|
|
|
|
|
=cut |
202
|
|
|
|
|
|
|
|
203
|
|
|
|
|
|
|
1; |