File Coverage

blib/lib/MouseX/Foreign/Meta/Role/Class.pm
Criterion Covered Total %
statement 23 23 100.0
branch 6 8 75.0
condition n/a
subroutine 4 4 100.0
pod 0 1 0.0
total 33 36 91.6


line stmt bran cond sub pod time code
1             package MouseX::Foreign::Meta::Role::Class;
2 32     32   328652 use Mouse::Role;
  32         37361  
  32         19385  
3 32     32   22243 use Mouse::Util::MetaRole;
  32         1854  
  32         14816  
4              
5             __PACKAGE__->meta->add_metaclass_accessor('foreign_superclass');
6              
7             after superclasses => sub {
8             my($self, @args) = @_;
9             if(@args && !$self->name->isa('Mouse::Object')) {
10             push @{$self->{superclasses}}, 'Mouse::Object';
11             }
12             return;
13             };
14              
15             before verify_superclass => sub {
16             my($self, $super, $super_meta) = @_;
17              
18             if(defined($super_meta) && $super_meta->does(__PACKAGE__)) {
19             $self->inherit_from_foreign_class($super);
20             }
21             return;
22             };
23              
24             sub inherit_from_foreign_class { # override
25 43     43 0 1187 my($self, $super) = @_;
26 43 100       495 if(defined $self->foreign_superclass) {
27 2         22 $self->throw_error(
28             "Multiple inheritance"
29             . " from foreign classes ($super, "
30             . $self->foreign_superclass
31             . ") is forbidden");
32             }
33 41         92 my %traits;
34 41 50       264 if($super->can('new')) {
35 41         166 $traits{constructor} = ['MouseX::Foreign::Meta::Role::Method::Constructor'];
36             }
37 41 100       318 if($super->can('DESTROY')) {
38 4         14 $traits{destructor} = ['MouseX::Foreign::Meta::Role::Method::Destructor'];
39             }
40 41 50       168 if(%traits) {
41 41         305 $self->foreign_superclass($super);
42 41         261 $_[0] = $self = Mouse::Util::MetaRole::apply_metaroles(
43             for => $self,
44             class_metaroles => \%traits,
45             );
46              
47             # FIXME
48 41         21281 $self->add_method(
49             new => $self->constructor_class->_generate_constructor($self),
50             );
51 41         857 $self->add_method(
52             DESTROY => $self->destructor_class->_generate_destructor($self),
53             );
54             }
55 41         267 return;
56             }
57              
58 32     32   194 no Mouse::Role;
  32         69  
  32         186  
59             1;
60             __END__