rclass stuff ripped out of everything but widget classes
[catagits/Reaction.git] / lib / Reaction / UI / ViewPort / Field / Mutable / ChooseOne.pm
1 package Reaction::UI::ViewPort::Field::Mutable::ChooseOne;
2
3 use Reaction::Class;
4 use Scalar::Util ();
5
6 use namespace::clean -except => [ qw(meta) ];
7 extends 'Reaction::UI::ViewPort::Field';
8
9 with 'Reaction::UI::ViewPort::Field::Role::Mutable::Simple';
10 with 'Reaction::UI::ViewPort::Field::Role::Choices';
11 sub adopt_value_string {
12   my ($self) = @_;
13   my $value = $self->value_string;
14   $value = $self->str_to_ident($value) if (!ref $value);
15   my $attribute = $self->attribute;
16   my $checked = $attribute->check_valid_value($self->model, $value);
17   unless (defined $checked) {
18     require Data::Dumper; 
19     my $serialised = Data::Dumper->new([ $value ])->Indent(0)->Dump;
20     $serialised =~ s/^\$VAR1 = //; $serialised =~ s/;$//;
21     confess "${serialised} is not a valid value for ${\$attribute->name} on "
22             ."${\$attribute->associated_class->name}";
23   }
24   $self->value($checked);
25 };
26
27 around _value_string_from_value => sub {
28   my $orig = shift;
29   my $self = shift;
30   my $value = $self->$orig(@_);
31   return $self->obj_to_name($value->{value}) if Scalar::Util::blessed($value);
32   return $self->obj_to_name($value) if blessed $value;
33   return "$value"; # force stringify. might work. probably won't.
34 };
35 sub is_current_value {
36   my ($self, $check_value) = @_;
37   return unless $self->_model_has_value;
38   my $our_value = $self->value;
39   return unless defined($our_value);
40   $check_value = $self->obj_to_str($check_value) if ref($check_value);
41   return $self->obj_to_str($our_value) eq $check_value;
42 };
43
44 __PACKAGE__->meta->make_immutable;
45
46
47 1;