Bigtop
view release on metacpan or search on metacpan
lib/Bigtop/Parser.pm view on Meta::CPAN
my $name = $element->{__DATA__}[0];
$output{ $output_type }{ $name } = $element->{__DATA__}[1];
}
return [
{
'__TYPE__' => 'controllers',
'__DATA__' => [
$self->{__NAME__} => {
__IDENT__ => $self->{ __IDENT__ },
%output
}
],
}
];
}
sub use_date_plugin {
my $self = shift;
shift;
my $data = shift;
my $it_is_I = $self->walk_postorder(
'do_I_control', $data->{ table }
)->[0];
my @retval;
if ( $it_is_I ) {
# first, update my uses
my $current_uses = $self->get_controller_statement( 'uses' );
if ( not defined $current_uses ) {
$self->add_controller_statement(
{
keyword => 'uses',
new_value => 'Gantry::Plugins::Calendar',
}
);
push @retval, $self->get_ident . '::uses',
$self->get_controller_statement( 'uses' )->{ __ARGS__ };
}
else { # see if its already there
my %current_modules = map { $_ => 1 }
@{ $current_uses->{ __ARGS__ } };
unless ( defined $current_modules{ 'Gantry::Plugins::Calendar' } )
{
push @{ $current_uses->{ __ARGS__ } },
'Gantry::Plugins::Calendar';
}
push @retval,
$self->get_ident . '::uses',
$current_uses->{ __ARGS__ };
}
# then, tell update my form
my $result = $self->walk_postorder(
'add_date_popups', $data->{ table }
);
push @retval, @{ $result };
return \@retval;
}
return;
}
package # controller_method
controller_method;
use strict; use warnings;
use base 'application_ancestor';
sub new {
my $class = shift;
my $parent = shift;
my $params = shift;
my $type = $params->{new_child}{sub_type} || 'stub';
my $self = {
__IDENT__ => Bigtop::Parser->get_ident(),
__NAME__ => $params->{new_child}{name},
__BODY__ => method_body->new(),
__TYPE__ => $type,
__PARENT__ => $parent,
};
$self->{__BODY__}{__PARENT__} = $self;
return bless $self, $class;
}
sub get_ident {
my $self = shift;
return $self->{__IDENT__};
}
sub get_name {
my $self = shift;
return $self->{__NAME__};
}
sub set_name {
my $self = shift;
$self->{__NAME__} = shift;
}
sub set_type {
my $self = shift;
$self->{__TYPE__} = shift;
}
sub get_controller_ident {
my $self = shift;
lib/Bigtop/Parser.pm view on Meta::CPAN
sub remove_method_statement {
my $self = shift;
shift;
my $data = shift;
return unless ( $data->{ident} eq $self->get_ident() );
my $doomed_child = -1;
my $count = 0;
my $statements = $self->{ __BODY__ }{'method_statement(s?)'};
STATEMENT:
foreach my $statement ( @{ $statements } ) {
next STATEMENT unless $statement->{__KEYWORD__} eq $data->{keyword};
$doomed_child = $count;
last STATEMENT;
}
continue {
$count++;
}
if ( $doomed_child >= 0 ) {
# This probably leaks memory because children have parent pointers.
# But the parent is me and I'm the app_body, so maybe not.
splice @{ $statements }, $doomed_child, 1;
}
# else, nothing to see here, move along quietly
return [ 1 ];
}
sub get_method_statement {
my $self = shift;
my $keyword = shift;
my $statements = $self->{ __BODY__ }{'method_statement(s?)'};
STATEMENT:
foreach my $statement ( @{ $statements} ) {
next STATEMENT unless $statement->{__KEYWORD__} eq $keyword;
return $statement;
}
return;
}
sub change_type {
my $self = shift;
shift;
my $data = shift;
return unless ( $self->get_ident eq $data->{ident} );
$self->set_type( $data->{new_type} );
return [ 1 ];
}
sub add_date_popups {
my $self = shift;
shift;
my $table = shift;
return unless $self->{ __TYPE__ } =~ /form/;
# First, make sure the form is named for the table (or has a name)
my $form_statement = $self->get_method_statement( 'form_name' );
my $form_name = $table;
if ( defined $form_statement ) {
$form_name = $form_statement->{ __ARGS__ }->get_first_arg();
}
else { # create a form_name statement
$self->add_method_statement(
{
keyword => 'form_name',
new_value => $table,
}
);
}
# Second, make sure that name is in javascript code for calendars.
my $javascript_code = qq{\$self->calendar_month_js( '$table' )},
my $keys_statement = $self->get_method_statement( 'extra_keys' );
my $extra_keys;
if ( defined $keys_statement ) {
push @{ $keys_statement->{ __ARGS__ } },
{ javascript => $javascript_code };
$extra_keys = $keys_statement->{ __ARGS__ };
}
else {
$self->add_method_statement(
{
keyword => 'extra_keys',
new_value => {
'keys' => 'javascript',
'values' => $javascript_code,
},
}
);
$extra_keys = $self->get_method_statement( 'extra_keys' )->{__ARGS__};
}
my $ident = $self->get_ident;
return [
$ident . '::form_name' => $table,
$ident . '::extra_keys' => $extra_keys,
];
}
sub update_field_name {
my $self = shift;
my $child_output = shift;
my $data = shift;
my $count = 0;
( run in 1.581 second using v1.01-cache-2.11-cpan-364913b4093 )