решил сделать свой аналогичный, мне он не понравился тем что там надо тэги другие вставлять, и не опнял на счет фильтрации что делать
1) но я не опнял зачем там используется
Catalyst::Controller
http://cpansearch.perl.org/src/JCAMACHO ... Builder.pm
и методы с него
Код: Выделить всё
sub create_action {
my $self = shift;
my %args = @_;
my $attr_name = $self->_fb_setup->{attr_name};
if ( exists $args{attributes}{$attr_name} ) {
$args{_attr_params} = delete $args{attributes}{$attr_name};
if ( my $source_type = $self->_fb_setup->{source_type} ) {
$args{_source_type} = $source_type;
}
push @{ $args{attributes}{ActionClass} }, $self->_fb_setup->{action};
}
$self->SUPER::create_action(%args);
}
Код: Выделить всё
sub _formbuilder {
my $self = shift;
my $method = $self->_fb_setup->{method_name};
$self->$method(@_);
}
если я правильно понял сделан для того чтобы "прицепить" к объекту $c методы (только не понятно зачем)
http://x0.org.ua/perl/Action.pm
Код: Выделить всё
sub execute {
my $self = shift;
my ( $controller, $c ) = @_;
return $self->NEXT::execute(@_)
unless exists $self->attributes->{ActionClass}
&& $self->attributes->{ActionClass}[0] eq
$controller->_fb_setup->{action};
my $form = $self->_setup_form(@_);
Scalar::Util::weaken($form->{c});
$controller->_formbuilder($form);
$self->NEXT::execute(@_);
$controller->_formbuilder($form); # keep the same form in case of forwards
$self->setup_template_vars( @_ );
}
что такое $controller?
3) вот я написал свой класс!!
что мне надо в него добавить, что он вызывался так как Catalyst::Controller::FormBuilder
my $form = $self->formbuilder, инициализировался сам? и чтобы методы его "диспатчизировались" есл ия правильно понимаю
вот мой класс:
Код: Выделить всё
package FormValid;
# use strict;
use warnings;
use base qw(Class::Accessor);
__PACKAGE__->mk_accessors(qw/name id html text/);
sub new {
my $class = shift;
my $self = bless {}, $class;
return $self;
}
sub disp {
my $self = shift;
my $name = $self->name;
my $id = $self->id;
my $html = $self->html;
my $text = $self->text;
..............................................
что происходит после этого *{"$class\::$method"} = $class->make_accessor($method); ?
вот еще нашел не понял:
Код: Выделить всё
*{__PACKAGE__ . "::$sub"} = sub {
Код: Выделить всё
sub new {
my ( $self, $c ) = @_;
$self = $self->NEXT::new($c);
$self->{namespace} ||= ref $self;
$self->{additional_base_classes} ||= ();
for my $sub ( @{$self->{subroutines}} ) {
my $target_class = $self->{target_class};
unless ( $CLASS_CACHE{$target_class}{$sub} ) {
$c->log->debug( "Installing sub:$sub from target_class:$target_class into proxy" ) if $c->debug;
$CLASS_CACHE{$target_class}{$sub} = 1;
no strict 'refs';
*{__PACKAGE__ . "::$sub"} = sub {
shift;
return $c->model($target_class)->$sub(@_);
}
}
}
return $self;
}
Код: Выделить всё
*{"${class}::${collection_moniker}::ACCEPT_CONTEXT"} = sub {
Код: Выделить всё
................................................................
foreach my $moniker ( keys %collections ) {
next if $collections{$moniker};
# perhaps you're too lazy to create Collection class.
# now we should try creating default one!
my $package_body = <<"EOT";
package $moniker;
use strict;
use base qw( Jifty::DBI::Collection );
1;
EOT
eval $package_body;
croak "Can't prepare $moniker: $@" if $@;
}
foreach my $moniker ( @monikers ) {
$moniker->require or croak $@;
next if $moniker =~ /Collection$/;
$moniker =~ s/^$schema_base\:://;
*{"${class}::${moniker}::ACCEPT_CONTEXT"} = sub {
shift;
shift->model( $model_name )->record( $moniker );
};
my $collection_moniker = $moniker.'Collection';
*{"${class}::${collection_moniker}::ACCEPT_CONTEXT"} = sub {
shift;
shift->model( $model_name )->collection( $collection_moniker );
};
}
return $self;
}