File Coverage

blib/lib/DBIx/QuickDB/Util/HashBase.pm
Criterion Covered Total %
statement 79 87 90.8
branch 28 34 82.3
condition 8 17 47.0
subroutine 14 18 77.7
pod 1 1 100.0
total 130 157 82.8


line stmt bran cond sub pod time code
1             package DBIx::QuickDB::Util::HashBase;
2 27     27   81469 use strict;
  27         67  
  27         826  
3 27     27   110 use warnings;
  27         40  
  27         1755  
4              
5             our $VERSION = '0.000051';
6              
7             #################################################################
8             # #
9             # This is a generated file! Do not modify this file directly! #
10             # Use hashbase_inc.pl script to regenerate this file. #
11             # The script is part of the Object::HashBase distribution. #
12             # Note: You can modify the version number above this comment #
13             # if needed, that is fine. #
14             # #
15             #################################################################
16              
17             {
18 27     27   122 no warnings 'once';
  27         51  
  27         2721  
19             $DBIx::QuickDB::Util::HashBase::HB_VERSION = '0.009';
20             *DBIx::QuickDB::Util::HashBase::ATTR_SUBS = \%Object::HashBase::ATTR_SUBS;
21             *DBIx::QuickDB::Util::HashBase::ATTR_LIST = \%Object::HashBase::ATTR_LIST;
22             *DBIx::QuickDB::Util::HashBase::VERSION = \%Object::HashBase::VERSION;
23             *DBIx::QuickDB::Util::HashBase::CAN_CACHE = \%Object::HashBase::CAN_CACHE;
24             }
25              
26              
27             require Carp;
28             {
29 27     27   144 no warnings 'once';
  27         35  
  27         2339  
30             $Carp::Internal{+__PACKAGE__} = 1;
31             }
32              
33             BEGIN {
34             # these are not strictly equivalent, but for out use we don't care
35             # about order
36             *_isa = ($] >= 5.010 && require mro) ? \&mro::get_linear_isa : sub {
37 27     27   122 no strict 'refs';
  27         41  
  27         3056  
38 0         0 my @packages = ($_[0]);
39 0         0 my %seen;
40 0         0 for my $package (@packages) {
41 0         0 push @packages, grep !$seen{$_}++, @{"$package\::ISA"};
  0         0  
42             }
43 0         0 return \@packages;
44             }
45 27 50 33 27   13645 }
46              
47             my %SPEC = (
48             '^' => {reader => 1, writer => 0, dep_writer => 1, read_only => 0, strip => 1},
49             '-' => {reader => 1, writer => 0, dep_writer => 0, read_only => 1, strip => 1},
50             '>' => {reader => 0, writer => 1, dep_writer => 0, read_only => 0, strip => 1},
51             '<' => {reader => 1, writer => 0, dep_writer => 0, read_only => 0, strip => 1},
52             '+' => {reader => 0, writer => 0, dep_writer => 0, read_only => 0, strip => 1},
53             );
54              
55             sub import {
56 117     117   14969 my $class = shift;
57 117         243 my $into = caller;
58              
59             # Make sure we list the OLDEST version used to create this class.
60 117   33     352 my $ver = $DBIx::QuickDB::Util::HashBase::HB_VERSION || $DBIx::QuickDB::Util::HashBase::VERSION;
61 117 50 33     447 $DBIx::QuickDB::Util::HashBase::VERSION{$into} = $ver if !$DBIx::QuickDB::Util::HashBase::VERSION{$into} || $DBIx::QuickDB::Util::HashBase::VERSION{$into} > $ver;
62              
63 117         637 my $isa = _isa($into);
64 117   50     526 my $attr_list = $DBIx::QuickDB::Util::HashBase::ATTR_LIST{$into} ||= [];
65 117   50     439 my $attr_subs = $DBIx::QuickDB::Util::HashBase::ATTR_SUBS{$into} ||= {};
66              
67             my %subs = (
68             ($into->can('new') ? () : (new => \&_new)),
69 92 50       3756 (map %{$DBIx::QuickDB::Util::HashBase::ATTR_SUBS{$_} || {}}, @{$isa}[1 .. $#$isa]),
  117         307  
70             (
71             map {
72 117 100       1246 my $p = substr($_, 0, 1);
  845         1193  
73 845         937 my $x = $_;
74              
75 845   100     3074 my $spec = $SPEC{$p} || {reader => 1, writer => 1};
76              
77 845 100       1453 substr($x, 0, 1) = '' if $spec->{strip};
78 845         1283 push @$attr_list => $x;
79 845         1435 my ($sub, $attr) = (uc $x, $x);
80              
81 845     0   3938 $attr_subs->{$sub} = sub() { $attr };
  0         0  
82 845         1367 my %out = ($sub => $attr_subs->{$sub});
83              
84 845 100   17   2457 $out{$attr} = sub { $_[0]->{$attr} } if $spec->{reader};
  17     0   116  
85 845 100   8   1520 $out{"set_$attr"} = sub { $_[0]->{$attr} = $_[1] } if $spec->{writer};
  8     0   57  
86 845 100   1   1882 $out{"set_$attr"} = sub { Carp::croak("'$attr' is read-only") } if $spec->{read_only};
  1     0   245  
87 845 100   1   1240 $out{"set_$attr"} = sub { Carp::carp("set_$attr() is deprecated"); $_[0]->{$attr} = $_[1] } if $spec->{dep_writer};
  1         1015  
  1         14  
88              
89 845         2794 %out;
90             } @_
91             ),
92             );
93              
94 27     27   178 no strict 'refs';
  27         60  
  27         13506  
95 117         742 *{"$into\::$_"} = $subs{$_} for keys %subs;
  3140         185514  
96             }
97              
98             sub attr_list {
99 3     3 1 1781 my $class = shift;
100              
101 3         15 my $isa = _isa($class);
102              
103 3         7 my %seen;
104 15         45 my @list = grep { !$seen{$_}++ } map {
105 3         9 my @out;
  6         10  
106              
107 6 50 50     31 if (0.004 > ($DBIx::QuickDB::Util::HashBase::VERSION{$_} || 0)) {
108 0         0 Carp::carp("$_ uses an inlined version of DBIx::QuickDB::Util::HashBase too old to support attr_list()");
109             }
110             else {
111 6         13 my $list = $DBIx::QuickDB::Util::HashBase::ATTR_LIST{$_};
112 6 50       23 @out = $list ? @$list : ()
113             }
114              
115 6         21 @out;
116             } reverse @$isa;
117              
118 3         21 return @list;
119             }
120              
121             sub _new {
122 11     11   150560 my $class = shift;
123              
124 11         23 my $self;
125              
126 11 100       40 if (@_ == 1) {
127 3         6 my $arg = shift;
128 3         8 my $type = ref($arg);
129              
130 3 100       11 if ($type eq 'HASH') {
131 1         5 $self = bless({%$arg}, $class)
132             }
133             else {
134 2 50       8 Carp::croak("Not sure what to do with '$type' in $class constructor")
135             unless $type eq 'ARRAY';
136              
137 2         5 my %proto;
138 2         6 my @attributes = attr_list($class);
139 2         23 while (@$arg) {
140 9         17 my $val = shift @$arg;
141 9 100       185 my $key = shift @attributes or Carp::croak("Too many arguments for $class constructor");
142 8         24 $proto{$key} = $val;
143             }
144              
145 1         4 $self = bless(\%proto, $class);
146             }
147             }
148             else {
149 8         32 $self = bless({@_}, $class);
150             }
151              
152             $DBIx::QuickDB::Util::HashBase::CAN_CACHE{$class} = $self->can('init')
153 10 100       66 unless exists $DBIx::QuickDB::Util::HashBase::CAN_CACHE{$class};
154              
155 10 100       129 $self->init if $DBIx::QuickDB::Util::HashBase::CAN_CACHE{$class};
156              
157 10         45 $self;
158             }
159              
160             1;
161              
162             __END__