The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Rose::HTML::Object::Repeatable;

use strict;

use Carp;
use Clone::PP();

use base 'Rose::HTML::Form';

our $VERSION = '0.613';

#
# Class data
#

use Rose::Class::MakeMethods::Generic
(
  inheritable_scalar => 
  [
    'default_prototype_class',
  ],
);

#
# Object data
#

use Rose::Object::MakeMethods::Generic
(
  scalar =>
  [
    'default_count' => { interface => 'get_set_init' },
    'prototype',
  ],
);

sub init_default_count { 0 }

sub is_repeatable { 1 }

sub prototype_class
{
  my($self) = shift;

  if(@_)
  {
    return $self->{'prototype_class'} = shift;
  }

  return $self->{'prototype_class'} || ref($self)->default_prototype_class;  
}

sub prototype_spec
{
  my($self) = shift;

  if(@_)
  {
    if(@_ == 1)
    {
      if(ref($_[0]) eq 'ARRAY')
      {
        $self->{'prototype_spec'} = shift;
      }
      elsif(ref($_[0]) eq 'HASH')
      {
        $self->{'prototype_spec'} = shift;
      }
      else
      {
        croak "Invalid prototype spec: @_";
      }
    }
    else
    {
      $self->{'prototype_spec'} = [ @_ ];
    }
  }

  return $self->{'prototype_spec'};
}

sub prototype_clone
{
  my($self) = shift;

  if(my $obj = $self->prototype)
  {
    return Clone::PP::clone($obj);
  }
  else
  {
    my $args = $self->prototype_spec || [];
    $args = [ %$args ]  if(ref $args eq 'HASH');
    return $self->prototype_class->new(@$args);
  }
}

sub empty_is_ok
{
  my($self) = shift;

  if(@_)
  {
    foreach my $form ($self->forms)
    {
      $form->empty_is_ok(@_);
    }

    return $self->{'empty_is_ok'} = $_[0] ? 1 : 0;
  }

  my $forms = $self->forms;

  return $self->{'empty_is_ok'}  unless(@$forms);

  foreach my $form (@$forms)
  {
    return 0  unless($form->empty_is_ok);
  }

  return 1;
}

1;