summaryrefslogtreecommitdiff
path: root/gnu/usr.bin/perl/pod/perlclass.pod
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/usr.bin/perl/pod/perlclass.pod')
-rw-r--r--gnu/usr.bin/perl/pod/perlclass.pod310
1 files changed, 310 insertions, 0 deletions
diff --git a/gnu/usr.bin/perl/pod/perlclass.pod b/gnu/usr.bin/perl/pod/perlclass.pod
new file mode 100644
index 00000000000..cb021ecf14f
--- /dev/null
+++ b/gnu/usr.bin/perl/pod/perlclass.pod
@@ -0,0 +1,310 @@
+=head1 NAME
+
+perlclass - Perl class syntax reference
+
+=head1 SYNOPSIS
+
+ use v5.38;
+ use feature 'class';
+
+ class My::Example 1.234 {
+ field $x;
+
+ ADJUST {
+ $x = "Hello, world";
+ }
+
+ method print_message {
+ say $x;
+ }
+ }
+
+ My::Example->new->print_message;
+
+=head1 DESCRIPTION
+
+This document describes the syntax of the Perl's C<class> feature, which
+provides native keywords supporting object-oriented programming paradigm.
+
+=head2 History
+
+Since Perl 5, support for objects revolved around the concept of I<blessing>
+references with a package name. Such reference could then be used to call
+subroutines from the package it was blessed with (or any of its parents). This
+system, while bare-bones, was flexible enough to allow creation of multiple
+more advanced, community-driven systems for object orientation.
+
+Class feature is a core implementation of class syntax which is familiar to
+what one would find in other programming languages. It isn't a C<bless>
+wrapper, but a completely new system built right into the perl interpreter.
+
+=head1 KEYWORDS
+
+Enabling the C<class> feature allows the usage of the following new keywords in
+the scope of current package:
+
+=head2 class
+
+ class NAME BLOCK
+
+ class NAME VERSION BLOCK
+
+ class NAME;
+
+ class NAME VERSION;
+
+The C<class> keyword declares a new package which is intended to be a class.
+All other keywords from the C<class> feature should be used in scope of this
+declaration.
+
+ class WithVersion 1.000 {
+ # class definition goes here
+ }
+
+Classes can be declared in either block or statement syntax. If a block is
+used, the body of the block contains the implementation of the class. If the
+statement form is used, the remainder of the file is used up until the next
+C<class> or C<package> statement.
+
+C<class> and C<package> declarations are similar, but classes automatically get
+a constructor named C<new> - You don't have to (and should not) write one.
+Additionally, in the class BLOCK you are allowed to declare fields and methods.
+
+=head2 field
+
+ field VARIABLE_NAME;
+
+ field VARIABLE_NAME = EXPR;
+
+ field VARIABLE_NAME : ATTRIBUTES;
+
+ field VARIABLE_NAME : ATTRIBUTES = EXPR;
+
+Fields are variables which are visible in the scope of the class - more
+specifically within L</method> and C<ADJUST> blocks. Each class instance get
+their own storage of fields, independent of each other.
+
+A field behaves like a normal lexically scoped variable. It has a sigil and is
+private to the class (though creation of an accessor method will make it
+accessible from the outside). The main difference is that different instances
+access different values in the same scope.
+
+ class WithFields {
+ field $scalar = 42;
+ field @array = qw(this is just an array);
+ field %hash = (species => 'Martian', planet => 'Mars');
+ }
+
+Fields may optionally have initializing expressions. If present, the expression
+will be evaluated within the constructor of each object instance. During each
+evaluation, the expression can use the value of any previously-set field, as
+well as see any other variables in scope.
+
+ class WithACounter {
+ my $next_count = 1;
+ field $count = $next_count++;
+ }
+
+When combined with the C<:param> field attribute, the defaulting expression can
+use any of the C<=>, C<//=> or C<||=> operators. Expressions using C<=> will
+apply whenever the caller did not pass the corresponding parameter to the
+constructor at all. Expressions using C<//=> will also apply if the caller did
+pass the parameter but the value was undefined, and expressions using C<||=>
+will apply if the value was false.
+
+=head2 method
+
+ method METHOD_NAME SIGNATURE BLOCK
+
+ method METHOD_NAME BLOCK
+
+ method SIGNATURE BLOCK
+
+ method BLOCK
+
+Methods are subroutines intended to be called in the context of class objects.
+
+A variable named C<$self> populated with the current object instance will
+automatically be created in the lexical scope of C<method>.
+
+Methods always act as if C<use feature 'signatures'> is in effect, but C<$self>
+will not appear in the arguments list as far as the signature is concerned.
+
+ class WithMethods {
+ field $greetings;
+
+ ADJUST {
+ $greetings = "Hello";
+ }
+
+ method greet($name = "someone") {
+ say "$greetings, $name";
+ }
+ }
+
+Just like regular subroutines, methods I<can> be anonymous:
+
+ class AnonMethodFactory {
+
+ method get_anon_method {
+ return method {
+ return 'this is an anonymous method';
+ };
+ }
+ }
+
+=head1 ATTRIBUTES
+
+Specific aspects of the keywords mentioned above are managed using
+I<attributes>. Attributes all start with a colon, and one or more of them can
+be appended after the item's name, separated by a space.
+
+=head2 Class attributes
+
+=head3 :isa
+
+Classes may inherit from B<one> superclass, by using the C<:isa> class
+attribute.
+
+ class Example::Base { ... }
+
+ class Example::Subclass :isa(Example::Base) { ... }
+
+Inherited methods are visible and may be invoked. Fields are always lexical
+and therefore not visible by inheritance.
+
+The C<:isa> attribute may request a minimum version of the base class; it is
+applied similar to C<use> - if the provided version is too low it will fail at
+compile time.
+
+ class Example::Subclass :isa(Example::Base 2.345) { ... }
+
+The C<:isa> attribute will attempt to C<require> the named module if it is not
+already loaded.
+
+=head2 Field attributes
+
+=head3 :param
+
+A scalar field with a C<:param> attribute will take its value from a named
+parameter passed to the constructor. By default the parameter will have the
+same name as the field (minus its leading C<$> sigil), but a different name
+can be specified in the attribute.
+
+ field $x :param;
+ field $y :param(the_y_value);
+
+If there is no defaulting expression then the parameter is required by the
+constructor; the caller must pass it or an exception is thrown. With a
+defaulting expression this becomes optional.
+
+=head2 Method attributes
+
+None yet.
+
+=head1 OBJECT LIFECYCLE
+
+=head2 Construction
+
+Each object begins its life with a constructor call. The constructor is always
+named C<new> and is invoked like a method call on the class name:
+
+ my $object = My::Class->new(%arguments);
+
+During the construction, class fields are compared to C<%arguments> hash and
+populated where possible.
+
+=head2 Adjustment
+
+Object adjustment can be performed during the construction to run user-defined
+code. It is done with the help of C<ADJUST> blocks, which are called in order
+of declaration.
+
+They are similar to C<BEGIN> blocks, which run during the compilation of a
+package. However, they also have access to C<$self> lexical (object instance)
+and all object fields created up to that point.
+
+=head2 Lifetime
+
+After the construction phase, object is ready to be used.
+
+Using C<blessed> (C<Scalar::Util::blessed> or C<builtin::blessed>) on the
+object will return the name of the class, while C<reftype>
+(C<Scalar::Util::reftype> or C<builtin::reftype>) will return the string
+C<'OBJECT'>.
+
+=head2 Destruction
+
+Just like with other references, when object reference count reaches zero it
+will automatically be destroyed.
+
+=head1 TODO
+
+This feature is still experimental and very incomplete. The following list
+gives some overview of the kinds of work still to be added or changed:
+
+=over 4
+
+=item * Roles
+
+Some syntax for declaring a role (likely a C<role> keyword), and for consuming
+a role into a class (likely a C<:does()> attribute).
+
+=item * Parameters to ADJUST blocks
+
+Some syntax for declaring that an C<ADJUST> block can consume named
+parameters, which become part of the class constructor's API. This might be
+inspired by a similar plan to add named arguments to subroutine signatures.
+
+ class X {
+ ADJUST (:$alpha, :$beta = 123) {
+ ...
+ }
+ }
+
+ my $obj = X->new(alpha => 456);
+
+=item * ADJUST blocks as true blocks
+
+Currently, every ADJUST block is wrapped in its own CV that gets invoked with
+the full ENTERSUB overhead. It should be possible to use the same mechanism
+that makes all field initializer expressions appear within the same CV on
+ADJUST blocks as well, merging them all into a single CV per class. This will
+make it faster to invoke if a class has more than one of them.
+
+=item * Accessor generator attributes
+
+Attributes to request that accessor methods be generated for fields. Likely
+C<:reader> and C<:writer>.
+
+ class X {
+ field $name :reader;
+ }
+
+Equivalent to
+
+ class X {
+ field $name;
+ method name { return $name; }
+ }
+
+=item * Metaprogramming
+
+An extension of the metaprogramming API (currently proposed by
+L<RFC0022|https://github.com/Perl/RFCs/pull/25>) which adds knowledge of
+classes, methods, fields, ADJUST blocks, and other such class-related details.
+
+=item * Extension Customisation
+
+Ways in which out-of-core modules can interact with the class system,
+including an ability for them to provide new class or field attributes.
+
+=back
+
+=head1 AUTHORS
+
+Paul Evans
+
+Bartosz Jarzyna
+
+=cut