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.05;
2              
3 7     7   373637 use v5.16;
  7         67  
4 7     7   30 use warnings;
  7         14  
  7         207  
5              
6 7     7   29 use Carp;
  7         12  
  7         343  
7              
8 7     7   43 use mro;
  7         19  
  7         46  
9 7     7   3272 use Role::Tiny ();
  7         27761  
  7         143  
10 7     7   2812 use Role::Tiny::With ();
  7         1399  
  7         363  
11              
12 7     7 0 3808 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   2491 use Class::Plain::Base;
  7         16  
  7         1328  
20              
21             sub import {
22 10     10   6184 my $class = shift;
23 10         20 my $caller = caller;
24              
25 10         23 my %syms = map { $_ => 1 } @_;
  0         0  
26              
27             # Default imports
28 10 50       31 unless( %syms ) {
29 10         71 $syms{$_}++ for qw(class method field);
30             }
31              
32 10   50     130 delete $syms{$_} and $^H{"Class::Plain/$_"}++ for qw( class method field);
33              
34 10 50       5076 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 Keywords
115              
116             =head2 class
117              
118             A class is defined by the C keyword.
119              
120             class NAME { ... }
121              
122             class NAME : ATTRS... {
123             ...
124             }
125              
126             class NAME;
127              
128             class NAME : ATTRS...;
129              
130             Behaves similarly to the C keyword, but provides a package that
131             defines a new class.
132              
133             As with C, an optional block may be provided. If so, the contents of
134             that block define the new class and the preceding package continues
135             afterwards. If not, it sets the class as the package context of following
136             keywords and definitions.
137              
138             The following class attributes are supported:
139              
140             =head3 isa Attribute
141            
142             # The single inheritance
143             : isa(SUPER_CLASS)
144            
145             # The multiple inheritance
146             : isa(SUPER_CLASS1) isa(SUPER_CLASS2)
147            
148             # The super class is nothing
149             : isa()
150              
151             Specifies a supper classes that this class extends.
152              
153             If the supper class is not specified by C attribute, the class inherits L.
154              
155             The super class is added to the end of C<@ISA>.
156              
157             If the the super class name doesn't exists in the Perl's symbol table, the super class is loaded.
158              
159             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.
160              
161             =head3 does Attribute
162            
163             # The single inheritance
164             : does(ROLE)
165            
166             # The multiple inheritance
167             : does(ROLE1) does(ROLE2)
168            
169             Specifies roles that this class does. This is the alias for L.
170              
171             See also L.
172              
173             =head2 field
174            
175             field NAME;
176            
177             field NAME : ATTR ATTR...;
178              
179             Define fields.
180              
181             The following field attributes are supported:
182              
183             =head3 reader Attribute
184              
185             : reader
186            
187             : reader(METHOD_NAME)
188              
189             Generates a reader method to return the current value of the field. If no name
190             is given, the name of the field is used.
191              
192             field x : reader;
193              
194             # This is the same as the following code.
195             method x {
196             $self->{x};
197             }
198              
199             The different method name can be specified.
200              
201             field x : reader(x_different_name);
202              
203             =head3 writer Attribute
204              
205             : writer
206              
207             : writer(METHOD_NAME)
208              
209             Generates a writer method to set a new value of the field from its arguments.
210             If no name is given, the name of the field is used prefixed by C.
211              
212             field x : writer;
213              
214             # This is the same as the following code.
215             method set_x {
216             $self->{x} = shift;
217             return $self;
218             }
219              
220             The different method name can be specified.
221              
222             field x : writer(set_x_different_name);
223              
224             =head3 rw Attribute
225              
226             : rw
227              
228             : rw(METHOD_NAME)
229              
230             Generates a read-write method to set and get the value of the field.
231             If no name is given, the name of the field is used.
232              
233             field x : rw;
234              
235             # This is the same as the following code.
236             method x {
237             if (@_) {
238             $self->{x} = shift;
239             return $self;
240             }
241             $self->{x};
242             }
243              
244             The different method name can be specified.
245              
246             field x : rw(x_different_name);
247              
248             =head2 method
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             The following method attributes are supported.
264              
265             B
266            
267             # An instance method
268             method to_string {
269            
270             my $string = "($self->{x},$self->{y})";
271            
272             return $string;
273             }
274              
275             =head3 common Attribute
276            
277             : common
278              
279             Marks that this method is a class-common method, instead of a regular instance
280             method. A class-common method may be invoked on class names instead of
281             instances. Within the method body there is a lexical C<$class> available instead of C<$self>.
282             It will already have been shifted from the C<@_> array.
283              
284             B
285              
286             # A class method
287             method new : common {
288             my $self = $class->SUPER::new(@_);
289            
290             # ...
291            
292             return $self;
293             }
294              
295             =head2 role
296              
297             A role is defined by the C keyword.
298              
299             role NAME { ... }
300              
301             role NAME : ATTRS... {
302             ...
303             }
304              
305             role NAME;
306              
307             role NAME : ATTRS...;
308              
309             C adopts the role features of L. All features of L can be used.
310              
311             B
312              
313             The SYNOPSYS of L is rewritten to the following codes.
314              
315             use Class::Plain;
316            
317             role Some::Role {
318            
319             method foo { ... }
320            
321             method bar { ... }
322             }
323            
324             class Some::Class : does(Some::Role) {
325             method foo { ... }
326            
327             # baz is wrapped in the around modifier by Class::Method::Modifiers
328             method baz { ... }
329             }
330              
331             =head3 Required Method
332              
333             In roles, the required method for the composed class can be defined by omitting its method block.
334              
335             method required_method;
336              
337             This is alias for L.
338              
339             requires "required_method";
340              
341             =head3 does Method
342              
343             $object->does('Some::Role');
344              
345             Checks if the object does the role.
346              
347             =head1 Required Perl Version
348              
349             Perl 5.16+.
350              
351             =head1 Subroutine Signatures Support
352              
353             C> supports the L from C.
354              
355             The L was supported from C,
356             but the parser L used in C can parse only the subroutine signatures after C.
357              
358             use feature 'signatures';
359            
360             use Class::Plain;
361            
362             Class Point {
363            
364             # ...
365            
366             method move($x = 0, $y = 0) {
367             $self->{x} += $x;
368             $self->{y} += $y;
369             }
370            
371             # ...
372            
373             }
374              
375             =head1 Cookbook
376              
377             Exmples of C.
378              
379             L
380              
381             =head1 See Also
382              
383             =head2 Object::Pad
384              
385             The implementation of the C module is started from the copy of the source code of L.
386              
387             =head2 Corinna
388              
389             C uses the keywords and attributes that are specified in L.
390              
391             The keywords: C, C, C.
392              
393             The attributes: C, C, C, C.
394              
395             Only the C attribute is got from L, L, L.
396              
397             =head2 XS::Parse::Keyword
398              
399             The C and C keywords are parsed by L.
400              
401             =head2 XS::Parse::Sublike
402              
403             The C keyword is parsed by L.
404              
405             =head1 Repository
406              
407             L
408              
409             =head1 Author
410              
411             Yuki Kimoto Ekimoto.yuki@gmail.comE
412              
413             =head1 Copyright & LICENSE
414              
415             Copyright 2022-2022 Yuki Kimoto, all rights reserved.
416              
417             This program is free software; you can redistribute it and/or modify it
418             under the same terms as Perl itself.
419              
420             =cut
421              
422             1;