Hi, I'm writing a new module and I'm seeking for a good name for it.
My current choice is Event::ExecFlow and so I'm writing to this list to discuss my plans of namespace polution ;) I try to explain what the module does. At first: I factored this module out of dvd::rip, a Perl Gtk2 GUI for copying DVD's. It's a frontend for transcode and various other video related command line tools. And that's where Event::ExecFlow comes into place. It offers a high level API to declare jobs, which mainly execute external commands, parse their output to get progress information, triggers actions when the command has been finished and so on. Such jobs can be chained together to fulfill rather complex tasks which consists of a bunch of jobs. The whole I/O is asynchronous resp. the execution flow is event-driven, that's why I think Event::ExecFlow is a proper name. I'm planning to use AnyEvent to abstract from specific mainloop implementations (Event, Glib etc.). Just a short SYNOPSIS to see how it works: my $job = Event::ExecFlow::Job::Group->new ( jobs => [ Event::ExecFow::Job::Command->new ( name => "transcode", title => "Transcoding DVD title to OGG", command => "transcode -i /dev/dvd ...", fetch_output => 1, progress_max => 4711, # number of frames progress_parser => sub { my ($job, $buffer) = @_; $job->set_progress_cnt($1) if $buffer =~ /\[\d+-(\d+)\]/; #-- or simply write this: #-- progress_parser => qr/\[\d+-(\d+)\]/, }, ), Event::ExecFow::Job::Code->new ( title => "Do some checks", code => sub { my ($job) = @_; my $transcode = $job->get_group->get_job_by_name("transcode"); if ( $transcode->get_output !~ /.../ ) { $job->set_error_message("XY check failed"); } #-- this could be done easier as a post_callback added to #-- the "transcode" job above, but it's nevertheless a good #-- example for the 'Code' job type and shows how jobs can #-- interfere with each other. }, ), Event::ExecFow::Job::Command->new ( title => "Muxing OGG file", command => "ogmmerge ...", no_progress => 1, ), ], ); #-- this inherits from Event::ExecFlow::Frontend my $frontend = Video::DVDRip::GUI::ExecFlow->new(...); $frontend->start_job($job); You can recursively define arbitrary complex job structures by putting Groups into Groups. There are some more features like pre- and post-callbacks which can do additional checks and even manipulate the job plan at runtime, e.g. depending on the state of previously executed jobs. As well Event::ExecFlow offers a unique interface for progress compution, error handling, warning messages, logging and stuff. The $frontend object is application specific and must implement the Event::ExecFlow::Frontend interface (which is pretty small, currently seven very simple methods). $frontend receives events/method calls to do progress updates on the UI. This way you can specify job execution plans independently from the UI, which may be implemented using Gtk2, Tk, Qt or a simple text interface or whatever. Any comments are welcome. Regards, Joern -- LINUX - Linux Is Not gnU linuX
pgppd9G3ILwRG.pgp
Description: PGP signature