AC-MrGamoo

 view release on metacpan or  search on metacpan

lib/AC/MrGamoo/Submit/Compile/Block.pm  view on Meta::CPAN

# -*- perl -*-

# Copyright (c) 2009 AdCopy
# Author: Jeff Weisberg
# Created: 2009-Oct-28 16:35 (EDT)
# Function: 
#
# $Id: Block.pm,v 1.1 2010/11/01 18:42:00 jaw Exp $

package AC::MrGamoo::Submit::Compile::Block;
use strict;

my $UCLASS = 'AC::MrGamoo::User';

sub new {
    my $class = shift;

    return bless {}, $class;
}

sub compile {
    my $me   = shift;
    my $inc  = shift;

    my $prog = "{\n";

    my $class = $me->{attr}{in_package} || $UCLASS;
    $prog .= "package $class;\n";
    if( $class eq $UCLASS ){
        $prog .= "our \$R;\n";
    }else{
        $prog .= "our \$R = \$$UCLASS\::R;\n";
    }

    if( !defined($me->{attr}{use_strict}) || $me->{attr}{use_strict} ){
        $prog .= "use strict;\n";
    }

    if( $inc ){
        $prog .= $inc;
    }

    if( $me->{init} ){
        $prog .= $me->{init};
    }

    $prog .= " {\n";
    $prog .= _compile_attr( $me->{attr} );
    for my $k qw(code cleanup){
        next unless $me->{$k};
        next if( ref $me->{$k} );

        $prog .= "  $k => sub {\n$me->{$k}\n  },\n";
    }
    $prog .= " };\n}\n";

    return $prog;
}

sub _compile_attr {
    my $h = shift;

    my $x = "  attr => {\n";
    for my $k (keys %$h){
        my $v = $h->{$k};
        next if ref $v;
        next if $k =~ /\W/;
        $v =~ s/(["\\])/\\$1/g;
        $x .= "   \"$k\" => \"$v\",\n";
    }

    $x .= "  },\n";
}


1;



( run in 4.436 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )