Alzabo
view release on metacpan or search on metacpan
lib/Alzabo/MethodMaker.pm view on Meta::CPAN
eval <<"EOF";
{
package $self->{table_class};
sub insert
{
my \$s = shift;
my \%p = \@_;
$code
}
}
EOF
Alzabo::Exception::Eval->throw( error => $@ ) if $@;
my $hooks =
$self->_hooks_doc_string( $self->{table_class}, 'pre_insert', 'post_insert' );
$self->{table_class}->add_class_docs
( Alzabo::ClassDocs->new
( group => 'Hooks',
description => "$hooks",
) );
}
sub _hooks_doc_string
{
my $self = shift;
my ($class, $hook1, $hook2) = @_;
my @hooks;
push @hooks, $hook1 if $class->can($hook1);
push @hooks, $hook2 if $class->can($hook2);
my $hooks = 'has';
$hooks .= @hooks > 1 ? '' : ' a ';
$hooks .= join ' and ', @hooks;
$hooks .= @hooks > 1 ? ' hooks' : ' hook';
return $hooks;
}
sub make_update_hooks
{
my $self = shift;
my $code = '';
$code .= " \$s->schema->run_in_transaction( sub {\n";
$code .= " \$s->pre_update(\\\%p);\n" if $self->{row_class}->can('pre_update');
$code .= " \$s->SUPER::update(\%p);\n";
$code .= " \$s->post_update(\\\%p);\n" if $self->{row_class}->can('post_update');
$code .= " } );\n";
eval <<"EOF";
{
package $self->{row_class};
sub update
{
my \$s = shift;
my \%p = \@_;
$code
}
}
EOF
Alzabo::Exception::Eval->throw( error => $@ ) if $@;
my $hooks =
$self->_hooks_doc_string( $self->{row_class}, 'pre_update', 'post_update' );
$self->{row_class}->add_class_docs
( Alzabo::ClassDocs->new
( group => 'Hooks',
description => "$hooks",
) );
}
sub make_select_hooks
{
my $self = shift;
my ($pre, $post) = ('', '');
$pre = " \$s->pre_select(\\\@cols);\n"
if $self->{row_class}->can('pre_update');
$post = " \$s->post_select(\\\%r);\n"
if $self->{row_class}->can('post_update');
eval <<"EOF";
{
package $self->{row_class};
sub select
{
my \$s = shift;
my \@cols = \@_;
return \$s->schema->run_in_transaction( sub {
$pre
my \@r;
my %r;
if (wantarray)
{
\@r{ \@cols } = \$s->SUPER::select(\@cols);
}
else
{
\$r{ \$cols[0] } = (scalar \$s->SUPER::select(\$cols[0]));
}
$post
return wantarray ? \@r{\@cols} : \$r{ \$cols[0] };
} );
( run in 0.898 second using v1.01-cache-2.11-cpan-98e64b0badf )