-
Notifications
You must be signed in to change notification settings - Fork 0
/
notes_part_8.txt
193 lines (148 loc) · 5.05 KB
/
notes_part_8.txt
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
---------- Notes on chapter 11 of Beginning Perl (Simon Cozens, 2000). ---------
Perl "functions" are called "subroutines" because they don't return values by
default; a return statement must be explicitly declared.
________________________________________________________________________________
Turning references into objects using the "bless" operator:
bless ( reference, package );
For example:
bless ( $a, "Person" );
# $a is now a "Person" reference instead of a hash/array/scalar reference
________________________________________________________________________________
Storing attributes:
my $attribute = "green";
my $object = \$attribute;
bless ( $object, "Simple" );
# Now we have class Simple that stores an object with attribute "green"
Changing attributes;
$attribute = $$object;
$$object = "red";
________________________________________________________________________________
Constructors:
Make a hash reference, then bless it into the class.
package Person;
sub new {
my $self = {};
bless ($self, "Person");
return $self;
}
Now to create a Person:
my $person = Person->new();
Considering inheritence: shift without any arguments means shift @_, so it
takes the first element of the argument array. This gives us the first thing we
passed, the class name.
sub new {
my $class = shift;
my $self = {};
bless($self, $class);
return $self;
}
Providing attributes: we allow the user to specify the attributes of their newly
created object with a hash by initializing $self to be a hash reference to the
argument array @_.
sub new {
my $class = shift;
my $self = {@_};
bless($self, $class);
return $self;
}
Now we can initialize a person with attributes using the constructor:
my $object = Person->new(
surname => "Ayat",
forename => "Naim",
phone => "3105551234"
};
________________________________________________________________________________
Accessors: use shift to get the object passed into the accessor, then take the
relevant hash entry.
sub surname {
my $self = shift;
return $self->{surname};
}
Syntax note:
$reference->{surname}; # Accesses a hash reference
$reference->[3]; # Accesses an array reference
$reference->(); # Accesses a function reference
________________________________________________________________________________
Generating an error message when an accessor is called with something that isn't
an object:
use Carp;
sub surname {
my $self = shift;
unless (ref $self) {
croak "Should call surname() With an object, not a class";
}
return $self->{surname};
}
________________________________________________________________________________
Get-Set Methods:
sub surname {
my $self = shift;
unless (ref $self) {
croak "Should call surname() With an object, not a class";
}
# Receive more data
my $data = shift;
# Set the address if there's any data there
$self->{address} = $data if defined $data;
return $self->{surname};
}
________________________________________________________________________________
Class Attributes: say we want a population count for each new person created
during program execution.
package Person;
my $Population = 0;
sub new {
my $class = shift;
my $self = {@_};
bless($self, $class);
$Population++;
return $self;
}
sub headcount { $Population; }
print "Population is: ", Person->headcount;
________________________________________________________________________________
Private methods are denoted with an underscore at the beginning of their names.
This is simply convention; it means nothing to the interpreter.
Put the initializer statement in the constructor:
my @Everyone;
sub new {
my $class = shift;
my $self = {@_};
bless($self, $class);
$self->_init;;
return $self;
}
Create the _init sub:
sub _init {
my $self = shift;
push @Everyone, $self;
carp "New object created."
}
________________________________________________________________________________
Inheritance:
To build a new employee class based on person:
package Employee;
use Person9.pm;
our @ISA = "Person";
Adding new methods: nothing special, just add methods.
sub raise {
my $self = shift;
my $newsalary = $self->salary + 2000;
$self->salary($newsalary);
return $self;
}
Overriding methods: provide a new init:
sub _init {
my $self = shift;
my $employer = $self->employer || "unknown";
unless (ref $employer) {
my $new_o = Person->new( surname => $employer );
$self->employer($new_o);
}
# This means "call this method in the superclass"
$self->SUPER::_init();
}
________________________________________________________________________________
Ties: to tie a variable to a class:
tie $variable, 'Class', @parameters;
________________________________________________________________________________