Projekt

Allgemein

Profil

Herunterladen (2,87 KB) Statistiken
| Zweig: | Markierung: | Revision:
package SL::DB::Helper::Attr;

use strict;

sub auto_make {
my ($package, %params) = @_;

for my $col ($package->meta->columns) {
next if $col->primary_key_position; # don't make attr helper for primary keys
_make_by_type($package, $col->name, $col->type);
}

return $package;
}

sub make {
my ($package, %params) = @_;

for my $name (keys %params) {
my @types = ref $params{$name} eq 'ARRAY' ? @{ $params{$name} } : ($params{$name});
for my $type (@types) {
_make_by_type($package, $name, $type);
}
}
return $package;
}



sub _make_by_type {
my ($package, $name, $type) = @_;
_as_number ($package, $name, places => -2) if $type =~ /numeric | real | float/xi;
_as_percent($package, $name, places => 0) if $type =~ /numeric | real | float/xi;
_as_number ($package, $name, places => 0) if $type =~ /int/xi;
_as_date ($package, $name) if $type =~ /date | timestamp/xi;
}

sub _as_number {
my $package = shift;
my $attribute = shift;
my %params = @_;

$params{places} = 2 if !defined($params{places});

no strict 'refs';
*{ $package . '::' . $attribute . '_as_number' } = sub {
my ($self, $string) = @_;

$self->$attribute($::form->parse_amount(\%::myconfig, $string)) if @_ > 1;

return $::form->format_amount(\%::myconfig, $self->$attribute, $params{places});
};
}

sub _as_percent {
my $package = shift;
my $attribute = shift;
my %params = @_;

$params{places} = 2 if !defined($params{places});

no strict 'refs';
*{ $package . '::' . $attribute . '_as_percent' } = sub {
my ($self, $string) = @_;

$self->$attribute($::form->parse_amount(\%::myconfig, $string) / 100) if @_ > 1;

return $::form->format_amount(\%::myconfig, 100 * $self->$attribute, $params{places});
};

return 1;
}

sub _as_date {
my $package = shift;
my $attribute = shift;
my %params = @_;

no strict 'refs';
*{ $package . '::' . $attribute . '_as_date' } = sub {
my ($self, $string) = @_;

if (@_ > 1) {
if ($string) {
my ($yy, $mm, $dd) = $::locale->parse_date(\%::myconfig, $string);
$self->$attribute(DateTime->new(year => $yy, month => $mm, day => $dd));
} else {
$self->$attribute(undef);
}
}

return $self->$attribute
? $::locale->reformat_date(
{ dateformat => 'yy-mm-dd' },
( $self->$attribute eq 'now'
? DateTime->now
: $self->$attribute
)->ymd,
$::myconfig{dateformat}
)
: undef;
};

return 1;
}

1;


1;

__END__

=head1 NAME

SL::DB::Helpers::Attr - attribute helpers

=head1 SYNOPSIS

use SL::DB::Helpers::Attr;
SL::DB::Helpers::Attr::make($class,
method_name => 'numeric(15,5)',
datemethod => 'date'
);
SL::DB::Helpers::Attr::auto_make($class);

=head1 DESCRIPTION

=head1 FUNCTIONS

=head1 BUGS

=head1 AUTHOR

=cut
(2-2/7)