File Coverage

blib/lib/Aniki/Schema.pm
Criterion Covered Total %
statement 49 51 96.0
branch 9 12 75.0
condition n/a
subroutine 11 11 100.0
pod 1 4 25.0
total 70 78 89.7


line stmt bran cond sub pod time code
1             package Aniki::Schema;
2 29     29   170306 use 5.014002;
  29         108  
3              
4 29     29   1170 use namespace::autoclean;
  29         39039  
  29         181  
5 29     29   2981 use Mouse v2.4.5;
  29         53859  
  29         178  
6              
7 29     29   22918 use SQL::Translator::Schema::Constants;
  29         17648  
  29         2022  
8 29     29   192 use Carp qw/croak/;
  29         63  
  29         1207  
9 29     29   9664 use Aniki::Schema::Table;
  29         2821  
  29         17871  
10              
11             has schema_class => (
12             is => 'ro',
13             required => 1,
14             );
15              
16             has context => (
17             is => 'ro',
18             default => sub { shift->schema_class->context }
19             );
20              
21             has _table_cache => (
22             is => 'ro',
23             default => sub {
24             my $self = shift;
25             return {
26             map { $_->name => Aniki::Schema::Table->new($_, $self) } $self->context->schema->get_tables()
27             };
28             },
29             );
30              
31             sub BUILD {
32 30     30 1 96 my $self = shift;
33              
34             # for cache
35 30         151 for my $table ($self->get_tables) {
36 89         330 for my $relationship ($table->get_relationships->all) {
37 118         423 $relationship->get_inverse_relationships();
38             }
39             }
40             }
41              
42             sub get_table {
43 362     362 0 7673 my ($self, $table_name) = @_;
44 362 50       1477 return unless exists $self->_table_cache->{$table_name};
45 362         1557 return $self->_table_cache->{$table_name};
46             }
47              
48             sub get_tables {
49 78     78 0 186 my $self = shift;
50 78         156 return values %{ $self->_table_cache };
  78         448  
51             }
52              
53             sub has_many {
54 72     72 0 248 my ($self, $table_name, $fields) = @_;
55 72         1595 my $table = $self->context->schema->get_table($table_name);
56 72 50       1801 return !!1 unless defined $table;
57              
58 72         215 my %field = map { $_ => 1 } @$fields;
  72         350  
59 72 100       319 for my $unique (grep { $_->type eq UNIQUE || $_->type eq PRIMARY_KEY } $table->get_constraints) {
  86         6356  
60 77         16675 my @field_names = $unique->field_names;
61 77         5561 my @related_fields = grep { $field{$_} } @field_names;
  77         285  
62 77 100       856 return !!0 if @field_names == @related_fields;
63             }
64 9         48 for my $index (grep { $_->type eq UNIQUE } $table->get_indices) {
  12         938  
65 2         213 my @field_names = $index->fields;
66 2         121 my @related_fields = grep { $field{$_} } @field_names;
  2         6  
67 2 100       13 return !!0 if @field_names == @related_fields;
68             }
69 8         980 return !!1;
70             }
71              
72             our $AUTOLOAD;
73             sub AUTOLOAD {
74 65     65   141 my $self = shift;
75 65         397 my $method = $AUTOLOAD =~ s/^.*://r;
76 65 50       1612 if ($self->context->schema->can($method)) {
77 65         1842 return $self->context->schema->$method(@_);
78             }
79              
80 0           my $class = ref $self;
81 0           croak qq{Can't locate object method "$method" via package "$class"};
82             }
83              
84             __PACKAGE__->meta->make_immutable();
85             __END__