File Coverage

blib/lib/Class/Plain.pm
Criterion Covered Total %
statement 28 30 93.3
branch 2 4 50.0
condition 1 2 50.0
subroutine 9 9 100.0
pod 0 1 0.0
total 40 46 86.9


line stmt bran cond sub pod time code
1             package Class::Plain 0.06;
2              
3 7     7   344615 use v5.16;
  7         58  
4 7     7   28 use warnings;
  7         9  
  7         164  
5              
6 7     7   23 use Carp;
  7         11  
  7         341  
7              
8 7     7   39 use mro;
  7         10  
  7         59  
9 7     7   2956 use Role::Tiny ();
  7         25423  
  7         131  
10 7     7   2830 use Role::Tiny::With ();
  7         1312  
  7         335  
11              
12 7     7 0 4366 sub dl_load_flags { 0x01 }
13              
14             require DynaLoader;
15             __PACKAGE__->DynaLoader::bootstrap( our $VERSION );
16              
17             our $XSAPI_VERSION = "0.48";
18              
19 7     7   2362 use Class::Plain::Base;
  7         16  
  7         1300  
20              
21             sub import {
22 10     10   5516 my $class = shift;
23 10         18 my $caller = caller;
24              
25 10         23 my %syms = map { $_ => 1 } @_;
  0         0  
26              
27             # Default imports
28 10 50       32 unless( %syms ) {
29 10         70 $syms{$_}++ for qw(class method field);
30             }
31              
32 10   50     126 delete $syms{$_} and $^H{"Class::Plain/$_"}++ for qw( class method field);
33              
34 10 50       5178 croak "Unrecognised import symbols @{[ keys %syms ]}" if keys %syms;
  0            
35             }
36              
37             =encoding UTF-8
38              
39             =head1 Name
40              
41             C - a class syntax for the hash-based Perl OO.
42              
43             =head1 Usage
44              
45             use Class::Plain;
46            
47             class Point {
48             field x : reader;
49             field y : reader;
50            
51             method new : common {
52             my $self = $class->SUPER::new(@_);
53            
54             $self->{x} //= 0;
55             $self->{y} //= 0;
56            
57             return $self;
58             }
59            
60             method move {
61             my ($x, $y) = @_;
62            
63             $self->{x} += $x;
64             $self->{y} += $y;
65             }
66            
67             method to_string {
68             return "($self->{x},$self->{y})";
69             }
70             }
71            
72             my $point = Point->new(x => 5, y => 10);
73             print $point->x . "\n";
74             print $point->y . "\n";
75             print $point->to_string . "\n";
76              
77             Inheritance:
78              
79             class Point3D : isa(Point) {
80             field z : reader;
81            
82             method new : common {
83             my $self = $class->SUPER::new(@_);
84            
85             $self->{z} //= 0;
86            
87             return $self;
88             }
89            
90             method move {
91             my ($x, $y, $z) = @_;
92            
93             $self->SUPER::move($x, $y);
94             $self->{z} += $z;
95             }
96            
97             method to_string {
98             return "($self->{x},$self->{y},$self->{z})";
99             }
100             }
101              
102             my $point3d = Point3D->new(x => 5, y => 10, z => 15);
103             print $point3d->x . "\n";
104             print $point3d->y . "\n";
105             print $point3d->z . "\n";
106             print $point3d->to_string . "\n";
107              
108             See also L.
109              
110             =head1 Description
111              
112             This module provides a class syntax for the hash-based Perl OO.
113              
114             =head1 Class
115              
116             =head2 class Keyword
117              
118             A class is defined by the C keyword.
119              
120             class NAME { ... }
121              
122             class NAME : ATTRS... { ... }
123              
124             Behaves similarly to the C keyword, but provides a package that
125             defines a new class.
126              
127             As with C, an optional block may be provided. If so, the contents of
128             that block define the new class and the preceding package continues
129             afterwards. If not, it sets the class as the package context of following
130             keywords and definitions.
131              
132             =head2 Class Attribute
133              
134             The following class attributes are supported.
135              
136             =head3 isa Class Attribute
137            
138             # The single inheritance
139             : isa(SUPER_CLASS)
140            
141             # The multiple inheritance
142             : isa(SUPER_CLASS1) isa(SUPER_CLASS2)
143            
144             # The super class is nothing
145             : isa()
146              
147             Specifies a supper classes that this class extends.
148              
149             If the supper class is not specified by C attribute, the class inherits L.
150              
151             The super class is added to the end of C<@ISA>.
152              
153             If the the super class name doesn't exists in the Perl's symbol table, the super class is loaded.
154              
155             Otherwise if the super class doesn't have the C method and doesn't have the class names in C<@ISA>, the super class is loaded.
156              
157             =head3 does Class Attribute
158            
159             : does(ROLE)
160            
161             : does(ROLE1) does(ROLE2)
162              
163             Specifies roles that this class does. This is the alias for L.
164              
165             See also L.
166              
167             =head1 Field
168              
169             =head2 field Keyword
170              
171             A field is defined by the C keyword.
172              
173             field NAME;
174            
175             field NAME : ATTR ATTR...;
176              
177             The following field attributes are supported:
178              
179             =head2 field Attribute
180              
181             =head3 reader Field Attribute
182              
183             : reader
184            
185             : reader(METHOD_NAME)
186              
187             Generates a reader method to return the current value of the field. If no name
188             is given, the name of the field is used.
189              
190             field x : reader;
191              
192             # This is the same as the following code.
193             method x {
194             $self->{x};
195             }
196              
197             The different method name can be specified.
198              
199             field x : reader(x_different_name);
200              
201             =head3 writer Field Attribute
202              
203             : writer
204              
205             : writer(METHOD_NAME)
206              
207             Generates a writer method to set a new value of the field from its arguments.
208             If no name is given, the name of the field is used prefixed by C.
209              
210             field x : writer;
211              
212             # This is the same as the following code.
213             method set_x {
214             $self->{x} = shift;
215             return $self;
216             }
217              
218             The different method name can be specified.
219              
220             field x : writer(set_x_different_name);
221              
222             =head3 rw Field Attribute
223              
224             : rw
225              
226             : rw(METHOD_NAME)
227              
228             Generates a read-write method to set and get the value of the field.
229             If no name is given, the name of the field is used.
230              
231             field x : rw;
232              
233             # This is the same as the following code.
234             method x {
235             if (@_) {
236             $self->{x} = shift;
237             return $self;
238             }
239             $self->{x};
240             }
241              
242             The different method name can be specified.
243              
244             field x : rw(x_different_name);
245              
246             =head1 Method
247              
248             =head2 method Keyword
249              
250             method NAME {
251             ...
252             }
253              
254             method NAME : ATTR ATTR ... {
255             ...
256             }
257              
258             Define a new named method. This behaves similarly to the C keyword.
259             In addition, the method body will have a lexical called C<$self>
260             which contains the invocant object directly; it will already have been shifted
261             from the C<@_> array.
262              
263             B
264            
265             # An instance method
266             method to_string {
267            
268             my $string = "($self->{x},$self->{y})";
269            
270             return $string;
271             }
272              
273             =head2 Method Attribute
274              
275             The following method attributes are supported.
276              
277             =head3 common Method Attribute
278            
279             : common
280              
281             Marks that this method is a class-common method, instead of a regular instance
282             method. A class-common method may be invoked on class names instead of
283             instances. Within the method body there is a lexical C<$class> available instead of C<$self>.
284             It will already have been shifted from the C<@_> array.
285              
286             B
287              
288             # A class method
289             method new : common {
290             my $self = $class->SUPER::new(@_);
291            
292             # ...
293            
294             return $self;
295             }
296              
297             =head1 Role
298              
299             =head2 role Keyword
300              
301             A role is defined by the C keyword.
302              
303             role NAME { ... }
304              
305             role NAME : ATTRS... { ... }
306              
307             C adopts the role features of L. All features of L can be used.
308              
309             B
310              
311             The examples in the document of L is rewritten to the following codes.
312              
313             use Class::Plain;
314            
315             role Some::Role {
316            
317             method foo { ... }
318            
319             method bar { ... }
320             }
321            
322             class Some::Class : does(Some::Role) {
323             method foo { ... }
324            
325             # baz is wrapped in the around modifier by Class::Method::Modifiers
326             method baz { ... }
327             }
328              
329             =head2 Role Attribute
330              
331             =head3 does Role Attribute
332            
333             : does(ROLE)
334            
335             : does(ROLE1) does(ROLE2)
336              
337             The same as L.
338              
339             =head2 Required Method
340              
341             In roles, the required method for the composed class can be defined by omitting its method block.
342              
343             method required_method;
344              
345             This is alias for L.
346              
347             requires "required_method";
348              
349             =head2 does Method
350              
351             $object->does('Some::Role');
352              
353             Checks if the object does the role.
354              
355             =head1 Required Perl Version
356              
357             Perl 5.16+.
358              
359             =head1 Subroutine Signatures Support
360              
361             C> supports the L from C.
362              
363             The L was supported from C,
364             but the parser L used in C can parse only the subroutine signatures after C.
365              
366             use feature 'signatures';
367            
368             use Class::Plain;
369            
370             Class Point {
371            
372             # ...
373            
374             method move($x = 0, $y = 0) {
375             $self->{x} += $x;
376             $self->{y} += $y;
377             }
378            
379             # ...
380            
381             }
382              
383             =head1 Cookbook
384              
385             Exmples of C.
386              
387             L
388              
389             =head1 See Also
390              
391             =head2 Object::Pad
392              
393             The implementation of the C module is started from the copy of the source code of L.
394              
395             =head2 Corinna
396              
397             C uses the keywords and attributes that are specified in L.
398              
399             The keywords: C, C, C.
400              
401             The attributes: C, C, C, C.
402              
403             Only the C attribute is got from L, L, L.
404              
405             =head2 XS::Parse::Keyword
406              
407             The C and C keywords are parsed by L.
408              
409             =head2 XS::Parse::Sublike
410              
411             The C keyword is parsed by L.
412              
413             =head2 Role::Tiny
414              
415             L is used to implement role features of C.
416              
417             =head1 Repository
418              
419             L
420              
421             =head1 Author
422              
423             Yuki Kimoto Ekimoto.yuki@gmail.comE
424              
425             =head1 Copyright & LICENSE
426              
427             Copyright 2022-2022 Yuki Kimoto, all rights reserved.
428              
429             This program is free software; you can redistribute it and/or modify it
430             under the same terms as Perl itself.
431              
432             =cut
433              
434             1;