| ... | ... | 
                  @@ -1,4 +1,8 @@  | 
              
| 1 | 1 | 
                  0.1692  | 
              
| 2 | 
                  + - separate DBIx::Custom type_rule from filter  | 
              |
| 3 | 
                  + - DBIx::Custom Model filter attrribute is DEPRECATED!  | 
              |
| 4 | 
                  + - removed EXPERIMENTAL DBIx::Custom::Model alias_table  | 
              |
| 5 | 
                  + - added DBIx::Custom column method's table option  | 
              |
| 2 | 6 | 
                  - separate DBIx::Custom::Result type_rule from filter again  | 
              
| 3 | 7 | 
                  0.1692  | 
              
| 4 | 8 | 
                  - removed EXPERIMENTAL DBIx::Model result_filter  | 
              
| ... | ... | 
                  @@ -99,7 +99,16 @@ sub assign_param {
                 | 
              
| 99 | 99 | 
                  }  | 
              
| 100 | 100 | 
                   | 
              
| 101 | 101 | 
                   sub column {
                 | 
              
| 102 | 
                  - my ($self, $table, $columns) = @_;  | 
              |
| 102 | 
                  + my $self = shift;  | 
              |
| 103 | 
                  + my $option = pop if ref $_[-1] eq 'HASH';  | 
              |
| 104 | 
                  + my $real_table = shift;  | 
              |
| 105 | 
                  + my $columns = shift;  | 
              |
| 106 | 
                  +    my $table = $option->{alias} || $real_table;
                 | 
              |
| 107 | 
                  +  | 
              |
| 108 | 
                  + # Columns  | 
              |
| 109 | 
                  +    unless ($columns) {
                 | 
              |
| 110 | 
                  + $columns ||= $self->model($real_table)->columns;  | 
              |
| 111 | 
                  + }  | 
              |
| 103 | 112 | 
                   | 
              
| 104 | 113 | 
                  # Reserved word quote  | 
              
| 105 | 114 | 
                  my $q = $self->reserved_word_quote;  | 
              
| ... | ... | 
                  @@ -305,17 +314,10 @@ sub create_model {
                 | 
              
| 305 | 314 | 
                  my $filter = ref $model->filter eq 'HASH'  | 
              
| 306 | 315 | 
                                  ? [%{$model->filter}]
                 | 
              
| 307 | 316 | 
                  : $model->filter;  | 
              
| 317 | 
                  + warn "DBIx::Custom::Model filter method is DEPRECATED!"  | 
              |
| 318 | 
                  + if @$filter;  | 
              |
| 308 | 319 | 
                  $self->_apply_filter($model->table, @$filter);  | 
              
| 309 | 
                  -  | 
              |
| 310 | 
                  - # Associate table with model  | 
              |
| 311 | 
                  - croak "Table name is duplicated " . _subname  | 
              |
| 312 | 
                  -      if exists $self->{_model_from}->{$model->table};
                 | 
              |
| 313 | 
                  -    $self->{_model_from}->{$model->table} = $model->name;
                 | 
              |
| 314 | 320 | 
                   | 
              
| 315 | 
                  - # Table alias  | 
              |
| 316 | 
                  -    $self->{_table_alias} ||= {};
                 | 
              |
| 317 | 
                  -    $self->{_table_alias} = {%{$self->{_table_alias}}, %{$model->table_alias}};
                 | 
              |
| 318 | 
                  -  | 
              |
| 319 | 321 | 
                  # Set model  | 
              
| 320 | 322 | 
                  $self->model($model->name, $model);  | 
              
| 321 | 323 | 
                   | 
              
| ... | ... | 
                  @@ -381,33 +383,6 @@ sub execute {
                 | 
              
| 381 | 383 | 
                  $_ =~ s/$q//g for @$tables;  | 
              
| 382 | 384 | 
                  }  | 
              
| 383 | 385 | 
                   | 
              
| 384 | 
                  - # Table alias  | 
              |
| 385 | 
                  -    foreach my $table (@$tables) {
                 | 
              |
| 386 | 
                  -  | 
              |
| 387 | 
                  - # No need  | 
              |
| 388 | 
                  -        next unless my $alias = $self->{_table_alias}->{$table};
                 | 
              |
| 389 | 
                  -        $self->{filter} ||= {};
                 | 
              |
| 390 | 
                  -        next if $self->{filter}{out}{$table};
                 | 
              |
| 391 | 
                  -  | 
              |
| 392 | 
                  - # Filter  | 
              |
| 393 | 
                  -        $self->{filter}{out} ||= {};
                 | 
              |
| 394 | 
                  -        $self->{filter}{in}  ||= {};
                 | 
              |
| 395 | 
                  -        $self->{filter}{end} ||= {};
                 | 
              |
| 396 | 
                  -  | 
              |
| 397 | 
                  - # Create alias filter  | 
              |
| 398 | 
                  -        foreach my $type (qw/out in end/) {
                 | 
              |
| 399 | 
                  -            my @filter_names = keys %{$self->{filter}{$type}{$alias} || {}};
                 | 
              |
| 400 | 
                  -            foreach my $filter_name (@filter_names) {
                 | 
              |
| 401 | 
                  - my $filter_name_alias = $filter_name;  | 
              |
| 402 | 
                  - $filter_name_alias =~ s/^$alias\./$table\./;  | 
              |
| 403 | 
                  -                $filter_name_alias =~ s/^${alias}__/${table}__/; 
                 | 
              |
| 404 | 
                  -                $filter_name_alias =~ s/^${alias}-/${table}-/; 
                 | 
              |
| 405 | 
                  -                $self->{filter}{$type}{$table}{$filter_name_alias}
                 | 
              |
| 406 | 
                  -                  = $self->{filter}{$type}{$alias}{$filter_name}
                 | 
              |
| 407 | 
                  - }  | 
              |
| 408 | 
                  - }  | 
              |
| 409 | 
                  - }  | 
              |
| 410 | 
                  -  | 
              |
| 411 | 386 | 
                  # Type rule  | 
              
| 412 | 387 | 
                       my $applied_filter = {};
                 | 
              
| 413 | 388 | 
                       unless ($type_rule_off) {
                 | 
              
| ... | ... | 
                  @@ -981,7 +956,7 @@ sub type_rule {
                 | 
              
| 981 | 956 | 
                  # Into  | 
              
| 982 | 957 | 
                           $type_rule->{into} = _array_to_hash($type_rule->{into});
                 | 
              
| 983 | 958 | 
                           $self->{type_rule} = $type_rule;
                 | 
              
| 984 | 
                  -        $self->{_into} ||= {};
                 | 
              |
| 959 | 
                  +        $self->{_into} = {};
                 | 
              |
| 985 | 960 | 
                           foreach my $type_name (keys %{$type_rule->{into} || {}}) {
                 | 
              
| 986 | 961 | 
                               croak qq{type name of into section must be lower case}
                 | 
              
| 987 | 962 | 
                  if $type_name =~ /[A-Z]/;  | 
              
| ... | ... | 
                  @@ -9,9 +9,7 @@ use DBIx::Custom::Util '_subname';  | 
              
| 9 | 9 | 
                  push @DBIx::Custom::CARP_NOT, __PACKAGE__;  | 
              
| 10 | 10 | 
                   | 
              
| 11 | 11 | 
                  has [qw/dbi name table view/],  | 
              
| 12 | 
                  -    table_alias => sub { {} },
                 | 
              |
| 13 | 12 | 
                       columns => sub { [] },
                 | 
              
| 14 | 
                  -    filter => sub { [] },
                 | 
              |
| 15 | 13 | 
                       join => sub { [] },
                 | 
              
| 16 | 14 | 
                       type => sub { [] },
                 | 
              
| 17 | 15 | 
                       primary_key => sub { [] };
                 | 
              
| ... | ... | 
                  @@ -64,23 +62,6 @@ foreach my $method (@methods) {
                 | 
              
| 64 | 62 | 
                       *{"${class}::$method"} = $code;
                 | 
              
| 65 | 63 | 
                  }  | 
              
| 66 | 64 | 
                   | 
              
| 67 | 
                  -sub column {
                 | 
              |
| 68 | 
                  - my ($self, $table, $columns) = @_;  | 
              |
| 69 | 
                  -  | 
              |
| 70 | 
                  -    $self->{_table_alias} ||= {};
                 | 
              |
| 71 | 
                  - my $dist;  | 
              |
| 72 | 
                  -    $dist = $self->dbi->{_table_alias}{$table}
                 | 
              |
| 73 | 
                  -          ? $self->dbi->{_table_alias}{$table}
                 | 
              |
| 74 | 
                  - : $table;  | 
              |
| 75 | 
                  -  | 
              |
| 76 | 
                  -    $self->dbi->{_model_from} ||= {};
                 | 
              |
| 77 | 
                  -    my $model = $self->dbi->{_model_from}->{$dist};
                 | 
              |
| 78 | 
                  -  | 
              |
| 79 | 
                  - $columns ||= $self->model($model)->columns;  | 
              |
| 80 | 
                  -  | 
              |
| 81 | 
                  - return $self->dbi->column($table, $columns);  | 
              |
| 82 | 
                  -}  | 
              |
| 83 | 
                  -  | 
              |
| 84 | 65 | 
                   sub DESTROY { }
                 | 
              
| 85 | 66 | 
                   | 
              
| 86 | 67 | 
                   sub method {
                 | 
              
| ... | ... | 
                  @@ -117,6 +98,9 @@ sub new {
                 | 
              
| 117 | 98 | 
                  return $self;  | 
              
| 118 | 99 | 
                  }  | 
              
| 119 | 100 | 
                   | 
              
| 101 | 
                  +# DEPRECATED!  | 
              |
| 102 | 
                  +has filter => sub { [] };
                 | 
              |
| 103 | 
                  +  | 
              |
| 120 | 104 | 
                  1;  | 
              
| 121 | 105 | 
                   | 
              
| 122 | 106 | 
                  =head1 NAME  | 
              
| ... | ... | 
                  @@ -138,16 +122,6 @@ my $table = DBIx::Custom::Model->new(table => 'books');  | 
              
| 138 | 122 | 
                   | 
              
| 139 | 123 | 
                  L<DBIx::Custom> object.  | 
              
| 140 | 124 | 
                   | 
              
| 141 | 
                  -=head2 C<filter>  | 
              |
| 142 | 
                  -  | 
              |
| 143 | 
                  - my $dbi = $model->filter  | 
              |
| 144 | 
                  - $model = $model->filter(  | 
              |
| 145 | 
                  -        title => {out => 'tp_to_date', in => 'date_to_tp'}
                 | 
              |
| 146 | 
                  -        author => {out => ..., in => ...},
                 | 
              |
| 147 | 
                  - );  | 
              |
| 148 | 
                  -  | 
              |
| 149 | 
                  -This filter is applied when L<DBIx::Custom>'s C<include_model()> is called.  | 
              |
| 150 | 
                  -  | 
              |
| 151 | 125 | 
                  =head2 C<name>  | 
              
| 152 | 126 | 
                   | 
              
| 153 | 127 | 
                  my $name = $model->name;  | 
              
| ... | ... | 
                  @@ -180,15 +154,6 @@ C<delete_at()>,C<select_at()>.  | 
              
| 180 | 154 | 
                  Table name, this is used as C<select()> C<table> option.  | 
              
| 181 | 155 | 
                  Generally, this is automatically set from class name.  | 
              
| 182 | 156 | 
                   | 
              
| 183 | 
                  -=head2 C<table_alias> EXPERIMENTAL  | 
              |
| 184 | 
                  -  | 
              |
| 185 | 
                  - my $table_alias = $model->table_alias;  | 
              |
| 186 | 
                  - $model = $model->table_alias(user1 => 'user', user2 => 'user');  | 
              |
| 187 | 
                  -  | 
              |
| 188 | 
                  -Table alias. If you define table alias,  | 
              |
| 189 | 
                  -same filter as the table is avaliable  | 
              |
| 190 | 
                  -, and can write $dbi->column('user1') to get all columns.
                 | 
              |
| 191 | 
                  -  | 
              |
| 192 | 157 | 
                  =head2 C<type>  | 
              
| 193 | 158 | 
                   | 
              
| 194 | 159 | 
                  my $type = $model->type;  | 
              
| ... | ... | 
                  @@ -208,22 +173,10 @@ model is included by C<include_model>.  | 
              
| 208 | 173 | 
                   | 
              
| 209 | 174 | 
                  =head1 METHODS  | 
              
| 210 | 175 | 
                   | 
              
| 211 | 
                  -L<DBIx::Custom> inherits all methods from L<Object::Simple>,  | 
              |
| 212 | 
                  -and you can use all methods of the object set to C<dbi>.  | 
              |
| 176 | 
                  +L<DBIx::Custom::Model> inherits all methods from L<Object::Simple>,  | 
              |
| 177 | 
                  +and you can use all methods of L<DBIx::Custom> and L<DBI>  | 
              |
| 213 | 178 | 
                  and implements the following new ones.  | 
              
| 214 | 179 | 
                   | 
              
| 215 | 
                  -=head2 C<column> EXPERIMETNAL  | 
              |
| 216 | 
                  -  | 
              |
| 217 | 
                  - my $column = $model->column(book => ['author', 'title']);  | 
              |
| 218 | 
                  -    my $column = $model->column('book');
                 | 
              |
| 219 | 
                  -  | 
              |
| 220 | 
                  -Create column clause. The follwoing column clause is created.  | 
              |
| 221 | 
                  -  | 
              |
| 222 | 
                  - book.author as "book.author",  | 
              |
| 223 | 
                  - book.title as "book.title"  | 
              |
| 224 | 
                  -  | 
              |
| 225 | 
                  -If Second argument is ommited, all columns set by C<columns> is used.  | 
              |
| 226 | 
                  -  | 
              |
| 227 | 180 | 
                  =head2 C<delete>  | 
              
| 228 | 181 | 
                   | 
              
| 229 | 182 | 
                  $table->delete(...);  | 
              
| ... | ... | 
                  @@ -107,183 +107,137 @@ sub register_tag {
                 | 
              
| 107 | 107 | 
                  # DEPRECATED!  | 
              
| 108 | 108 | 
                   sub _parse_tag {
                 | 
              
| 109 | 109 | 
                  my ($self, $source) = @_;  | 
              
| 110 | 
                  -  | 
              |
| 111 | 110 | 
                  # Source  | 
              
| 112 | 111 | 
                  $source ||= '';  | 
              
| 113 | 
                  -  | 
              |
| 114 | 112 | 
                  # Tree  | 
              
| 115 | 113 | 
                  my @tree;  | 
              
| 116 | 
                  -  | 
              |
| 117 | 114 | 
                  # Value  | 
              
| 118 | 115 | 
                  my $value = '';  | 
              
| 119 | 
                  -  | 
              |
| 120 | 116 | 
                  # State  | 
              
| 121 | 117 | 
                  my $state = 'text';  | 
              
| 122 | 
                  -  | 
              |
| 123 | 118 | 
                  # Before charactor  | 
              
| 124 | 119 | 
                  my $before = '';  | 
              
| 125 | 
                  -  | 
              |
| 126 | 120 | 
                  # Position  | 
              
| 127 | 121 | 
                  my $pos = 0;  | 
              
| 128 | 
                  -  | 
              |
| 129 | 122 | 
                  # Parse  | 
              
| 130 | 123 | 
                  my $original = $source;  | 
              
| 131 | 124 | 
                  my $tag_count = 0;  | 
              
| 132 | 125 | 
                       while (defined(my $c = substr($source, $pos, 1))) {
                 | 
              
| 133 | 
                  -  | 
              |
| 134 | 126 | 
                  # Last  | 
              
| 135 | 127 | 
                  last unless length $c;  | 
              
| 136 | 
                  -  | 
              |
| 137 | 128 | 
                  # Parameter  | 
              
| 138 | 129 | 
                           if ($c eq ':' && (substr($source, $pos + 1, 1) || '') =~ /\w/) {
                 | 
              
| 139 | 130 | 
                               push @tree, {type => 'param'};;
                 | 
              
| 140 | 131 | 
                  }  | 
              
| 141 | 
                  -  | 
              |
| 142 | 132 | 
                  # State is text  | 
              
| 143 | 133 | 
                           if ($state eq 'text') {
                 | 
              
| 144 | 
                  -  | 
              |
| 145 | 134 | 
                  # Tag start charactor  | 
              
| 146 | 135 | 
                               if ($c eq '{') {
                 | 
              
| 147 | 
                  -  | 
              |
| 148 | 136 | 
                  # Escaped charactor  | 
              
| 149 | 137 | 
                                   if ($before eq "\\") {
                 | 
              
| 150 | 138 | 
                  substr($value, -1, 1, '');  | 
              
| 151 | 139 | 
                  $value .= $c;  | 
              
| 152 | 140 | 
                  }  | 
              
| 153 | 
                  -  | 
              |
| 154 | 141 | 
                  # Tag start  | 
              
| 155 | 142 | 
                                   else {
                 | 
              
| 156 | 
                  -  | 
              |
| 157 | 143 | 
                  # Change state  | 
              
| 158 | 144 | 
                  $state = 'tag';  | 
              
| 159 | 
                  -  | 
              |
| 160 | 145 | 
                  # Add text  | 
              
| 161 | 146 | 
                                       push @tree, {type => 'text', value => $value}
                 | 
              
| 162 | 147 | 
                  if $value;  | 
              
| 163 | 
                  -  | 
              |
| 164 | 148 | 
                  # Clear  | 
              
| 165 | 149 | 
                  $value = '';  | 
              
| 166 | 150 | 
                  }  | 
              
| 167 | 151 | 
                  }  | 
              
| 168 | 
                  -  | 
              |
| 169 | 152 | 
                  # Tag end charactor  | 
              
| 170 | 153 | 
                               elsif ($c eq '}') {
                 | 
              
| 171 | 
                  -  | 
              |
| 172 | 154 | 
                  # Escaped charactor  | 
              
| 173 | 155 | 
                                   if ($before eq "\\") {
                 | 
              
| 174 | 156 | 
                  substr($value, -1, 1, '');  | 
              
| 175 | 157 | 
                  $value .= $c;  | 
              
| 176 | 158 | 
                  }  | 
              
| 177 | 
                  -  | 
              |
| 178 | 159 | 
                  # Unexpected  | 
              
| 179 | 160 | 
                                   else {
                 | 
              
| 180 | 161 | 
                                       croak qq{Parsing error. unexpected "\}". }
                 | 
              
| 181 | 162 | 
                                           . qq{pos $pos of "$original" } . _subname
                 | 
              
| 182 | 163 | 
                  }  | 
              
| 183 | 164 | 
                  }  | 
              
| 184 | 
                  -  | 
              |
| 185 | 165 | 
                  # Normal charactor  | 
              
| 186 | 166 | 
                               else { $value .= $c }
                 | 
              
| 187 | 167 | 
                  }  | 
              
| 188 | 
                  -  | 
              |
| 189 | 168 | 
                  # State is tags  | 
              
| 190 | 169 | 
                           else {
                 | 
              
| 191 | 
                  -  | 
              |
| 192 | 170 | 
                  # Tag start charactor  | 
              
| 193 | 171 | 
                               if ($c eq '{') {
                 | 
              
| 194 | 
                  -  | 
              |
| 195 | 172 | 
                  # Escaped charactor  | 
              
| 196 | 173 | 
                                   if ($before eq "\\") {
                 | 
              
| 197 | 174 | 
                  substr($value, -1, 1, '');  | 
              
| 198 | 175 | 
                  $value .= $c;  | 
              
| 199 | 176 | 
                  }  | 
              
| 200 | 
                  -  | 
              |
| 201 | 177 | 
                  # Unexpected  | 
              
| 202 | 178 | 
                                   else {
                 | 
              
| 203 | 179 | 
                                       croak qq{Parsing error. unexpected "\{". }
                 | 
              
| 204 | 180 | 
                                           . qq{pos $pos of "$original" } . _subname
                 | 
              
| 205 | 181 | 
                  }  | 
              
| 206 | 182 | 
                  }  | 
              
| 207 | 
                  -  | 
              |
| 208 | 183 | 
                  # Tag end charactor  | 
              
| 209 | 184 | 
                               elsif ($c eq '}') {
                 | 
              
| 210 | 
                  -  | 
              |
| 211 | 185 | 
                  # Escaped charactor  | 
              
| 212 | 186 | 
                                   if ($before eq "\\") {
                 | 
              
| 213 | 187 | 
                  substr($value, -1, 1, '');  | 
              
| 214 | 188 | 
                  $value .= $c;  | 
              
| 215 | 189 | 
                  }  | 
              
| 216 | 
                  -  | 
              |
| 217 | 190 | 
                  # Tag end  | 
              
| 218 | 191 | 
                                   else {
                 | 
              
| 219 | 
                  -  | 
              |
| 220 | 192 | 
                  # Change state  | 
              
| 221 | 193 | 
                  $state = 'text';  | 
              
| 222 | 
                  -  | 
              |
| 223 | 194 | 
                  # Add tag  | 
              
| 224 | 195 | 
                  my ($tag_name, @tag_args) = split /\s+/, $value;  | 
              
| 225 | 196 | 
                                       push @tree, {type => 'tag', tag_name => $tag_name, 
                 | 
              
| 226 | 197 | 
                  tag_args => \@tag_args};  | 
              
| 227 | 
                  -  | 
              |
| 228 | 198 | 
                  # Clear  | 
              
| 229 | 199 | 
                  $value = '';  | 
              
| 230 | 
                  -  | 
              |
| 231 | 200 | 
                  # Countup  | 
              
| 232 | 201 | 
                  $tag_count++;  | 
              
| 233 | 202 | 
                  }  | 
              
| 234 | 203 | 
                  }  | 
              
| 235 | 
                  -  | 
              |
| 236 | 204 | 
                  # Normal charactor  | 
              
| 237 | 205 | 
                               else { $value .= $c }
                 | 
              
| 238 | 206 | 
                  }  | 
              
| 239 | 
                  -  | 
              |
| 240 | 207 | 
                  # Save before charactor  | 
              
| 241 | 208 | 
                  $before = $c;  | 
              
| 242 | 
                  -  | 
              |
| 243 | 209 | 
                  # increment position  | 
              
| 244 | 210 | 
                  $pos++;  | 
              
| 245 | 211 | 
                  }  | 
              
| 246 | 
                  -  | 
              |
| 247 | 212 | 
                  # Tag not finished  | 
              
| 248 | 213 | 
                       croak qq{Tag not finished. "$original" } . _subname
                 | 
              
| 249 | 214 | 
                  if $state eq 'tag';  | 
              
| 250 | 
                  -  | 
              |
| 251 | 215 | 
                  # Not contains tag  | 
              
| 252 | 216 | 
                  return DBIx::Custom::Query->new(sql => $source, tag_count => $tag_count)  | 
              
| 253 | 217 | 
                  if $tag_count == 0;  | 
              
| 254 | 
                  -  | 
              |
| 255 | 218 | 
                  # Add rest text  | 
              
| 256 | 219 | 
                       push @tree, {type => 'text', value => $value}
                 | 
              
| 257 | 220 | 
                  if $value;  | 
              
| 258 | 
                  -  | 
              |
| 259 | 221 | 
                  # SQL  | 
              
| 260 | 222 | 
                  my $sql = '';  | 
              
| 261 | 
                  -  | 
              |
| 262 | 223 | 
                  # All Columns  | 
              
| 263 | 224 | 
                  my $all_columns = [];  | 
              
| 264 | 
                  -  | 
              |
| 265 | 225 | 
                  # Tables  | 
              
| 266 | 226 | 
                  my $tables = [];  | 
              
| 267 | 
                  -  | 
              |
| 268 | 227 | 
                  # Build SQL  | 
              
| 269 | 228 | 
                       foreach my $node (@tree) {
                 | 
              
| 270 | 
                  -  | 
              |
| 271 | 229 | 
                  # Text  | 
              
| 272 | 230 | 
                           if ($node->{type} eq 'text') { $sql .= $node->{value} }
                 | 
              
| 273 | 
                  -  | 
              |
| 274 | 231 | 
                  # Parameter  | 
              
| 275 | 232 | 
                           elsif ($node->{type} eq 'param') {
                 | 
              
| 276 | 233 | 
                  push @$all_columns, 'RESERVED_PARAMETER';  | 
              
| 277 | 234 | 
                  }  | 
              
| 278 | 235 | 
                  # Tag  | 
              
| 279 | 236 | 
                           else {
                 | 
              
| 280 | 
                  -  | 
              |
| 281 | 237 | 
                  # Tag name  | 
              
| 282 | 238 | 
                               my $tag_name = $node->{tag_name};
                 | 
              
| 283 | 
                  -  | 
              |
| 284 | 239 | 
                  # Tag arguments  | 
              
| 285 | 240 | 
                               my $tag_args = $node->{tag_args};
                 | 
              
| 286 | 
                  -  | 
              |
| 287 | 241 | 
                  # Table  | 
              
| 288 | 242 | 
                               if ($tag_name eq 'table') {
                 | 
              
| 289 | 243 | 
                  my $table = $tag_args->[0];  | 
              
| ... | ... | 
                  @@ -291,38 +245,29 @@ sub _parse_tag {
                 | 
              
| 291 | 245 | 
                  $sql .= $table;  | 
              
| 292 | 246 | 
                  next;  | 
              
| 293 | 247 | 
                  }  | 
              
| 294 | 
                  -  | 
              |
| 295 | 248 | 
                  # Get tag  | 
              
| 296 | 249 | 
                               my $tag = $self->tag_processors->{$tag_name}
                 | 
              
| 297 | 250 | 
                                                || $self->tags->{$tag_name};
                 | 
              
| 298 | 
                  -  | 
              |
| 299 | 251 | 
                  # Tag is not registered  | 
              
| 300 | 252 | 
                               croak qq{Tag "$tag_name" is not registered } . _subname
                 | 
              
| 301 | 253 | 
                  unless $tag;  | 
              
| 302 | 
                  -  | 
              |
| 303 | 254 | 
                  # Tag not sub reference  | 
              
| 304 | 255 | 
                               croak qq{Tag "$tag_name" must be sub reference } . _subname
                 | 
              
| 305 | 256 | 
                  unless ref $tag eq 'CODE';  | 
              
| 306 | 
                  -  | 
              |
| 307 | 257 | 
                  # Execute tag  | 
              
| 308 | 258 | 
                  my $r = $tag->(@$tag_args);  | 
              
| 309 | 
                  -  | 
              |
| 310 | 259 | 
                  # Check tag return value  | 
              
| 311 | 260 | 
                               croak qq{Tag "$tag_name" must return [STRING, ARRAY_REFERENCE] }
                 | 
              
| 312 | 261 | 
                  . _subname  | 
              
| 313 | 262 | 
                  unless ref $r eq 'ARRAY' && defined $r->[0] && ref $r->[1] eq 'ARRAY';  | 
              
| 314 | 
                  -  | 
              |
| 315 | 263 | 
                  # Part of SQL statement and colum names  | 
              
| 316 | 264 | 
                  my ($part, $columns) = @$r;  | 
              
| 317 | 
                  -  | 
              |
| 318 | 265 | 
                  # Add columns  | 
              
| 319 | 266 | 
                  push @$all_columns, @$columns;  | 
              
| 320 | 
                  -  | 
              |
| 321 | 267 | 
                  # Join part tag to SQL  | 
              
| 322 | 268 | 
                  $sql .= $part;  | 
              
| 323 | 269 | 
                  }  | 
              
| 324 | 270 | 
                  }  | 
              
| 325 | 
                  -  | 
              |
| 326 | 271 | 
                  # Query  | 
              
| 327 | 272 | 
                  my $query = DBIx::Custom::Query->new(  | 
              
| 328 | 273 | 
                  sql => $sql,  | 
              
| ... | ... | 
                  @@ -330,7 +275,6 @@ sub _parse_tag {
                 | 
              
| 330 | 275 | 
                  tables => $tables,  | 
              
| 331 | 276 | 
                  tag_count => $tag_count  | 
              
| 332 | 277 | 
                  );  | 
              
| 333 | 
                  -  | 
              |
| 334 | 278 | 
                  return $query;  | 
              
| 335 | 279 | 
                  }  | 
              
| 336 | 280 | 
                   | 
              
| ... | ... | 
                  @@ -340,13 +284,10 @@ has tag_processors => sub { {} };
                 | 
              
| 340 | 284 | 
                  # DEPRECATED!  | 
              
| 341 | 285 | 
                   sub register_tag_processor {
                 | 
              
| 342 | 286 | 
                  my $self = shift;  | 
              
| 343 | 
                  -  | 
              |
| 344 | 287 | 
                  warn "register_tag_processor is DEPRECATED! use register_tag instead";  | 
              
| 345 | 
                  -  | 
              |
| 346 | 288 | 
                  # Merge tag  | 
              
| 347 | 289 | 
                       my $tag_processors = ref $_[0] eq 'HASH' ? $_[0] : {@_};
                 | 
              
| 348 | 290 | 
                       $self->tag_processors({%{$self->tag_processors}, %{$tag_processors}});
                 | 
              
| 349 | 
                  -  | 
              |
| 350 | 291 | 
                  return $self;  | 
              
| 351 | 292 | 
                  }  | 
              
| 352 | 293 | 
                   | 
              
| ... | ... | 
                  @@ -423,6 +423,7 @@ Fetch multiple rows and put them into array of array reference.  | 
              
| 423 | 423 | 
                   | 
              
| 424 | 424 | 
                  Set filter for column.  | 
              
| 425 | 425 | 
                  You can use subroutine or filter name as filter.  | 
              
| 426 | 
                  +This filter is executed after C<type_rule> filter.  | 
              |
| 426 | 427 | 
                   | 
              
| 427 | 428 | 
                  =head2 C<one>  | 
              
| 428 | 429 | 
                   | 
              
| ... | ... | 
                  @@ -2170,7 +2170,7 @@ $model = $dbi->model('table1');
                 | 
              
| 2170 | 2170 | 
                   eval{$model->execute('select * from table1')};
                 | 
              
| 2171 | 2171 | 
                  ok(!$@);  | 
              
| 2172 | 2172 | 
                   | 
              
| 2173 | 
                  -test 'table_alias';  | 
              |
| 2173 | 
                  +test 'column table option';  | 
              |
| 2174 | 2174 | 
                   $dbi = MyDBI9->connect($NEW_ARGS->{0});
                 | 
              
| 2175 | 2175 | 
                   $dbi->execute($CREATE_TABLE->{0});
                 | 
              
| 2176 | 2176 | 
                   $dbi->execute($CREATE_TABLE->{2});
                 | 
              
| ... | ... | 
                  @@ -2180,32 +2180,32 @@ $dbi->execute('insert into table2 (key1, key3) values (1, 4);');
                 | 
              
| 2180 | 2180 | 
                   $model = $dbi->model('table1');
                 | 
              
| 2181 | 2181 | 
                  $result = $model->select(  | 
              
| 2182 | 2182 | 
                  column => [  | 
              
| 2183 | 
                  -        $model->column('table2_alias')
                 | 
              |
| 2183 | 
                  +        $model->column('table2', {alias => 'table2_alias'})
                 | 
              |
| 2184 | 2184 | 
                  ],  | 
              
| 2185 | 
                  -    where => {'table2_alias.key3' => 2}
                 | 
              |
| 2185 | 
                  +    where => {'table2_alias.key3' => 4}
                 | 
              |
| 2186 | 2186 | 
                  );  | 
              
| 2187 | 2187 | 
                  is_deeply($result->one,  | 
              
| 2188 | 
                  -          {'table2_alias.key1' => 1, 'table2_alias.key3' => 48});
                 | 
              |
| 2188 | 
                  +          {'table2_alias.key1' => 1, 'table2_alias.key3' => 4});
                 | 
              |
| 2189 | 2189 | 
                   | 
              
| 2190 | 2190 | 
                   $dbi->separator('__');
                 | 
              
| 2191 | 2191 | 
                  $result = $model->select(  | 
              
| 2192 | 2192 | 
                  column => [  | 
              
| 2193 | 
                  -        $model->column('table2_alias')
                 | 
              |
| 2193 | 
                  +        $model->column('table2', {alias => 'table2_alias'})
                 | 
              |
| 2194 | 2194 | 
                  ],  | 
              
| 2195 | 
                  -    where => {'table2_alias.key3' => 2}
                 | 
              |
| 2195 | 
                  +    where => {'table2_alias.key3' => 4}
                 | 
              |
| 2196 | 2196 | 
                  );  | 
              
| 2197 | 2197 | 
                  is_deeply($result->one,  | 
              
| 2198 | 
                  -          {'table2_alias__key1' => 1, 'table2_alias__key3' => 48});
                 | 
              |
| 2198 | 
                  +          {'table2_alias__key1' => 1, 'table2_alias__key3' => 4});
                 | 
              |
| 2199 | 2199 | 
                   | 
              
| 2200 | 2200 | 
                   $dbi->separator('-');
                 | 
              
| 2201 | 2201 | 
                  $result = $model->select(  | 
              
| 2202 | 2202 | 
                  column => [  | 
              
| 2203 | 
                  -        $model->column('table2_alias')
                 | 
              |
| 2203 | 
                  +        $model->column('table2', {alias => 'table2_alias'})
                 | 
              |
| 2204 | 2204 | 
                  ],  | 
              
| 2205 | 
                  -    where => {'table2_alias.key3' => 2}
                 | 
              |
| 2205 | 
                  +    where => {'table2_alias.key3' => 4}
                 | 
              |
| 2206 | 2206 | 
                  );  | 
              
| 2207 | 2207 | 
                  is_deeply($result->one,  | 
              
| 2208 | 
                  -          {'table2_alias-key1' => 1, 'table2_alias-key3' => 48});
                 | 
              |
| 2208 | 
                  +          {'table2_alias-key1' => 1, 'table2_alias-key3' => 4});
                 | 
              |
| 2209 | 2209 | 
                   | 
              
| 2210 | 2210 | 
                  test 'type() option';  | 
              
| 2211 | 2211 | 
                  $dbi = DBIx::Custom->connect(  | 
              
| ... | ... | 
                  @@ -2,7 +2,6 @@ package MyModel8::table1;  | 
              
| 2 | 2 | 
                  use MyModel8 -base;  | 
              
| 3 | 3 | 
                   | 
              
| 4 | 4 | 
                   has join => sub { ['left join table2 as table2_alias on table1.key1 = table2_alias.key1'] };
                 | 
              
| 5 | 
                  -has table_alias => sub { {'table2_alias' => 'table2'} };
                 | 
              |
| 6 | 5 | 
                   | 
              
| 7 | 6 | 
                   | 
              
| 8 | 7 | 
                  1;  |