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;
- my $predicate = $self->attribute->predicate;
+ return $self->model->$reader;
+ };
+
+ implements _model_has_value => as {
+ my ($self) = @_;
+ my $predicate = $self->attribute->get_predicate_method;
if (!$predicate || $self->model->$predicate
- || ($self->attribute->is_lazy
- && ($self->attribute->builder
- || $self->attribute->default))
+ #|| ($self->attribute->is_lazy
+ # && !$self->attribute->is_lazy_fail)
) {
- return $self->model->$reader;
+ # either model attribute has a value now or can build it
+ return 1;
}
- return $self->_empty_value;
+ return 0;
};
- implements _empty_value => as { '' };
+ 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->_build_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;
+ };
};