use strictures 1; use Data::Query::ExprBuilder::Identifier; use Data::Query::ExprHelpers; use Data::Query::Constants; sub expr (&) { _run_expr($_[0])->{expr}; } sub _run_expr { local $_ = Data::Query::ExprBuilder::Identifier->new({ expr => Identifier(), }); $_[0]->(); } sub AS { my $as = shift; (bless(\$as, 'LIES::AS'), @_); } sub SELECT (&;@) { my @select = map +( ref() ? $_ : { expr => perl_scalar_value($_) } ), _run_expr(shift); my @final; while (@select) { my $e = shift @select; push @final, (ref($select[0]) eq 'LIES::AS' ? Alias(${shift(@select)}, $e->{expr}) : $e->{expr} ); } return +{ expr => Select(\@final, ($_[0]||{})->{expr}) }; } sub BY (&;@) { @_ } sub FROM (&;@) { my @from = _run_expr(shift); if (@from == 2 and ref($from[1]) eq 'LIES::AS') { return +{ expr => Alias(${$from[1]}, $from[0]) }; } elsif (@from == 1) { return { expr => $from[0] }; } die "Huh?" } 1;