File Coverage

blib/lib/Rope/Object.pm
Criterion Covered Total %
statement 35 46 76.0
branch 8 16 50.0
condition 5 9 55.5
subroutine 8 12 66.6
pod 0 1 0.0
total 56 84 66.6


line stmt bran cond sub pod time code
1             package Rope::Object;
2              
3 4     4   23 use strict;
  4         5  
  4         100  
4 4     4   15 use warnings;
  4         5  
  4         2402  
5              
6             sub TIEHASH {
7 5     5   13 my ($class, $obj) = @_;
8 5   50     25 my $self = bless $obj || {}, $class;
9 5         14 $self->compile();
10 5         15 return $self;
11             }
12              
13             sub compile {
14 5     5 0 11 my ($self) = @_;
15 5         5 $self->{keys} = scalar keys %{$self->{properties}};
  5         31  
16             $self->{sort_keys} = [sort {
17             $self->{properties}->{$a}->{index} <=> $self->{properties}->{$b}->{index}
18 5         20 } grep { $self->{properties}->{$_}->{enumerable} } keys %{$self->{properties}}];
  10         27  
  14         36  
  5         23  
19 5         9 return $self;
20             }
21            
22             sub STORE {
23 4     4   11 my ($self, $key, $value) = @_;
24 4         10 my $k = $self->{properties}->{$key};
25 4 100       15 if ($k) {
    50          
26 3 50       10 if ($k->{writable}) {
    100          
27 0         0 $k->{value} = $value;
28             } elsif ($k->{configurable}) {
29 2 50 100     14 if ((ref($value) || "") eq (ref($k->{value}) || "")) {
      100        
30 2         6 $k->{value} = $value;
31             } else {
32 0         0 die "Cannot change Object ($self->{name}) property ($key) type";
33             }
34             } else {
35 1         9 die "Cannot set Object ($self->{name}) property ($key) it is only readable";
36             }
37             } elsif (! $self->{locked}) {
38             $self->{properties}->{$key} = {
39             value => $value,
40             writable => 1,
41             configurable => 1,
42             enumerable => 1,
43             index => ++$self->{keys}
44 1         5 };
45 1         2 push @{$self->{sort_keys}}, $key;
  1         3  
46             } else {
47 0         0 die "Object ($self->{name}) is locked you cannot extend with new properties";
48             }
49 3         13 return $self;
50             }
51            
52             sub FETCH {
53 15     15   106 my ($self, $key) = @_;
54 15         27 my $k = $self->{properties}->{$key};
55 15 50       56 return $k ? $k->{value} : undef;
56             }
57            
58             sub FIRSTKEY {
59 2     2   9 goto &NEXTKEY;
60             }
61            
62             sub NEXTKEY {
63 7     7   13 return (each @{$_[0]->{sort_keys}})[1];
  7         32  
64             }
65            
66             sub EXISTS {
67 0     0     exists $_[0]->{properties}->{$_[1]};
68             }
69            
70             sub DELETE {
71 0     0     my $k = $_[0]->{properties}->{$_[1]};
72 0 0 0       my $del = !$_[0]->{locked} && $k->{writeable} ? delete $_[0]->{properties}->{$_[1]} : undef;
73 0 0         $_[0]->compile() if $del;
74 0           return $del;
75             }
76            
77             sub CLEAR {
78 0     0     return;
79             #%{$_[0]->{properties}} = ()
80             }
81            
82             sub SCALAR {
83 0     0     scalar keys %{$_[0]->{properties}}
  0            
84             }
85              
86             1;
87              
88             __END__