4 use OpenILS::Application::Storage::CDBI;
5 use OpenILS::Application::Storage::CDBI::actor;
6 use OpenILS::Application::Storage::CDBI::biblio;
7 use OpenILS::Application::Storage::CDBI::config;
8 use OpenILS::Application::Storage::CDBI::metabib;
10 use vars qw/$fieldmap $VERSION/;
15 # To dump the Javascript version of the fieldmapper struct use the command:
17 # PERL5LIB=~/cvs/ILS/OpenSRF/src/perlmods/:~/cvs/ILS/Open-ILS/src/perlmods/ GEN_JS=1 perl -MOpenILS::Utils::Fieldmapper -e 'print "\n";'
19 # ... adjusted for your CVS sandbox, of course.
23 return () unless (defined $fieldmap);
24 return keys %$fieldmap;
28 return if (defined $fieldmap);
32 'Fieldmapper::actor::user' => { hint => 'au' },
33 'Fieldmapper::actor::org_unit' => { hint => 'aou' },
34 'Fieldmapper::actor::org_unit_type' => { hint => 'aout' },
35 'Fieldmapper::biblio::record_node' => { hint => 'brn',
36 proto_fields => { children => 1 } },
37 'Fieldmapper::biblio::record_entry' => { hint => 'bre' },
38 'Fieldmapper::config::bib_source' => { hint => 'cbs' },
39 'Fieldmapper::config::metabib_field' => { hint => 'cmf' },
40 'Fieldmapper::metabib::metarecord' => { hint => 'mmr' },
41 'Fieldmapper::metabib::title_field_entry' => { hint => 'mmr' },
42 'Fieldmapper::metabib::author_field_entry' => { hint => 'mmr' },
43 'Fieldmapper::metabib::subject_field_entry' => { hint => 'mmr' },
44 'Fieldmapper::metabib::keyword_field_entry' => { hint => 'mmr' },
45 'Fieldmapper::metabib::full_rec' => { hint => 'mmr' },
48 #-------------------------------------------------------------------------------
49 # Now comes the evil! Generate classes
51 for my $pkg ( keys %$fieldmap ) {
52 (my $cdbi = $pkg) =~ s/^Fieldmapper:://o;
56 use base 'Fieldmapper';
59 $$fieldmapp{$pkg}{cdbi} = $cdbi;
62 for my $vfield ( qw/isnew ischanged isdeleted/ ) {
63 $$fieldmap{$pkg}{fields}{$vfield} = { position => $pos, virtual => 1 };
67 if (exists $$fieldmap{$pkg}{proto_fields}) {
68 for my $pfield ( keys %{ $$fieldmap{$pkg}{proto_fields} } ) {
69 $$fieldmap{$pkg}{fields}{$pfield} = { position => $pos, virtual => $$fieldmap{$pkg}{proto_fields}{$pfield} };
74 for my $col ( $cdbi->columns('All') ) {
75 $$fieldmap{$pkg}{fields}{$col} = { position => $pos, virtual => 0 };
79 JSON->register_class_hint(
80 hint => $pkg->json_hint,
87 print Fieldmapper->javascript() if ($ENV{GEN_JS});
93 $value = [] unless (defined $value);
94 return bless $value => $self->class_name;
98 my $class_name = shift;
99 return 'var fieldmap = ' . JSON->perl2JSON($fieldmap) . ';'
107 (my $field = $AUTOLOAD) =~ s/^.*://o;
108 my $class_name = $obj->class_name;
111 if ($field =~ /^clear_/o) {
113 *{$obj->class_name."::$field"} = sub {
115 $self->[$pos] = undef;
119 return $obj->$field();
122 die "No field by the name $field in $class_name!"
123 unless (exists $$fieldmap{$class_name}{fields}{$field});
125 my $pos = $$fieldmap{$class_name}{fields}{$field}{position};
128 *{$obj->class_name."::$field"} = sub {
131 $self->[$pos] = $new_val if (defined $new_val);
132 return $self->[$pos];
135 return $obj->$field($value);
139 my $class_name = shift;
140 return ref($class_name) || $class_name;
145 my $class_name = $self->class_name;
146 my $fields = $$fieldmap{$class_name}{fields};
149 !$$fields{$_}{virtual}
150 } sort {$$fields{$a}{position} <=> $$fields{$b}{position}} keys %$fields;
157 return $fieldmap->{$self->class_name}->{api_level};
162 return $fieldmap->{$self->class_name}->{api_level};
167 return $fieldmap->{$self->class_name}->{hint};