e58f1b4f7ea89b4cb6fca82594fb7f95b62579a2
[catagits/Reaction.git] / lib / Reaction / UI / ViewPort / Object / Mutable.pm
1 package Reaction::UI::ViewPort::Object::Mutable;
2
3 use Reaction::Class;
4
5 use aliased 'Reaction::UI::ViewPort::Object';
6 use aliased 'Reaction::UI::ViewPort::Field::Mutable::Text';
7 use aliased 'Reaction::UI::ViewPort::Field::Mutable::Array';
8 use aliased 'Reaction::UI::ViewPort::Field::Mutable::String';
9 use aliased 'Reaction::UI::ViewPort::Field::Mutable::Number';
10 use aliased 'Reaction::UI::ViewPort::Field::Mutable::Integer';
11 use aliased 'Reaction::UI::ViewPort::Field::Mutable::Boolean';
12 use aliased 'Reaction::UI::ViewPort::Field::Mutable::Password';
13 use aliased 'Reaction::UI::ViewPort::Field::Mutable::DateTime';
14 use aliased 'Reaction::UI::ViewPort::Field::Mutable::ChooseOne';
15 use aliased 'Reaction::UI::ViewPort::Field::Mutable::ChooseMany';
16 use aliased 'Reaction::UI::ViewPort::Field::Mutable::File';
17
18 use namespace::clean -except => [ qw(meta) ];
19 extends Object;
20
21 #this her for now. mutable fields need an action to build correctly
22 has model => (
23   is => 'ro',
24   isa => 'Reaction::InterfaceModel::Action',
25   required => 1,
26 );
27
28 sub is_modified {
29   my $self = shift;
30   foreach my $field (@{$self->fields}) {
31     return 1 if $field->is_modified;
32   }
33   return 0;
34 }
35
36 sub _build_fields_for_type_Num {
37   my ($self, $attr, $args) = @_;
38   $self->_build_simple_field(attribute => $attr, class => Number, %$args);
39 }
40
41 sub _build_fields_for_type_Int {
42   my ($self, $attr, $args) = @_;
43   $self->_build_simple_field(attribute => $attr, class => Integer, %$args);
44 }
45
46 sub _build_fields_for_type_Bool {
47   my ($self,  $attr, $args) = @_;
48   $self->_build_simple_field(attribute => $attr, class => Boolean, %$args);
49 }
50
51 sub _build_fields_for_type_Reaction_Types_Core_SimpleStr {
52   my ($self, $attr, $args) = @_;
53   $self->_build_simple_field(attribute => $attr, class => String, %$args);
54 }
55
56 sub _build_fields_for_type_Reaction_Types_File_File {
57   my ($self, $attr, $args) = @_;
58   $self->_build_simple_field(attribute => $attr, class => File, %$args);
59 }
60
61 sub _build_fields_for_type_Str {
62   my ($self, $attr, $args) = @_;
63   if ($attr->has_valid_values) { # There's probably a better way to do this
64     $self->_build_simple_field(attribute => $attr, class => ChooseOne, %$args);
65   } else {
66     $self->_build_simple_field(attribute => $attr, class => Text, %$args);
67   }
68 }
69
70 sub _build_fields_for_type_Reaction_Types_Core_Password {
71   my ($self, $attr, $args) = @_;
72   $self->_build_simple_field(attribute => $attr, class => Password, %$args);
73 }
74
75 sub _build_fields_for_type_Reaction_Types_DateTime_DateTime {
76   my ($self, $attr, $args) = @_;
77   $self->_build_simple_field(attribute => $attr, class => DateTime, %$args);
78 }
79
80 sub _build_fields_for_type_Enum {
81   my ($self, $attr, $args) = @_;
82     $self->_build_simple_field(attribute => $attr, class => ChooseOne, %$args);
83 }
84
85 #this needs to be fixed. somehow. beats the shit our of me. really.
86 #implements build_fields_for_type_Reaction_InterfaceModel_Object => as {
87 sub _build_fields_for_type_DBIx_Class_Row {
88   my ($self, $attr, $args) = @_;
89   $self->_build_simple_field(attribute => $attr, class => ChooseOne, %$args);
90 }
91
92 sub _build_fields_for_type_ArrayRef {
93   my ($self, $attr, $args) = @_;
94   if ($attr->has_valid_values) {
95     $self->_build_simple_field(attribute => $attr, class => ChooseMany,  %$args);
96   } else {
97     $self->_build_simple_field
98       (
99        attribute => $attr,
100        class     => Array,
101        layout    => 'field/mutable/hidden_array',
102        %$args);
103   }
104 }
105
106 __PACKAGE__->meta->make_immutable;
107
108 1;
109
110 __END__;
111
112 =head1 NAME
113
114 Reaction::UI::ViewPort::Object::Mutable
115
116 =head1 SYNOPSIS
117
118 =head1 DESCRIPTION
119
120 This subclass of L<Reaction::UI::ViewPort::Object> is used for rendering a
121 collection of C<Reaction::UI::ViewPort::Field::Mutable::*> objects for user editing.
122
123 =head1 ATTRIBUTES
124
125 =head2 model
126
127 L<Reaction::InterfaceModel::Action>
128
129 =head1 METHODS
130
131 =head2  _build_fields_for_type_Num
132
133 =head2  _build_fields_for_type_Int
134
135 =head2  _build_fields_for_type_Bool
136
137 =head2  _build_fields_for_type_Reaction_Types_Core_SimpleStr
138
139 =head2  _build_fields_for_type_Reaction_Types_File_File
140
141 =head2  _build_fields_for_type_Str
142
143 =head2  _build_fields_for_type_Reaction_Types_Core_Password
144
145 =head2  _build_fields_for_type_Reaction_Types_DateTime_DateTime
146
147 =head2  _build_fields_for_type_Enum
148
149 =head2  _build_fields_for_type_DBIx_Class_Row
150
151 =head2  _build_fields_for_type_ArrayRef
152
153 =head1 SEE ALSO
154
155 L<Reaction::UI::ViewPort::Object>
156
157 L<Reaction::UI::ViewPort>
158
159 L<Reaction::InterfaceModel::Action>
160
161 =head1 AUTHORS
162
163 See L<Reaction::Class> for authors.
164
165 =head1 LICENSE
166
167 See L<Reaction::Class> for the license.
168
169 =cut
170