use strict; use warnings; package Petal::CodePerl::Expr; require Exporter; use base 'Exporter'; use Petal::CodePerl::Expr::DerefTAL; use Petal::CodePerl::Expr::PathExists; use Petal::CodePerl::Expr::Alternate; use Petal::CodePerl::Expr::PerlSprintf; our %EXPORT_TAGS = ( easy => [qw( dereft pathexists alternate perlsprintf )], ); our @EXPORT_OK = @{$EXPORT_TAGS{"easy"}}; =head1 NAME Code::Perl::Expr - Extra Code::Perl classes for Petal =head1 DESCRIPTION These are some extra L Expression classes that are specific to Petal =head1 EXPRESSION CLASSES C has been removed from the front of the class names, so for example C is really C. =cut =head2 Alternate $class->new(Paths => \@paths); alternate(@paths); @paths - an array of Expression objects Alternate will try each expression in turn, looking for the first one which evaluates without dieing. =cut sub alternate { return Petal::CodePerl::Expr::Alternate->new( Paths => [@_], ); } =head2 $class->new(Expr => $path); pathexists($path); $path - an Expression object PathExists will return true if the $path can be followed without dieing, false otherwise =cut sub pathexists { my $expr = shift; return Petal::CodePerl::Expr::PathExists->new( Expr => $expr, ); } =head2 DerefTAL $class->new(Ref => $ref, Key => $key); dereft($ref, $key); $ref - an Expression object $key - a string DerefTAL will attempt to dereference the object returned by $ref in the TAL style, using the $key. This means if $ref yields a blessed reference the $key will used as a method name if possible. If $key cannot be used as a method name or $ref yielded an unblessed reference then DerefTAL tries to dereference $ref as an array or a hash, using $key. If $ref doesn't yield a reference then we die. =cut sub dereft { my $ref = shift; my $key = shift; my $strict = shift || 0; return Petal::CodePerl::Expr::DerefTAL->new( Ref => $ref, Key => $key, Strict => $strict, ); } =head2 PerlSprintf $class->new(Perl => $perl, Params => \@params); perlsprintf($perl, @params); $string - an string of Perl code @params - an array of exprs to be place into the string B When PerlSprintf is producing Perl code, it will use Perl's sprintf function to insert the expressions in @params into the string in $string. You should put a %s in $string to mark where you want the expressions in @params to be placed. The expressions will be wrapped in () to avoid precedence problems. Because it uses Perl's sprintf function you must B if there is a "%" in your Perl, you have to change any "%" to "%%". perlsprintf('$array[%s].$hash->{%s}', scal("a"), string("harry")); will give perl like $array[($a]).$hash->{"harray"} =cut sub perlsprintf { my $perl = shift; my @params = @_; return Petal::CodePerl::Expr::PerlSprintf->new( Perl => $perl, Params => \@params, ); } 1; __END__ =head1 AUTHOR Written by Fergal Daly . =head1 COPYRIGHT Copyright 2003 by Fergal Daly Efergal@esatclear.ieE. This program is free software and comes with no warranty. It is distributed under the LGPL license See the file F included in this distribution or F. =cut