Commit | Line | Data |
75d07914 |
1 | package # hide from PAUSE |
c0e7b4e5 |
2 | DBIx::Class::Componentised; |
227d4dee |
3 | |
bf5ecff9 |
4 | use strict; |
5 | use warnings; |
6 | |
48a76fcf |
7 | use base 'Class::C3::Componentised'; |
d38cd95c |
8 | use mro 'c3'; |
9 | |
70c28808 |
10 | use DBIx::Class::Carp '^DBIx::Class|^Class::C3::Componentised'; |
64c50e81 |
11 | use namespace::clean; |
3c2a505c |
12 | |
d38cd95c |
13 | # this warns of subtle bugs introduced by UTF8Columns hacky handling of store_column |
1415f198 |
14 | # if and only if it is placed before something overriding store_column |
d38cd95c |
15 | sub inject_base { |
16 | my $class = shift; |
1415f198 |
17 | my ($target, @complist) = @_; |
d38cd95c |
18 | |
1415f198 |
19 | # we already did load the component |
05d90040 |
20 | my $keep_checking = ! ( |
21 | $target->isa ('DBIx::Class::UTF8Columns') |
22 | || |
23 | $target->isa ('DBIx::Class::ForceUTF8') |
24 | ); |
d38cd95c |
25 | |
3c2a505c |
26 | my @target_isa; |
7146f619 |
27 | |
1415f198 |
28 | while ($keep_checking && @complist) { |
29 | |
05d90040 |
30 | @target_isa = do { no strict 'refs'; @{"$target\::ISA"} } |
31 | unless @target_isa; |
32 | |
1415f198 |
33 | my $comp = pop @complist; |
7146f619 |
34 | |
3c2a505c |
35 | # warn here on use of either component, as we have no access to ForceUTF8, |
36 | # the author does not respond, and the Catalyst wiki used to recommend it |
37 | for (qw/DBIx::Class::UTF8Columns DBIx::Class::ForceUTF8/) { |
38 | if ($comp->isa ($_) ) { |
39 | $keep_checking = 0; # no use to check from this point on |
70c28808 |
40 | carp_once "Use of $_ is strongly discouraged. See documentation of DBIx::Class::UTF8Columns for more info\n" |
41 | unless $ENV{DBIC_UTF8COLUMNS_OK}; |
3c2a505c |
42 | last; |
43 | } |
44 | } |
72ae8e40 |
45 | |
3c2a505c |
46 | # something unset $keep_checking - we got a unicode mangler |
47 | if (! $keep_checking) { |
1415f198 |
48 | |
3c2a505c |
49 | my $base_store_column = do { require DBIx::Class::Row; DBIx::Class::Row->can ('store_column') }; |
05d90040 |
50 | |
1415f198 |
51 | my @broken; |
52 | for my $existing_comp (@target_isa) { |
53 | my $sc = $existing_comp->can ('store_column') |
54 | or next; |
55 | |
56 | if ($sc ne $base_store_column) { |
57 | require B; |
58 | my $definer = B::svref_2object($sc)->STASH->NAME; |
59 | push @broken, ($definer eq $existing_comp) |
60 | ? $existing_comp |
61 | : "$existing_comp (via $definer)" |
62 | ; |
63 | } |
7146f619 |
64 | } |
65 | |
1415f198 |
66 | carp "Incorrect loading order of $comp by $target will affect other components overriding 'store_column' (" |
d38cd95c |
67 | . join (', ', @broken) |
7146f619 |
68 | .'). Refer to the documentation of DBIx::Class::UTF8Columns for more info' |
1415f198 |
69 | if @broken; |
d38cd95c |
70 | } |
7146f619 |
71 | |
1415f198 |
72 | unshift @target_isa, $comp; |
d38cd95c |
73 | } |
74 | |
1415f198 |
75 | $class->next::method(@_); |
d38cd95c |
76 | } |
efe6365b |
77 | |
227d4dee |
78 | 1; |