unlazified field value setting
edenc [Mon, 28 Jan 2008 04:05:58 +0000 (04:05 +0000)]
lib/Reaction/InterfaceModel/Reflector/DBIC.pm
lib/Reaction/UI/ViewPort/Field.pm
lib/Reaction/UI/ViewPort/Field/Collection.pm
lib/Reaction/UI/ViewPort/Field/Mutable/Boolean.pm
lib/Reaction/UI/ViewPort/Field/Mutable/ChooseMany.pm
lib/Reaction/UI/ViewPort/Field/Mutable/ChooseOne.pm
lib/Reaction/UI/Widget/Field.pm
lib/Reaction/UI/Widget/Field/Mutable/Boolean.pm

index 1acc967..befc66a 100644 (file)
@@ -756,6 +756,7 @@ class DBIC, which {
     my $attributes  = $self->parse_reflect_rules($attr_rules, $attr_haystack);
 
     #create the class
+    warn $class;
     my $meta = eval { Class::MOP::load_class($class) } ?
       $class->meta : $base->meta->create($class, superclasses => [$base]);
     my $make_immutable = $meta->is_immutable || $self->make_classes_immutable;
@@ -808,9 +809,12 @@ class DBIC, which {
                     );
 
     if ($attr_opts{required}) {
-      $attr_opts{lazy} = 1;
-      $attr_opts{default} = $from_attr->has_default ?
-        $from_attr->default : sub{};
+        if($from_attr->has_default) {
+          $attr_opts{lazy} = 1;
+          $attr_opts{default} = $from_attr->default;
+        } else {
+          $attr_opts{lazy_fail} = 1;
+        }
     }
 
     #test for relationships
index 007946b..b88c98b 100644 (file)
@@ -6,7 +6,7 @@ use aliased 'Reaction::Meta::InterfaceModel::Object::ParameterAttribute';
 
 class Field is 'Reaction::UI::ViewPort', which {
 
-  has value        => (is => 'rw', lazy_build => 1);
+  has value        => (is => 'rw', lazy_fail => 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);
@@ -17,15 +17,18 @@ class Field is 'Reaction::UI::ViewPort', which {
   implements adopt_value => as {};
 
   implements _build_name => as { shift->attribute->name };
-  implements _build_value_string => as { shift->value };
+
+  implements _build_value_string => as {
+    my($self) = @_;
+    return $self->has_value? $self->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) = @_;
+  implements BUILD => as {
+    my($self) = @_;
     my $reader = $self->attribute->get_read_method;
     my $predicate = $self->attribute->predicate;
 
@@ -33,12 +36,10 @@ class Field is 'Reaction::UI::ViewPort', which {
         || ($self->attribute->is_lazy
             && !$self->attribute->is_lazy_fail)
       ) {
-      return $self->model->$reader;
+      $self->value($self->model->$reader);
     }
-    return $self->_empty_value;
-  };
 
-  implements _empty_value => as { '' };
+  };
 
 };
 
index bca05f0..8c46952 100644 (file)
@@ -6,12 +6,6 @@ use aliased 'Reaction::UI::ViewPort::Field::Array';
 
 class Collection is Array, which {
 
-  #XXX
-  override _build_value => sub {
-    my $collection = super();
-    return blessed($collection) ? [$collection->members] : $collection;
-  };
-
 };
 
 1;
index 7aae0ac..5293b11 100644 (file)
@@ -4,6 +4,12 @@ use Reaction::Class;
 
 class Boolean is 'Reaction::UI::ViewPort::Field::Boolean', which{
   does 'Reaction::UI::ViewPort::Field::Role::Mutable';
+
+  implements BUILD => as {
+    my($self) = @_;
+    $self->value(0) unless $self->has_value;
+  };
+
 };
 
 1;
index 8108633..45cd652 100644 (file)
@@ -28,11 +28,6 @@ class ChooseMany is 'Reaction::UI::ViewPort::Field', which {
     $orig->($self, $checked);
   };
 
-  #XXX go away!
-  override _build_value => sub {
-    return super() || [];
-  };
-
   implements _build_value_string => as {
     my $self = shift;
     join ", ", (map {$self->obj_to_name($_->{value}) } @{ $self->current_value_choices })
index 4289282..b635b9b 100644 (file)
@@ -31,6 +31,7 @@ class ChooseOne is 'Reaction::UI::ViewPort::Field', which {
 
   implements _build_value_string => as {
     my $self = shift;
+    return unless $self->has_value;
     my $value = $self->value;
     return $self->obj_to_name($value->{value}) if Scalar::Util::blessed($value);
     $value;
@@ -38,6 +39,7 @@ class ChooseOne is 'Reaction::UI::ViewPort::Field', which {
 
   implements is_current_value => as {
     my ($self, $check_value) = @_;
+    return unless $self->has_value;
     my $our_value = $self->value;
     return unless ref($our_value);
     $check_value = $self->obj_to_str($check_value) if ref($check_value);
index 40d6e95..a15f880 100644 (file)
@@ -8,7 +8,7 @@ class Field, which {
     if ($_{viewport}->can('value_string')) {
       arg 'field_value' => $_{viewport}->value_string;
     } else {
-      arg 'field_value' => $_{viewport}->value;
+      arg 'field_value' => ''; #$_{viewport}->value;
     }
   };
 
index 0afb40c..7d98085 100644 (file)
@@ -4,6 +4,10 @@ use Reaction::UI::WidgetClass;
 
 class Boolean is 'Reaction::UI::Widget::Field::Mutable', which {
 
+  after fragment widget {
+     arg 'field_type' => 'checkbox';
+  };
+  
   implements fragment is_checked {
     if ($_{viewport}->value) {
       render 'is_checked_yes';