summaryrefslogtreecommitdiff
path: root/lib/Tangence/Meta/Class.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Tangence/Meta/Class.pm')
-rw-r--r--lib/Tangence/Meta/Class.pm109
1 files changed, 40 insertions, 69 deletions
diff --git a/lib/Tangence/Meta/Class.pm b/lib/Tangence/Meta/Class.pm
index 485e860..7a721f3 100644
--- a/lib/Tangence/Meta/Class.pm
+++ b/lib/Tangence/Meta/Class.pm
@@ -1,12 +1,13 @@
# You may distribute under the terms of either the GNU General Public License
# or the Artistic License (the same terms as Perl itself)
#
-# (C) Paul Evans, 2011-2017 -- leonerd@leonerd.org.uk
+# (C) Paul Evans, 2011-2021 -- leonerd@leonerd.org.uk
-package Tangence::Meta::Class 0.26;
+use v5.26;
+use Object::Pad 0.43;
-use v5.14;
-use warnings;
+package Tangence::Meta::Class 0.27;
+class Tangence::Meta::Class :strict(params);
use Carp;
@@ -33,13 +34,13 @@ Returns a new instance representing the given name.
=cut
-sub new
-{
- my $class = shift;
- my %args = @_;
- my $self = bless { name => delete $args{name} }, $class;
- return $self;
-}
+has $name :param :reader;
+has $defined :reader = 0;
+
+has @superclasses;
+has %methods;
+has %events;
+has %properties;
=head2 define
@@ -68,18 +69,15 @@ C<Tangence::Meta::Class> references.
=cut
-sub define
+method define ( %args )
{
- my $self = shift;
- my %args = @_;
+ $defined and croak "Cannot define $name twice";
- $self->defined and croak "Cannot define ".$self->name." twice";
-
- $args{superclasses} ||= [];
- $args{methods} ||= {};
- $args{events} ||= {};
- $args{properties} ||= {};
- $self->{$_} = $args{$_} for keys %args;
+ $defined++;
+ @superclasses = @{ delete $args{superclasses} // [] };
+ %methods = %{ delete $args{methods} // {} };
+ %events = %{ delete $args{events} // {} };
+ %properties = %{ delete $args{properties} // {} };
}
=head1 ACCESSORS
@@ -94,12 +92,6 @@ Returns true if a definintion for the class has been provided using C<define>.
=cut
-sub defined
-{
- my $self = shift;
- return exists $self->{superclasses};
-}
-
=head2 name
$name = $class->name
@@ -108,12 +100,6 @@ Returns the name of the class
=cut
-sub name
-{
- my $self = shift;
- return $self->{name};
-}
-
=head2 perlname
$perlname = $class->perlname
@@ -123,9 +109,8 @@ replaced by double colons (C<::>).
=cut
-sub perlname
+method perlname
{
- my $self = shift;
( my $perlname = $self->name ) =~ s{\.}{::}g; # s///rg in 5.14
return $perlname;
}
@@ -139,11 +124,10 @@ references.
=cut
-sub direct_superclasses
+method direct_superclasses
{
- my $self = shift;
- $self->defined or croak $self->name . " is not yet defined";
- return @{ $self->{superclasses} };
+ $defined or croak "$name is not yet defined";
+ return @superclasses;
}
=head2 direct_methods
@@ -156,11 +140,10 @@ L<Tangence::Meta::Method> instances.
=cut
-sub direct_methods
+method direct_methods
{
- my $self = shift;
- $self->defined or croak $self->name . " is not yet defined";
- return $self->{methods};
+ $defined or croak "$name is not yet defined";
+ return { %methods };
}
=head2 direct_events
@@ -173,11 +156,10 @@ L<Tangence::Meta::Event> instances.
=cut
-sub direct_events
+method direct_events
{
- my $self = shift;
- $self->defined or croak $self->name . " is not yet defined";
- return $self->{events};
+ $defined or croak "$name is not yet defined";
+ return { %events };
}
=head2 direct_properties
@@ -190,11 +172,10 @@ L<Tangence::Meta::Property> instances.
=cut
-sub direct_properties
+method direct_properties
{
- my $self = shift;
- $self->defined or croak $self->name . " is not yet defined";
- return $self->{properties};
+ $defined or croak "$name is not yet defined";
+ return { %properties };
}
=head1 AGGREGATE ACCESSORS
@@ -213,13 +194,12 @@ references.
=cut
-sub superclasses
+method superclasses
{
- my $self = shift;
# This algorithm doesn't have to be particularly good, C3 or whatever.
# We're not really forming a search order, mearly uniq'ifying
my %seen;
- return grep { !$seen{$_}++ } map { $_, $_->superclasses } $self->direct_superclasses;
+ return grep { !$seen{$_}++ } map { $_, $_->superclasses } @superclasses;
}
=head2 methods
@@ -231,9 +211,8 @@ names to L<Tangence::Meta::Method> instances.
=cut
-sub methods
+method methods
{
- my $self = shift;
my %methods;
foreach ( $self, $self->superclasses ) {
my $m = $_->direct_methods;
@@ -251,10 +230,8 @@ if no such method exists.
=cut
-sub method
+method method ( $name )
{
- my $self = shift;
- my ( $name ) = @_;
return $self->methods->{$name};
}
@@ -267,9 +244,8 @@ names to L<Tangence::Meta::Event> instances.
=cut
-sub events
+method events
{
- my $self = shift;
my %events;
foreach ( $self, $self->superclasses ) {
my $e = $_->direct_events;
@@ -287,10 +263,8 @@ no such event exists.
=cut
-sub event
+method event ( $name )
{
- my $self = shift;
- my ( $name ) = @_;
return $self->events->{$name};
}
@@ -303,9 +277,8 @@ names to L<Tangence::Meta::Property> instances.
=cut
-sub properties
+method properties
{
- my $self = shift;
my %properties;
foreach ( $self, $self->superclasses ) {
my $p = $_->direct_properties;
@@ -323,10 +296,8 @@ C<undef> if no such property exists.
=cut
-sub property
+method property ( $name )
{
- my $self = shift;
- my ( $name ) = @_;
return $self->properties->{$name};
}