9 use Moose::Util::TypeConstraints;
10 use MooseX::Types -declare => [qw/NameSeparator/];
11 use MooseX::Types::Moose qw/ArrayRef Str Int HashRef CodeRef/;
12 use MooseX::AttributeHelpers;
16 subtype NameSeparator,
18 #where { @$_ == 1 ||| @$_ == 2 },
19 #message { "Name separator must be one or two elements" };
21 coerce NameSeparator, from Str, via { [ $_ ] };
23 our $VERSION = '2.000000';
25 our $AST_VERSION = '1';
27 # Operator precedence for bracketing
38 # LIKE is always "field LIKE <value>"
40 '-not_like' => 'NOT LIKE',
43 has where_dispatch_table => (
46 isa => HashRef[CodeRef],
47 metaclass => 'Collection::ImmutableHash',
49 get => 'lookup_where_dispatch'
57 metaclass => 'Collection::ImmutableHash',
59 exists => 'is_valid_binop',
60 get => 'binop_mapping',
61 keys => 'binary_operators'
65 sub _build_binop_map { return {%BINOP_MAP} };
67 method _build_where_dispatch_table {
68 my $binop = $self->can('_binop') or croak "InternalError: $self can't do _binop!";
70 map { $_ => $binop } $self->binary_operators
80 has name_separator => (
83 default => sub { ['.'] },
88 has list_separator => (
98 clearer => '_clear_binds',
100 default => sub { [ ] },
101 metaclass => 'Collection::Array',
107 # TODO: once MXMS supports %args, use that here
108 method create(ClassName $class: Int $ver) {
109 croak "AST version $ver is greater than supported version of $AST_VERSION"
110 if $ver > $AST_VERSION;
112 my $name = "${class}::AST::v$ver";
113 Class::MOP::load_class($name);
115 return $name->new(ast_version => $ver);
119 method generate(ClassName $class: ArrayRef $ast) {
120 croak "SQL::Abstract AST version not specified"
121 unless ($ast->[0] eq '-ast_version');
123 my (undef, $ver) = splice(@$ast, 0, 2);
125 # TODO: once MXMS supports %args, use that here
126 my $self = $class->create($ver);
128 return ($self->dispatch($ast), $self->binds);
132 $self->_clear_binds();
135 method dispatch (ArrayRef $ast) {
137 local $_ = $ast->[0];
138 s/^-/_/ or croak "Unknown type tag '$_'";
140 my $meth = $self->can($_) || croak "Unknown tag '$_'";
141 return $meth->($self, $ast);