X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FReaction%2FUI%2FViewPort%2FField.pm;h=ff890750f2972959e74fa9197dfd7536763df2a3;hb=7ccc8c7269babcb98aaf696200251959b3022c4d;hp=f6da89546ecdfd50adbd95541c8dac7cb1c0da39;hpb=55a3f8a2e453ae34d6567679843304c0fe22e4cb;p=catagits%2FReaction.git diff --git a/lib/Reaction/UI/ViewPort/Field.pm b/lib/Reaction/UI/ViewPort/Field.pm index f6da895..ff89075 100644 --- a/lib/Reaction/UI/ViewPort/Field.pm +++ b/lib/Reaction/UI/ViewPort/Field.pm @@ -4,64 +4,71 @@ use Reaction::Class; use aliased 'Reaction::InterfaceModel::Object'; use aliased 'Reaction::Meta::InterfaceModel::Object::ParameterAttribute'; -class Field is 'Reaction::UI::ViewPort', which { - - has value => (is => 'rw', lazy_build => 1); - has name => (is => 'rw', isa => 'Str', lazy_build => 1); - has label => (is => 'rw', isa => 'Str', lazy_build => 1); - has value_string => (is => 'rw', isa => 'Str', lazy_build => 1); - - has model => (is => 'ro', isa => Object, required => 1); - has attribute => (is => 'ro', isa => ParameterAttribute, required => 1); - - implements _build_name => as { shift->attribute->name }; - - implements _build_label => as { - join(' ', map { ucfirst } split('_', shift->name)); - }; - - 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; - - 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; - }; - -}; +use namespace::clean -except => [ qw(meta) ]; +extends 'Reaction::UI::ViewPort'; + +has value => (is => 'rw', lazy_build => 1); +has name => (is => 'rw', isa => 'Str', lazy_build => 1); +has label => (is => 'rw', isa => 'Str', lazy_build => 1); +has value_string => (is => 'rw', isa => 'Str', lazy_build => 1); + +has model => (is => 'ro', isa => Object, required => 1); +has attribute => (is => 'ro', isa => ParameterAttribute, required => 1); + +sub _build_name { shift->attribute->name }; + +sub _build_label { + join(' ', map { ucfirst } split('_', shift->name)); +} + +sub _build_value { + my ($self) = @_; + my $reader = $self->attribute->get_read_method; + return $self->model->$reader; +} + +sub _model_has_value { + my ($self) = @_; + my $predicate = $self->attribute->get_predicate_method; + + if (!$predicate || $self->model->$predicate + # || ($self->attribute->is_lazy + # && !$self->attribute->is_lazy_fail) + ) { + # edenc -- uncommented the lazy checks above + # model->$predicate returns false if the value isn't set + # but has a lazy builder + + # either model attribute has a value now or can build it + return 1; + } + return 0; +} + +sub _build_value_string { + 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->_build_value) + ? $self->_value_string_from_value + : $self->_empty_string_value); +} + +sub _value_string_from_value { + shift->value; +} + +sub _empty_string_value { '' } + +sub value_is_required { + my $self = shift; + $self->model->attribute_is_required($self->attribute); +} + +__PACKAGE__->meta->make_immutable; + 1; __END__;