---
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;