Dave Cross: Still Munging Data With Perl: Online event - Mar 27 Learn more

use Scalar::Util ();
use strict;
use overload '""' => 'stringify', fallback => 1;
sub new {
my ($proto, $join, @parts) = @_;
bless([
$join, map Scalar::Util::blessed($_) ? [ @$_ ] : $_, @parts
], ref($proto) || $proto);
}
sub stringify {
my ($self) = @_;
my ($join, @parts) = @$self;
return join($join, map +(ref() ? stringify($_) : $_), @parts);
}
sub to_array { return @{$_[0]} }
sub formatter {
my ($self, %opts) = @_;
SQL::Abstract::Formatter->new(%opts)
}
sub format {
my ($self, %opts) = @_;
$self->formatter(%opts)
->format($self->to_array);
}
1;