NAME AutoCode - Set the coders free and therefore jobless Objective This project, and its sibling AutoSQL, is ready to facilitate profesional Perl developers, who write modules not occasionally but everyday, for constructing a comprehensive module architecture from a simple schema/configuration. (To meet this ad slogan, I really try very hard) The phylosophy behind it is very simple that human who believes himself intelligent merely need to design the schema, and this project, a piece of code, will generate the code what developers usually composed by themselves tired fingers. SAMPLE A simple sample as test demo in this distribution is Contact project. The scenario is simple. A normal Person, at our generation, must have first_name and last_name. And optionally he may have a list of aliases and emails. A Email is another class which has one required attribute, address, and one optional, purpose, such as 'office', 'home', 'personal' or 'business'. In civilized Singapore, each resident, whoever is a citizen or working foriegner, has NRIC (National Registration Identity Card), IC for short. A person and a IC are in one-to-one relationship. Since you do not necessarily know about your pal's IC in the social life, this IC can be null sometimes in logic. How to defined the schema The above mentioned can be modelled as a Perl hash like, package ContactSchema; use strict; use AutoCode::Schema; our @ISA=qw(AutoCode::Schema); our $modules = { Person => { first_name => '$!', last_name => '$!', birthday => '$T2', alias => '@', nric => '$NRIC', email => '@Email', ), NRIC => { no => '$', issue_date => '$' }, Email => { address => '$V200!', purpose => '${office, personal}' } }; our $plurals = { alias => 'aliases' }; sub _initialize { my ($self, @args)=@_; push @args, -modules => $modules; push @args, -plurals => $plurals; $self->SUPER::_initialize(@args); } 1; How to use the auto-made modules After the schema is fixed, You can use AutoCode::ModuleFactory or AutoCode::ObjectFactory to get the module name or instantiate the objects. use ContactSchema; # AutoCode::ModuleFactory use Autocode::ModuleFactory; my $factory=Autocode::ModuleFactory->new( -schema => ContactSchema->new (-package_prefix => 'MyContact') ); my $person_$pkg=$factory->make_virtual_module('Person'); my $person = $person_pkg->new( -first_name => 'foo', -last_name => 'bar', -aliases => [qw(foob foobar)] ); print $person->first_name .' '. $person->last_name ."\n"; print join("\t", $person->get_aliases) ."\n"; $person->first_name('new name'); my @aliases = $person->remove_aliases; $person->add_alias('foofoo'); AUTHOR Juguang Xiao, juguang at tll.org.sg