File: Property.pm

package info (click to toggle)
libtangence-perl 0.33-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 580 kB
  • sloc: perl: 6,076; makefile: 15
file content (163 lines) | stat: -rw-r--r-- 2,980 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#  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-2024 -- leonerd@leonerd.org.uk

use v5.26;
use warnings;
use Object::Pad 0.800;

package Tangence::Meta::Property 0.33;
class Tangence::Meta::Property :strict(params);

use Syntax::Keyword::Match;

use Tangence::Constants;

=head1 NAME

C<Tangence::Meta::Property> - structure representing one C<Tangence> property

=head1 DESCRIPTION

This data structure object stores information about one L<Tangence> class
property. Once constructed, such objects are immutable.

=cut

=head1 CONSTRUCTOR

=cut

=head2 new

   $property = Tangence::Meta::Property->new( %args )

Returns a new instance initialised by the given arguments.

=over 8

=item class => Tangence::Meta::Class

Reference to the containing class

=item name => STRING

Name of the property

=item dimension => INT

Dimension of the property, as one of the C<DIM_*> constants from
L<Tangence::Constants>.

=item type => STRING

The element type as a L<Tangence::Meta::Type> reference.

=item smashed => BOOL

Optional. If true, marks that the property is smashed.

=back

=cut

field $class     :param :weak :reader;
field $name      :param       :reader;
field $dimension :param       :reader;
field $type      :param       :reader;
field $smashed   :param       :reader = 0;

=head1 ACCESSORS

=cut

=head2 class

   $class = $property->class

Returns the class the property is a member of

=cut

=head2 name

   $name = $property->name

Returns the name of the class

=cut

=head2 dimension

   $dimension = $property->dimension

Returns the dimension as one of the C<DIM_*> constants.

=cut

=head2 type

   $type = $property->type

Returns the element type as a L<Tangence::Meta::Type> reference.

=cut

=head2 overall_type

   $type = $property->overall_type

Returns the type of the entire collection as a L<Tangence::Meta::Type>
reference. For scalar types this will be the element type. For dict types this
will be a hash of the array type. For array, queue and objset types this will
a list of the element type.

=cut

field $_overall_type;

method overall_type
{
   return $_overall_type ||= do {
      my $type = $self->type;
      my $dim  = $self->dimension;
      match( $dim : == ) {
         case( DIM_SCALAR ) {
            $type;
         }
         case( DIM_HASH ) {
            $self->make_type( dict => $type );
         }
         case( DIM_ARRAY ), case( DIM_QUEUE ), case( DIM_OBJSET ) {
            $self->make_type( list => $type );
         }
         default {
            die "Unrecognised dimension $dim for ->overall_type";
         }
      }
   }
}

=head2 smashed

   $smashed = $property->smashed

Returns true if the property is smashed.

=cut

# For subclasses to override if required
method make_type
{
   return Tangence::Meta::Type->make( @_ );
}

=head1 AUTHOR

Paul Evans <leonerd@leonerd.org.uk>

=cut

0x55AA;