Apache-Wyrd
view release on metacpan or search on metacpan
Wyrd/Datum.pm view on Meta::CPAN
use 5.006;
use strict;
use warnings;
no warnings qw(uninitialized);
no warnings qw(redefine);
package Apache::Wyrd::Datum;
our $VERSION = '0.98';
use constant TYPE => 0;
use constant VALUE => 1;
use constant PARAMS => 2;
sub new {
my ($class, $value, $params) = @_;
my $data = [];
bless $data, $class;
$data->_init($value, $params);
return $data;
}
sub _init {
my ($self, $value, $params) = @_;
$value ||= _default_value();
$params ||= _default_params();
$self->_raise_exception("Params must be a hashref") if (ref($params) ne 'HASH');
my $defaults = $self->_default_params();
foreach my $i (keys(%$params)) {
#force lower-case params. Trust me, it's a good thing.
$defaults->{lc($i)} = $params->{$i};
}
if (ref($defaults->{options}) eq 'HASH') {
$defaults->{_translate_key} = $defaults->{options};
foreach my $i (keys(%{$defaults->{options}})) {
$defaults->{_rev_translate_key}->{$defaults->{options}->{$i}} = $i;
}
$defaults->{options} = [values(%{$defaults->{options}})];
}
$defaults = $self->_check_params($defaults);
$self->[Apache::Wyrd::Datum::TYPE] = $self->_type;
$self->[Apache::Wyrd::Datum::VALUE] = $value;
$self->[Apache::Wyrd::Datum::PARAMS] = $defaults;
}
sub _type {
die "The base Apache::Wyrd::Datum is an abstract class. Please use a defined type instead.";
}
sub _default_value {
return;
}
sub _default_params {
return {'strict' => 0};
}
sub _raise_exception {
my ($value) = @_;
die ($value . " " . join(':', caller()));
}
sub _check_params {
#by default, check nothing
return $_[1];
}
sub _suggest {
return $_[1];
}
sub _check_value {
#by default, approve everything unless not-null is specified
my ($self, $value, $params) = @_;
return (0, 'Required value missing') if ($params->{'not_null'} and not($value));
return 1;
}
sub _set {
my($self, $value) = @_;
$value = $self->[Apache::Wyrd::Datum::PARAMS]->{_translate_key}->{$value} if ($self->[Apache::Wyrd::Datum::PARAMS]->{translate_key});
$self->[Apache::Wyrd::Datum::VALUE] = $value;
return $self->[Apache::Wyrd::Datum::PARAMS]->{_rev_translate_key}->{$self->[Apache::Wyrd::Datum::VALUE]} if ($self->[Apache::Wyrd::Datum::PARAMS]->{translate_key});
return $value;
}
sub _process_incoming {
return $_[1];
}
sub _process_outgoing {
return $_[1];
}
#Public Methods
sub check {
my ($self, $value) = @_;
my ($ok, $error) = $self->_check_value($value, $self->[Apache::Wyrd::Datum::PARAMS]);
return 1 if ($ok);
return (undef, $error);
}
sub get {
my ($self) = shift;
my $value = undef;
$value = $self->[Apache::Wyrd::Datum::PARAMS]->{_rev_translate_key}->{$self->[Apache::Wyrd::Datum::VALUE]} if ($self->[Apache::Wyrd::Datum::PARAMS]->{translate_key});
$value = $self->[Apache::Wyrd::Datum::VALUE];
return $self->_process_outgoing($value);
}
sub set {
my($self, $value) = @_;
$value = $self->_process_incoming($value);
my ($ok, undef) = $self->check($value);
unless ($ok) {
return undef if ($self->[Apache::Wyrd::Datum::PARAMS]->{'strict'});
$value = $self->_suggest($value);
}
$self->_set($value);
( run in 1.423 second using v1.01-cache-2.11-cpan-5b529ec07f3 )