X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FReaction%2FUI%2FViewPort%2FField.pm;h=f6da89546ecdfd50adbd95541c8dac7cb1c0da39;hb=87b8ba852e9d46795d7540086884a86326949321;hp=d8d504a2233747da534037e8d33fb79385745c6b;hpb=ddccc6a29affc90888a59f14d698fd3afb2757dc;p=catagits%2FReaction.git diff --git a/lib/Reaction/UI/ViewPort/Field.pm b/lib/Reaction/UI/ViewPort/Field.pm index d8d504a..f6da895 100644 --- a/lib/Reaction/UI/ViewPort/Field.pm +++ b/lib/Reaction/UI/ViewPort/Field.pm @@ -14,25 +14,84 @@ class Field is 'Reaction::UI::ViewPort', which { has model => (is => 'ro', isa => Object, required => 1); has attribute => (is => 'ro', isa => ParameterAttribute, required => 1); - implements adopt_value => as {}; - implements _build_name => as { shift->attribute->name }; - implements _build_value_string => as { shift->value }; implements _build_label => as { join(' ', map { ucfirst } split('_', shift->name)); }; - #unlazify and move it to build. to deal with array use typeconstraints and coercions implements _build_value => as { my ($self) = @_; my $reader = $self->attribute->get_read_method; + return $self->model->$reader; + }; + + implements _model_has_value => as { + my ($self) = @_; my $predicate = $self->attribute->predicate; - #this is bound to blow the fuck if !model->$predicate what to do? - return $self->model->$reader if (!$predicate || $self->model->$predicate); - return; + + if (!$predicate || $self->model->$predicate + || ($self->attribute->is_lazy + && !$self->attribute->is_lazy_fail) + ) { + # either model attribute has a value now or can build it + return 1; + } + return 0; + }; + + implements _build_value_string => as { + my ($self) = @_; + # XXX need the defined test because the IM lazy builds from + # the model and DBIC can have nullable fields and DBIC doesn't + # have a way to tell us that doesn't force value inflation (extra + # SELECTs for belongs_to) so basically we're screwed. + return ($self->_model_has_value && defined($self->value) + ? $self->_value_string_from_value + : $self->_empty_string_value); + }; + + implements _value_string_from_value => as { + shift->value; + }; + + implements _empty_string_value => as { '' }; + + implements value_is_required => as { + shift->attribute->is_required; }; }; 1; +__END__; + +=head1 NAME + +Reaction::UI::ViewPort::Field + +=head1 DESCRIPTION + +=head1 ATTRIBUTES + +=head2 model + +=head2 attribute + +=head2 value + +=head2 name + +=head2 label + +=head2 value_string + +=head1 AUTHORS + +See L for authors. + +=head1 LICENSE + +See L for the license. + +=cut