--- Objects: - Employee: fields: emp_id: int name: string[40] dept_id: Department salary: double key: emp_id - Department: fields: dept_id: int name: string[20] key: dept_id Relationships: - - Owner: name: Department count: 1 - Contains: name: Employee count: many #### { @attrlist = keys %attrs; '' } package {$package}; use strict; \{ { ' my %' . join( ";\n my \%", @attrlist ) . ';'; } sub new \{ bless \{\}, shift \} {foreach my $attr ( @attrlist ) { my $v = '{ $' . $attr . '{+shift} }'; $OUT .= sprintf( " sub %-10s :lvalue " . $v . "\n", $attr ); } } sub DESTROY \{ my $sref = 0+shift; delete { join( "\n ,", map { '$' . $_ . '{$sref}' } @attrlist); }; \} \} 1; #### use YAML; use Text::Template; use strict; my $data = YAML::LoadFile( 'spec.yaml' ); my $text = new Text::Template ( TYPE => 'FILE', SOURCE => 'template.tmpl' ); my @objects = @{$data->{Objects}}; my @relationships = @{$data->{Relationships}}; foreach my $obj (@objects) { our ($package, $value) = %$obj; our %attrs = %{$value->{fields}}; my $out = $text->fill_in(); print $out; } #### package Employee; use strict; { my %dept_id; my %emp_id; my %name; my %salary; sub new { bless {}, shift } sub dept_id :lvalue { $dept_id{+shift} } sub emp_id :lvalue { $emp_id{+shift} } sub name :lvalue { $name{+shift} } sub salary :lvalue { $salary{+shift} } sub DESTROY { my $sref = 0+shift; delete $dept_id{$sref} ,$emp_id{$sref} ,$name{$sref} ,$salary{$sref}; } } 1; package Department; use strict; { my %dept_id; my %name; sub new { bless {}, shift } sub dept_id :lvalue { $dept_id{+shift} } sub name :lvalue { $name{+shift} } sub DESTROY { my $sref = 0+shift; delete $dept_id{$sref} ,$name{$sref}; } } 1;