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;