use strict;
use warnings;
-use Carp qw/croak/;
+use Carp ();
-use Object::Tiny qw/cmd cwd_as_repo args repos/;
-
-use App::Rgit::Utils qw/validate/;
-use App::Rgit::Repository;
+use App::Rgit::Utils qw/:codes/;
=head1 NAME
=head1 VERSION
-Version 0.01
+Version 0.06
=cut
-our $VERSION = '0.01';
+our $VERSION = '0.06';
=head1 DESCRIPTION
=head1 METHODS
-=head2 C<< new cmd => $cmd, args => \@args, repos => \@repos >>
+=head2 C<< new cmd => $cmd, args => \@args >>
-Creates a new command object for C<$cmd> that will called for all repositories C<@repos> with arguments C<@args>.
+Creates a new command object for C<$cmd> that is bound to be called with arguments C<@args>.
=cut
my %commands;
-__PACKAGE__->action($_ => 'Once') for qw/version help daemon init/, ' ';
+__PACKAGE__->action($_ => 'Once') for qw/daemon gui help init version/, ' ';
sub new {
- my ($class, %args) = &validate;
+ my $class = shift;
+ $class = ref $class || $class;
+
+ my %args = @_;
+
my $cmd = $args{cmd};
$cmd = ' ' unless defined $cmd;
+
my $action = $class->action($cmd);
- croak "Command $cmd shouldn't be executed as an $action"
- unless $class eq __PACKAGE__ or $class->isa($action);
- eval "require $action; 1" or croak "Couldn't load $action: $@";
- my $r = App::Rgit::Repository->new(fake => 1);
- return unless defined $r;
- $action->SUPER::new(
- cmd => $cmd,
- args => $args{args} || [ ],
- repos => $args{repos},
- cwd_as_repo => $r,
- );
+
+ if ($class eq __PACKAGE__) {
+ $class = $action;
+ } else {
+ Carp::confess("Command $cmd should be executed as a $action")
+ unless $class->isa($action);
+ }
+
+ eval "require $action; 1" or Carp::confess("Couldn't load $action: $@");
+
+ bless {
+ cmd => $cmd,
+ args => $args{args} || [ ],
+ policy => $args{policy},
+ }, $class;
}
=head2 C<< action $cmd [ => $pkg ] >>
sub action {
my ($self, $cmd, $pkg) = @_;
- $cmd = $self->cmd if !defined $cmd
- and defined $self and $self->isa(__PACKAGE__);
- return unless defined $cmd;
+ if (not defined $cmd) {
+ return unless defined $self and ref $self and $self->isa(__PACKAGE__);
+ $cmd = $self->cmd;
+ }
unless (defined $pkg) {
return __PACKAGE__ . '::Each' unless defined $commands{$cmd};
return $commands{$cmd}
$commands{$cmd} = $pkg;
}
-=head2 C<cmd>
+=head2 C<report $conf, $repo, $status>
+
+Reports that the execution of the command in C<$repo> exited with C<$status> to the current command's policy.
+Returns what policy C<report> method returned, which should be one of the policy codes listed in C<App::Rgit::Utils>.
-=head2 C<cwd_as_repo>
+=cut
+
+sub report {
+ my ($self) = @_;
+
+ my $code = $self->policy->handle(@_);
+
+ return defined $code ? $code : NEXT;
+}
+
+=head2 C<cmd>
=head2 C<args>
-=head2 C<repos>
+=head2 C<policy>
-Accessors.
+Read-only accessors.
+
+=cut
+
+BEGIN {
+ eval "sub $_ { \$_[0]->{$_} }" for qw/cmd args policy/;
+}
=head2 C<run $conf>
Runs the command with a L<App::Rgit::Config> configuration object.
-Stops as soon as one of the executed commands fails, and returns the corresponding exit code.
-Returns zero when all went fine.
+Handles back the code to return to the system and the last policy.
Implemented in subclasses.
=head1 SEE ALSO
=head1 AUTHOR
Vincent Pit, C<< <perl at profvince.com> >>, L<http://profvince.com>.
-
+
You can contact me by mail or on C<irc.perl.org> (vincent).
=head1 BUGS
=head1 COPYRIGHT & LICENSE
-Copyright 2008 Vincent Pit, all rights reserved.
+Copyright 2008-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.