Deprecate UTF8Columns with a lot of warning whistles
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Componentised.pm
CommitLineData
75d07914 1package # hide from PAUSE
c0e7b4e5 2 DBIx::Class::Componentised;
227d4dee 3
bf5ecff9 4use strict;
5use warnings;
6
48a76fcf 7use base 'Class::C3::Componentised';
d38cd95c 8use Carp::Clan qw/^DBIx::Class|^Class::C3::Componentised/;
9use mro 'c3';
10
3c2a505c 11my $warned;
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 15sub 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
40 carp "Use of $_ is strongly discouraged. See documentationm of DBIx::Class::UTF8Columns for more info\n"
41 unless ($warned->{UTF8Columns}++ || $ENV{DBIC_UTF8COLUMNS_OK});
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 781;