]> git.vpit.fr Git - perl/modules/rgit.git/blobdiff - lib/App/Rgit/Command.pm
Make sure the POD headings are linkable
[perl/modules/rgit.git] / lib / App / Rgit / Command.pm
index 51ac158edcbdf159480b7edb7e56373c300f2362..b4d78dd4984270f922a9b080b3c6963455651a40 100644 (file)
@@ -3,12 +3,9 @@ package App::Rgit::Command;
 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
 
@@ -16,11 +13,11 @@ App::Rgit::Command - Base class for App::Rgit commands.
 
 =head1 VERSION
 
-Version 0.02
+Version 0.08
 
 =cut
 
-our $VERSION = '0.02';
+our $VERSION = '0.08';
 
 =head1 DESCRIPTION
 
@@ -30,38 +27,51 @@ This is an internal class to L<rgit>.
 
 =head1 METHODS
 
-=head2 C<< new cmd => $cmd, args => \@args, repos => \@repos >>
+=head2 C<new>
+
+    my $arc = App::Rgit::Command->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);
+
  if ($class eq __PACKAGE__) {
   $class = $action;
  } else {
-  croak "Command $cmd should be executed as a $action"
-                               unless $class->isa($action);
+  Carp::confess("Command $cmd should be executed as a $action")
+                                                    unless $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;
- $class->SUPER::new(
-  cmd         => $cmd,
-  args        => $args{args} || [ ],
-  repos       => $args{repos},
-  cwd_as_repo => $r,
- );
+
+ 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 ] >>
+=head2 C<action>
+
+    my $pkg = $arc->action($cmd);
+    $arc->action($cmd => $pkg);
 
 If C<$pkg> is supplied, handles command C<$cmd> with C<$pkg> objects.
 Otherwise, returns the current class for C<$cmd>.
@@ -82,21 +92,43 @@ sub action {
  $commands{$cmd} = $pkg;
 }
 
-=head2 C<cmd>
+=head2 C<report>
 
-=head2 C<cwd_as_repo>
+    my $code = $arc->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>.
+
+=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.
 
-=head2 C<run $conf>
+=cut
+
+BEGIN {
+ eval "sub $_ { \$_[0]->{$_} }" for qw/cmd args policy/;
+}
+
+=head2 C<run>
+
+    my $code = $arc->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
@@ -106,12 +138,13 @@ L<rgit>.
 =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
 
-Please report any bugs or feature requests to C<bug-rgit at rt.cpan.org>, or through the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=rgit>.  I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
+Please report any bugs or feature requests to C<bug-rgit at rt.cpan.org>, or through the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=rgit>.
+I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
 
 =head1 SUPPORT
 
@@ -121,7 +154,7 @@ You can find documentation for this module with the perldoc command.
 
 =head1 COPYRIGHT & LICENSE
 
-Copyright 2008 Vincent Pit, all rights reserved.
+Copyright 2008,2009,2010 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.