memory leaks on CRUD fixed
[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 _build_fields_for_type_Num {
29   my ($self, $attr, $args) = @_;
30   $self->_build_simple_field(attribute => $attr, class => Number, %$args);
31 }
32
33 sub _build_fields_for_type_Int {
34   my ($self, $attr, $args) = @_;
35   $self->_build_simple_field(attribute => $attr, class => Integer, %$args);
36 }
37
38 sub _build_fields_for_type_Bool {
39   my ($self,  $attr, $args) = @_;
40   $self->_build_simple_field(attribute => $attr, class => Boolean, %$args);
41 }
42
43 sub _build_fields_for_type_Reaction_Types_Core_SimpleStr {
44   my ($self, $attr, $args) = @_;
45   $self->_build_simple_field(attribute => $attr, class => String, %$args);
46 }
47
48 sub _build_fields_for_type_Reaction_Types_File_File {
49   my ($self, $attr, $args) = @_;
50   $self->_build_simple_field(attribute => $attr, class => File, %$args);
51 }
52
53 sub _build_fields_for_type_Str {
54   my ($self, $attr, $args) = @_;
55   if ($attr->has_valid_values) { # There's probably a better way to do this
56     $self->_build_simple_field(attribute => $attr, class => ChooseOne, %$args);
57   } else {
58     $self->_build_simple_field(attribute => $attr, class => Text, %$args);
59   }
60 }
61
62 sub _build_fields_for_type_Reaction_Types_Core_Password {
63   my ($self, $attr, $args) = @_;
64   $self->_build_simple_field(attribute => $attr, class => Password, %$args);
65 }
66
67 sub _build_fields_for_type_Reaction_Types_DateTime_DateTime {
68   my ($self, $attr, $args) = @_;
69   $self->_build_simple_field(attribute => $attr, class => DateTime, %$args);
70 }
71
72 sub _build_fields_for_type_Enum {
73   my ($self, $attr, $args) = @_;
74     $self->_build_simple_field(attribute => $attr, class => ChooseOne, %$args);
75 }
76
77 #this needs to be fixed. somehow. beats the shit our of me. really.
78 #implements build_fields_for_type_Reaction_InterfaceModel_Object => as {
79 sub _build_fields_for_type_DBIx_Class_Row {
80   my ($self, $attr, $args) = @_;
81   $self->_build_simple_field(attribute => $attr, class => ChooseOne, %$args);
82 }
83
84 sub _build_fields_for_type_ArrayRef {
85   my ($self, $attr, $args) = @_;
86   if ($attr->has_valid_values) {
87     $self->_build_simple_field(attribute => $attr, class => ChooseMany,  %$args);
88   } else {
89     $self->_build_simple_field
90       (
91        attribute => $attr,
92        class     => Array,
93        layout    => 'field/mutable/hidden_array',
94        %$args);
95   }
96 }
97
98 __PACKAGE__->meta->make_immutable;
99
100 1;
101
102 __END__;
103
104 =head1 NAME
105
106 Reaction::UI::ViewPort::Object::Mutable
107
108 =head1 SYNOPSIS
109
110 =head1 DESCRIPTION
111
112 This subclass of L<Reaction::UI::ViewPort::Object> is used for rendering a
113 collection of C<Reaction::UI::ViewPort::Field::Mutable::*> objects for user editing.
114
115 =head1 ATTRIBUTES
116
117 =head2 model
118
119 L<Reaction::InterfaceModel::Action>
120
121 =head1 METHODS
122
123 =head2  _build_fields_for_type_Num
124
125 =head2  _build_fields_for_type_Int
126
127 =head2  _build_fields_for_type_Bool
128
129 =head2  _build_fields_for_type_Reaction_Types_Core_SimpleStr
130
131 =head2  _build_fields_for_type_Reaction_Types_File_File
132
133 =head2  _build_fields_for_type_Str
134
135 =head2  _build_fields_for_type_Reaction_Types_Core_Password
136
137 =head2  _build_fields_for_type_Reaction_Types_DateTime_DateTime
138
139 =head2  _build_fields_for_type_Enum
140
141 =head2  _build_fields_for_type_DBIx_Class_Row
142
143 =head2  _build_fields_for_type_ArrayRef
144
145 =head1 SEE ALSO
146
147 L<Reaction::UI::ViewPort::Object>
148
149 L<Reaction::UI::ViewPort>
150
151 L<Reaction::InterfaceModel::Action>
152
153 =head1 AUTHORS
154
155 See L<Reaction::Class> for authors.
156
157 =head1 LICENSE
158
159 See L<Reaction::Class> for the license.
160
161 =cut
162