File Coverage

blib/lib/Rope/Object.pm
Criterion Covered Total %
statement 29 40 72.5
branch 10 18 55.5
condition 4 15 26.6
subroutine 7 11 63.6
pod n/a
total 50 84 59.5


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