Alzabo
view release on metacpan or search on metacpan
lib/Alzabo/MethodMaker.pm view on Meta::CPAN
my @options = qw( foreign_keys
linking_tables
lookup_columns
row_columns
self_relations
tables
table_columns
insert_hooks
update_hooks
select_hooks
delete_hooks
);
sub import
{
my $class = shift;
validate( @_, { schema => { type => SCALAR },
class_root => { type => SCALAR,
optional => 1 },
name_maker => { type => CODEREF,
optional => 1 },
( map { $_ => { optional => 1 } } 'all', @options ) } );
my %p = @_;
return unless exists $p{schema};
return unless grep { exists $p{$_} && $p{$_} } 'all', @options;
my $maker = $class->new(%p);
$maker->make;
}
sub new
{
my $class = shift;
my %p = @_;
if ( delete $p{all} )
{
foreach (@options)
{
$p{$_} = 1 unless exists $p{$_} && ! $p{$_};
}
}
my $s = Alzabo::Runtime::Schema->load_from_file( name => delete $p{schema} );
my $class_root;
if ( $p{class_root} )
{
$class_root = $p{class_root};
}
else
{
my $x = 0;
do
{
$class_root = caller($x++);
die "No base class could be determined\n" unless $class_root;
} while ( $class_root->isa(__PACKAGE__) );
}
my $self;
$p{name_maker} = sub { $self->name(@_) } unless ref $p{name_maker};
$self = bless { opts => \%p,
class_root => $class_root,
schema => $s,
}, $class;
return $self;
}
sub make
{
my $self = shift;
$self->{schema_class} = join '::', $self->{class_root}, 'Schema';
bless $self->{schema}, $self->{schema_class};
$self->eval_schema_class;
$self->load_class( $self->{schema_class} );
{
# Users can add methods to these superclasses
no strict 'refs';
foreach my $thing ( qw( Table Row ) )
{
@{ "$self->{class_root}::${thing}::ISA" }
= ( "Alzabo::Runtime::$thing", "Alzabo::DocumentationContainer" );
}
}
foreach my $t ( sort { $a->name cmp $b->name } $self->{schema}->tables )
{
$self->{table_class} = join '::', $self->{class_root}, 'Table', $t->name;
$self->{row_class} = join '::', $self->{class_root}, 'Row', $t->name;
bless $t, $self->{table_class};
$self->eval_table_class;
$self->{schema}->add_contained_class( table => $self->{table_class} );
$self->eval_row_class;
$t->add_contained_class( row => $self->{row_class} );
if ( $self->{opts}{tables} )
{
$self->make_table_method($t);
}
$self->load_class( $self->{table_class} );
$self->load_class( $self->{row_class} );
if ( $self->{opts}{table_columns} )
{
$self->make_table_column_methods($t);
}
( run in 1.645 second using v1.01-cache-2.11-cpan-d8267643d1d )