NAME

Module::AnyEvent::Helper::Filter - source filter for AnyEvent-ize helper

VERSION

version v0.0.5

SYNOPSIS

If Foo.pm is written as follows:

package Foo;
sub new { # constrcutor
}
sub impl { # blocking code
}
sub func { # calling impl()
    return 1 + impl(@_);
}
1;

FooAsync.pm, AnyEvent-friendly version of Foo.pm, can be implemented as the following:

package FooAsync;
use AnyEvent;
sub impl_async { # non-blocking code
    my $cv = AE::cv;
    ...
    return $cv;
}
use Module::AnyEvent::Helper::Filter -as => FooAsync, -target => Foo,
     -remove_func => [qw(impl)], -translate_func => [qw(func)];
1;

It is important to place use Module::AnyEvent::Helper::Filter after method definitions because methods are generated inside the use according to prior method definitions.

DESCRIPTION

To make some modules AnyEvent-frinedly, it might be necessary to write boiler-plate codes and to make many copy-paste-modify. This module helps you to make use of source filter. For the best case, you only need to convert central blocking code to non-blocking and others are generated by this filter. For example, Foo.pm in SYNOPSIS is filtered, semantically, as the following:

use AnyEvent;
use Module::AnyEvent::Helper;
package FooAsync;
sub new { # constrcutor # keep as it is
}
# impl() is removed, and calling impl() is converted to calling impl_async()
sub func_async { # func() is translated
    my $___cv___ = AE::cv;
    Module::AnyEvent::Helper::bind_scalar($___cv___, impl_async(@_), sub {
        return 1 + shift->recv;
    });
    return $___cv___;
}
Module::AnyEvent::Helper::strip_async_all();
1;

See Module::AnyEvent::Helper::PPI::Transform for actual conversion and Module::AnyEvent::Helper for utility functions.

To combine with your implementation of impl_async(), package FooAsync can be used like:

my $obj = FooAsync->new;
$obj->func(1,2); # Blocking manner possible
$obj->func_async(1,2)->cb(sub {}); # Non-blocking manner also possible

OPTIONS

-target => $name

Specify filter target module.

-as => $name

Specify name of filtered result module.

-remove_func => \@func

Specify array reference of removing methods. The function definition is removed and calling the function is converted to calling async version. If you want to implement async version of the methods and to convert to ordinary version, you specify them in this option.

-translate_func => \@func

Specify array reference of translating methods. The function definition is converted to async version and calling the function is converted to calling async version.

-replace_func => \@func

Specify array reference of replacing methods. The function definition is kept as it is and calling the function is converted to calling async version. It is expected that async version is implemented elsewhere.

-delete_func => \@func

Specify array reference of deleting methods. The function definition is removed and calling the function is kept as it is. If you want to implement not-async version of the methods and do not want async version, you specify them in this option.

-exclude_func => \@func

Specify array reference of method names excluded from conversion from async version. Suffix _async SHOULD NOT be included.

-transformer => $name

Specify name of additional transformr module. 'Module::AnyEvent::Helper::PPI::Transform::' is prepended to the name. It should be a aubclass of PPI::Transform.

SEE ALSO

This module is a tiny wrapper for the following modules.

AUTHOR

Yasutaka ATARASHI <yakex@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2012 by Yasutaka ATARASHI.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.