File Coverage

lib/Kwiki/Preferences.pm
Criterion Covered Total %
statement 1 3 33.3
branch n/a
condition n/a
subroutine 1 1 100.0
pod n/a
total 2 4 50.0


line stmt bran cond sub pod time code
1             package Kwiki::Preferences;
2 1     1   3026 use Kwiki::Base -Base;
  0            
  0            
3              
4             field class_id => 'preferences';
5             const preference_class => 'Kwiki::Preference';
6             field objects_by_class => {};
7              
8             sub load {
9             my $values = shift;
10             my $prefs = $self->hub->registry->lookup->preference;
11             for (sort keys %$prefs) {
12             my $array = $prefs->{$_};
13             my $class_id = $array->[0];
14             my $hash = {@{$array}[1..$#{$array}]}
15             or next;
16             next unless $hash->{object};
17             my $object = $hash->{object}->clone;
18             $object->value($values->{$_});
19             push @{$self->objects_by_class->{$class_id}}, $object;
20             field($_);
21             $self->$_($object);
22             }
23             return $self;
24             }
25              
26             sub new_preferences {
27             my $values = shift;
28             my $new = bless {}, ref $self;
29             $new->load($values);
30             return $new;
31             }
32              
33             sub new_preference {
34             $self->preference_class->new(@_);
35             }
36              
37             #------------------------------------------------------------------------------#
38             package Kwiki::Preference;
39             use Kwiki::Base '-base';
40              
41             field 'id';
42             field 'name';
43             field 'description';
44             field 'query';
45             field 'type';
46             field 'choices';
47             field 'default';
48             field 'handler';
49             field 'owner_id';
50             field 'size' => 20;
51             field 'edit';
52             field 'new_value';
53             field 'error';
54              
55             sub new() {
56             my $class = shift;
57             my $owner = shift;
58             my $self = bless {}, $class;
59             my $id = shift || '';
60             $self->id($id);
61             my $name = $id;
62             $name =~ s/_/ /g;
63             $name =~ s/\b(.)/\u$1/g;
64             $self->name($name);
65             $self->query("$name?");
66             $self->type('boolean');
67             $self->default(0);
68             $self->handler("${id}_handler");
69             $self->owner_id($owner->class_id);
70             return $self;
71             }
72              
73             sub value {
74             return $self->{value} = shift
75             if @_;
76             return defined $self->{value}
77             ? $self->{value}
78             : $self->default;
79             }
80              
81             sub value_label {
82             my $choices = $self->choices
83             or return '';
84             return ${{@$choices}}{$self->value} || '';
85             }
86            
87             sub form_element {
88             my $type = $self->type;
89             return $self->$type;
90             }
91              
92             sub input {
93             my $name = $self->owner_id . '__' . $self->id;
94             my $value = $self->value;
95             my $size = $self->size;
96             return <
97            
98             END
99             }
100              
101             sub boolean {
102             my $name = $self->owner_id . '__' . $self->id;
103             my $value = $self->value;
104             my $checked = $value ? 'checked="checked"' : '';
105             return <
106            
107            
108             END
109             }
110              
111             sub radio {
112             my $i = 1;
113             my @choices = @{$self->choices};
114             my @values = grep {$i++ % 2} @choices;
115             my $value = $self->value;
116              
117             join "\n",
118             '
',
119             CGI::radio_group(
120             -name => $self->owner_id . '__' . $self->id,
121             -values => \@values,
122             -default => $value,
123             -labels => { @choices },
124             -override => 1,
125             -linebreak=>'true',
126             ),
127             '
';
128             }
129              
130             sub pulldown {
131             my $i = 1;
132             my @choices = @{$self->choices};
133             my @values = grep {$i++ % 2} @choices;
134             my $value = $self->value;
135             CGI::popup_menu(
136             -name => $self->owner_id . '__' . $self->id,
137             -values => \@values,
138             -default => $value,
139             -labels => { @choices },
140             -override => 1,
141             );
142             }
143              
144             __DATA__