File Coverage

blib/lib/Venus/Core/Role.pm
Criterion Covered Total %
statement 41 67 61.1
branch n/a
condition n/a
subroutine 13 17 76.4
pod 2 5 40.0
total 56 89 62.9


line stmt bran cond sub pod time code
1             package Venus::Core::Role;
2              
3 96     96   1793 use 5.018;
  96         366  
4              
5 96     96   570 use strict;
  96         196  
  96         2176  
6 96     96   498 use warnings;
  96         255  
  96         3346  
7              
8 96     96   628 no warnings 'once';
  96         226  
  96         4005  
9              
10 96     96   698 use base 'Venus::Core';
  96         246  
  96         14212  
11              
12             # METHODS
13              
14             sub BUILD {
15 0     0 0 0 my ($self, @data) = @_;
16              
17 96     96   768 no strict 'refs';
  96         201  
  96         15344  
18              
19 0         0 my @roles = @{$self->META->roles};
  0         0  
20              
21 0         0 for my $action (grep defined, map *{"${_}::BUILD"}{"CODE"}, @roles) {
  0         0  
22 0         0 $self->$action(@data);
23             }
24              
25 0         0 return $self;
26             }
27              
28             sub DESTROY {
29 0     0   0 my ($self, @data) = @_;
30              
31 96     96   773 no strict 'refs';
  96         254  
  96         23769  
32              
33 0         0 my @mixins = @{$self->META->mixins};
  0         0  
34              
35 0         0 for my $action (grep defined, map *{"${_}::DESTROY"}{"CODE"}, @mixins) {
  0         0  
36 0         0 $self->$action(@data);
37             }
38              
39 0         0 my @roles = @{$self->META->roles};
  0         0  
40              
41 0         0 for my $action (grep defined, map *{"${_}::DESTROY"}{"CODE"}, @roles) {
  0         0  
42 0         0 $self->$action(@data);
43             }
44              
45 0         0 return $self;
46             }
47              
48             sub EXPORT {
49 252     252 0 1156 my ($self, $into) = @_;
50              
51 252         934 return [];
52             }
53              
54             sub IMPORT {
55 3293     3293 0 6846 my ($self, $into) = @_;
56              
57 96     96   859 no strict 'refs';
  96         200  
  96         3791  
58 96     96   594 no warnings 'redefine';
  96         237  
  96         34669  
59              
60 3293         4979 for my $name (grep !*{"${into}::${_}"}{"CODE"}, @{$self->EXPORT($into)}) {
  8000         32622  
  3293         12170  
61 7405         10175 *{"${into}::${name}"} = \&{"@{[$self->NAME]}::${name}"};
  7405         28234  
  7405         9415  
  7405         19539  
62             }
63              
64 3293         7746 return $self;
65             }
66              
67             sub does {
68 1     1 1 5 my ($self, @args) = @_;
69              
70 1         5 return $self->DOES(@args);
71             }
72              
73             sub import {
74 0     0   0 my ($self) = @_;
75              
76 0         0 require Venus;
77              
78 0         0 @_ = ("${self} cannot be used via the \"use\" declaration");
79              
80 0         0 goto \&Venus::fault;
81             }
82              
83             sub meta {
84 1     1 1 4 my ($self) = @_;
85              
86 1         7 return $self->META;
87             }
88              
89             sub unimport {
90 0     0     my ($self, @args) = @_;
91              
92 0           my $target = caller;
93              
94 0           return $self->UNIMPORT($target, @args);
95             }
96              
97             1;
98              
99              
100              
101             =head1 NAME
102              
103             Venus::Core::Role - Role Base Class
104              
105             =cut
106              
107             =head1 ABSTRACT
108              
109             Role Base Class for Perl 5
110              
111             =cut
112              
113             =head1 SYNOPSIS
114              
115             package Person;
116              
117             use base 'Venus::Core::Role';
118              
119             package User;
120              
121             use base 'Venus::Core::Class';
122              
123             package main;
124              
125             my $user = User->ROLE('Person')->new(
126             fname => 'Elliot',
127             lname => 'Alderson',
128             );
129              
130             # bless({fname => 'Elliot', lname => 'Alderson'}, 'User')
131              
132             =cut
133              
134             =head1 DESCRIPTION
135              
136             This package provides a role base class with role building and object
137             construction lifecycle hooks.
138              
139             =cut
140              
141             =head1 INHERITS
142              
143             This package inherits behaviors from:
144              
145             L
146              
147             =cut
148              
149             =head1 METHODS
150              
151             This package provides the following methods:
152              
153             =cut
154              
155             =head2 does
156              
157             does(string $name) (boolean)
158              
159             The does method returns true if the object is composed of the role provided.
160              
161             I>
162              
163             =over 4
164              
165             =item does example 1
166              
167             package Employee;
168              
169             use base 'Venus::Core::Role';
170              
171             Employee->ROLE('Person');
172              
173             package main;
174              
175             my $user = User->ROLE('Employee')->new(
176             fname => 'Elliot',
177             lname => 'Alderson',
178             );
179              
180             my $does = Employee->does('Person');
181              
182             # 1
183              
184             =back
185              
186             =cut
187              
188             =head2 import
189              
190             import(any @args) (any)
191              
192             The import method throws a fatal exception whenever the L
193             declaration is used with roles as they are meant to be consumed via the C
194             or C keyword functions.
195              
196             I>
197              
198             =over 4
199              
200             =item import example 1
201              
202             package main;
203              
204             use Person;
205              
206             # Exception! (isa Venus::Fault)
207              
208             =back
209              
210             =cut
211              
212             =head2 meta
213              
214             meta() (Venus::Meta)
215              
216             The meta method returns a L objects which describes the package's
217             configuration.
218              
219             I>
220              
221             =over 4
222              
223             =item meta example 1
224              
225             package main;
226              
227             my $user = User->ROLE('Person')->new(
228             fname => 'Elliot',
229             lname => 'Alderson',
230             );
231              
232             my $meta = Person->meta;
233              
234             # bless({...}, 'Venus::Meta')
235              
236             =back
237              
238             =cut
239              
240             =head2 unimport
241              
242             unimport(any @args) (any)
243              
244             The unimport method invokes the C lifecycle hook and is invoked
245             whenever the L declaration is used.
246              
247             I>
248              
249             =over 4
250              
251             =item unimport example 1
252              
253             package main;
254              
255             no User;
256              
257             # ()
258              
259             =back
260              
261             =cut
262              
263             =head1 AUTHORS
264              
265             Awncorp, C
266              
267             =cut
268              
269             =head1 LICENSE
270              
271             Copyright (C) 2000, Awncorp, C.
272              
273             This program is free software, you can redistribute it and/or modify it under
274             the terms of the Apache license version 2.0.
275              
276             =cut