-
Notifications
You must be signed in to change notification settings - Fork 1
/
Type.pm
81 lines (68 loc) · 1.63 KB
/
Type.pm
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
package Type;
use strict;
use Object;
our @ISA = ( 'Object' );
# --- konstansok
our $DEFAULT_TYPE = 'w';
our $TYPESEP = ':';
# --- konstr
sub new {
my $class = shift;
my $self = []; # típus, altípus, alaltípus, ...
push ( @{ $self }, $DEFAULT_TYPE );
bless $self, $class;
}
# --- konstans getter-ek
sub DEFAULT_TYPE { shift; return $DEFAULT_TYPE; }
sub TYPESEP { shift; return $TYPESEP; }
# --- setter-getter-ek
# param: stringben a típus
sub parse {
my $self = shift;
my $s = shift;
@{ $self } = split /$TYPESEP/, $s;
$self;
}
sub copy {
my $self = shift;
my $t = shift;
if ( $t->isa( 'Type' ) ) {
@{ $self } = @{ $t };
$self;
} else {
"$Exception::msg " . ref( $self ) .
"::copy requires a " . ref( $self) . ".";
}
}
sub as_string {
my $self = shift;
join $TYPESEP, @{ $self };
}
sub info {
my $self = shift;
join $TYPESEP, @{ $self };
}
# --- egyebek: a lényeg
# param: egy Type
# retur: hogy a paraméter Type megfelel-e jelen Type-nak
# ti. 'NE:ext' megfelel 'NE' -nek
sub satisfies {
my $self = shift;
my $type = shift;
( $type->isa( 'Type' ) )
? $self->_satisfies( $type )
: "$Exception::msg Type::satisfies requires a Type to satisfy.";
}
sub _satisfies {
my $self = shift;
my $type = shift;
my $i = 0;
# amíg type meg van adva, meg kell nézni, hogy megfelelünk-e neki
# (lukat nem engedünk meg az altípusok sorában)
while ( $i < @{ $type } and
$self->[$i] and $type->[$i] and
$self->[$i] eq $type->[$i] ) { ++$i; }
( $i == scalar @{ $type } ) or ( $self->[$i] and not $type->[$i] );
# oké, ha a $type végére értünk vagy ha $type kevesebbet vár el
}
1;