use warnings;
use strict;

package Jifty::Action::Record::Execute;
use base qw/ Jifty::Action::Record /;

=head1 NAME

Jifty::Action::Record::Execute - Simple abstract based for record actions

=head1 SYNOPSIS

  use strict;
  use warnings;

  package MyApp::Action::StartEncabulator;
  use base qw/ MyApp::Action::ExecuteEncabulator /;

  use Jifty::Param::Schema;
  use Jifty::Action schema {
      param cardinal_grammeter_mode =>
          type is 'text',
          valid_values are qw/
              magneto-reluctance
              capacitive-duractance
              sinusoidal-depleneration
          /,
          is mandatory,
          ;
  }; 

  sub take_action {
      my $self = shift;

      my $mode = $self->argument_value('cardinal_grammeter_mode');
      $self->record->start($mode);

      $self->result->success('Deluxe Encabulator has started!');
  }

  # Later in your templates:
  my $encabulator = MyApp::Model::Encabulator->new;
  $encabulator->load($id);

  my $startup = Jifty->web->new_action( 
      class  => 'StartEncabulator',
      record => $encabulator,
  );

  Jifty->web->form->start;

  Jifty->web->out( $startup->form_field('cardinal_grammeter_mode') );

  Jifty->web->form->submit(
      label  => _('Start'),
      submit => $startup,
  );

  Jifty->web->form->end;

=head1 DESCRIPTION

This action class is a good generic basis for creating custom action classes. It expects a record object to be associated and is (in this way) very similar to L<Jifty::Action::Record::Delete>.

You can use L<Jifty::Param::Schema> to add additional form fields to the action and such.

=head1 METHODS

=head2 arguments

This is customized so that it expects the C<record> argument of all L<Jifty::Action::Record> actions, but also allows for overrides using L<Jifty::Param::Schema>.

=cut

# XXX TODO Copied from Jifty::Action::Record::Delete
sub arguments {
    my $self = shift;
    my $arguments = {};

    # Mark the primary key for use in the constructor and not rendered
    for my $pk (@{ $self->record->_primary_keys }) {
        $arguments->{$pk}{'constructor'} = 1;
        # XXX TODO IS THERE A BETTER WAY TO NOT RENDER AN ITEM IN arguments
        $arguments->{$pk}{'render_as'} = 'Unrendered'; 
        # primary key fields should always be hidden fields
    }

    if ( $self->can('PARAMS') ) {
        use Jifty::Param::Schema;
        return Jifty::Param::Schema::merge_params(
            $arguments, ($self->PARAMS || {})
        );
    }
    else {
        return $arguments;
    }
}

=head2 take_action

This overrides the definition in L<Jifty::Action::Record> so that it does absolutely nothing rather than complain. You will probably want to implement your own version that actually does something.

=cut

sub take_action {}

=head1 SEE ALSO

L<Jifty::Action>, L<Jifty::Action::Record>, L<Jifty::Record>

=head1 LICENSE

Jifty is Copyright 2005-2010 Best Practical Solutions, LLC.
Jifty is distributed under the same terms as Perl itself.

=cut

1;