use warnings;
use base qw/DBIx::Class/;
-use Encode;
+BEGIN {
+
+ # Perl 5.8.0 doesn't have utf8::is_utf8()
+ # Yes, 5.8.0 support for Unicode is suboptimal, but things like RHEL3 ship with it.
+ if ($] <= 5.008000) {
+ require Encode;
+ } else {
+ require utf8;
+ }
+}
-__PACKAGE__->mk_classdata( force_utf8_columns => [] );
+__PACKAGE__->mk_classdata( '_utf8_columns' );
=head1 NAME
package Artist;
__PACKAGE__->load_components(qw/UTF8Columns Core/);
__PACKAGE__->utf8_columns(qw/name description/);
-
+
# then belows return strings with utf8 flag
$artist->name;
$artist->get_column('description');
sub utf8_columns {
my $self = shift;
- for (@_) {
- $self->throw_exception("column $_ doesn't exist")
- unless $self->has_column($_);
+ if (@_) {
+ foreach my $col (@_) {
+ $self->throw_exception("column $col doesn't exist")
+ unless $self->has_column($col);
+ }
+ return $self->_utf8_columns({ map { $_ => 1 } @_ });
+ } else {
+ return $self->_utf8_columns;
}
- $self->force_utf8_columns( \@_ );
}
=head1 EXTENDED METHODS
my ( $self, $column ) = @_;
my $value = $self->next::method($column);
- if ( { map { $_ => 1 } @{ $self->force_utf8_columns } }->{$column} ) {
- Encode::_utf8_on($value) unless Encode::is_utf8($value);
+ my $cols = $self->_utf8_columns;
+ if ( $cols and defined $value and $cols->{$column} ) {
+
+ if ($] <= 5.008000) {
+ Encode::_utf8_on($value) unless Encode::is_utf8($value);
+ } else {
+ utf8::decode($value) unless utf8::is_utf8($value);
+ }
}
$value;
my $self = shift;
my %data = $self->next::method(@_);
- for (@{ $self->force_utf8_columns }) {
- Encode::_utf8_on($data{$_}) if $data{$_} and !Encode::is_utf8($_);
+ foreach my $col (grep { defined $data{$_} } keys %{ $self->_utf8_columns || {} }) {
+
+ if ($] <= 5.008000) {
+ Encode::_utf8_on($data{$col}) unless Encode::is_utf8($data{$col});
+ } else {
+ utf8::decode($data{$col}) unless utf8::is_utf8($data{$col});
+ }
}
%data;
sub store_column {
my ( $self, $column, $value ) = @_;
- if ( { map { $_ => 1 } @{ $self->force_utf8_columns } }->{$column} ) {
- Encode::_utf8_off($value) if Encode::is_utf8($value);
+ my $cols = $self->_utf8_columns;
+ if ( $cols and defined $value and $cols->{$column} ) {
+
+ if ($] <= 5.008000) {
+ Encode::_utf8_off($value) if Encode::is_utf8($value);
+ } else {
+ utf8::encode($value) if utf8::is_utf8($value);
+ }
}
$self->next::method( $column, $value );