lib/Test/Valgrind/Action/Test.pm
lib/Test/Valgrind/Carp.pm
lib/Test/Valgrind/Command.pm
+lib/Test/Valgrind/Command/Aggregate.pm
lib/Test/Valgrind/Command/Perl.pm
lib/Test/Valgrind/Command/PerlScript.pm
lib/Test/Valgrind/Report.pm
--- /dev/null
+package Test::Valgrind::Command::Aggregate;
+
+use strict;
+use warnings;
+
+=head1 NAME
+
+Test::Valgrind::Command::Aggregate - A Test::Valgrind command that aggregates several other commands.
+
+=head1 VERSION
+
+Version 1.01
+
+=cut
+
+our $VERSION = '1.01';
+
+=head1 DESCRIPTION
+
+=cut
+
+use Scalar::Util ();
+
+use base qw/Test::Valgrind::Command Test::Valgrind::Carp/;
+
+=head1 METHODS
+
+This class inherits L<Test::Valgrind::Command>.
+
+=head2 C<< new commands => \@commands, ... >>
+
+=cut
+
+my $all_cmds = sub {
+ for (@{$_[0]}) {
+ return 0 unless Scalar::Util::blessed($_)
+ and $_->isa('Test::Valgrind::Command');
+ }
+ return 1;
+};
+
+sub new {
+ my $class = shift;
+ $class = ref($class) || $class;
+
+ my %args = @_;
+
+ my $cmds = delete $args{commands};
+ $class->_croak('Invalid commands list')
+ unless $cmds and ref $cmds eq 'ARRAY' and $all_cmds->($cmds);
+
+ my $self = bless $class->SUPER::new(), $class;
+
+ $self->{commands} = [ @$cmds ];
+
+ $self;
+}
+
+=head2 C<commands>
+
+Read-only accessor for the C<commands> option.
+
+=cut
+
+sub commands { @{$_[0]->{commands} || []} }
+
+=head1 SEE ALSO
+
+L<Test::Valgrind>, L<Test::Valgrind::Command>.
+
+=head1 AUTHOR
+
+Vincent Pit, C<< <perl at profvince.com> >>, L<http://www.profvince.com>.
+
+You can contact me by mail or on C<irc.perl.org> (vincent).
+
+=head1 BUGS
+
+Please report any bugs or feature requests to C<bug-test-valgrind at rt.cpan.org>, or through the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Test-Valgrind>.
+I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
+
+=head1 SUPPORT
+
+You can find documentation for this module with the perldoc command.
+
+ perldoc Test::Valgrind::Command::Aggregate
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright 2009 Vincent Pit, all rights reserved.
+
+This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
+
+=cut
+
+1; # End of Test::Valgrind::Command::Aggregate
Runs the command C<$command> through C<valgrind> with the tool C<$tool>, which will report to the action C<$action>.
+If the command is a L<Test::Valgrind::Command::Aggregate> object, the action and the tool will be initialized once before running all the aggregated commands.
+
=cut
sub run {
my $self = shift;
- $self->start(@_);
+ my %args = @_;
+
+ $self->start(%args);
my $guard = bless sub { $self->finish } => 'Test::Valgrind::Session::Guard';
+ $self->_run($args{command});
+}
+
+sub _run {
+ my ($self, $cmd) = @_;
+
+ if ($cmd->isa('Test::Valgrind::Command::Aggregate')) {
+ $self->_run($_) for $cmd->commands;
+ return;
+ }
+
+ $self->command($cmd);
+
$self->report(Test::Valgrind::Report->new_diag(
'Using valgrind ' . $self->version . ' located at ' . $self->valgrind
));
my $trustparents = { coverage_class => 'Pod::Coverage::CountParents' };
-plan tests => 15;
+plan tests => 16;
pod_coverage_ok('Test::Valgrind');
pod_coverage_ok('Test::Valgrind::Carp');
pod_coverage_ok('Test::Valgrind::Command');
+pod_coverage_ok('Test::Valgrind::Command::Aggregate', $trustparents);
pod_coverage_ok('Test::Valgrind::Command::Perl', $trustparents);
pod_coverage_ok('Test::Valgrind::Command::PerlScript', $trustparents);