<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Artisan Numérique</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1289"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/node/1289/atom/feed"/>
  <id>http://artisan.karma-lab.net/node/1289/atom/feed</id>
  <updated>2007-12-07T02:36:25+01:00</updated>
  <entry>
    <title>Perl et les Objets, rapide mise en selle </title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1289" />
    <id>http://artisan.karma-lab.net/node/1289</id>
    <published>2007-12-07T00:54:04+01:00</published>
    <updated>2007-12-07T02:36:25+01:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Perl" />
    <category term="OK" />
    <category term="Planet Libre" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
   Perl est sans nul doute un langage puissant. Mais lorsqu'il s'agit de parler "Objet", cette puissance vire très vite au cryptique, voire même au pur mystique.
</p>
<p>
  L'objectif de ce tutorial est simple de proposer un guide de démarrage permettant de mettre oeuvre le plus rapidement possible, les concepts objets en Perl. 
</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>
   Perl est sans nul doute un langage puissant. Mais lorsqu'il s'agit de parler "Objet", cette puissance vire très vite au cryptique, voire même au pur mystique.
</p>
<p>
  L'objectif de ce tutorial est simple de proposer un guide de démarrage permettant de mettre oeuvre le plus rapidement possible, les concepts objets en Perl. 
</p>
<!--break-->

	<a name='chapter_1'></a>
  <h2>Origine</h2>
	
<p>
  A l'évidence, l'approche adoptée par les concepteurs de Perl lors de la mise en oeuvre de cet aspect a plus été <q>comment fabriquer des objets avec du Perl ?</q> que <q>comment modifier Perl pour lui ajouter une syntaxe Object ?</q>.
</p>
<p>
 Le résultat en est une forte impression d'objet <q>fait main</q>. Alors certes, on dispose ainsi d'un très (trop) grand contrôle sur des aspects qui son généralement laissés au compilateur (héritage, surcharge, etc.). Mais en contrepartie Perl ne vous guide absolument pas avec sa syntaxe "pâte à modeler" et cela implique une certaine difficulté à implémenter ses premiers objets dans ce langage, particulièrement lorsque l'on vient d'un monde Java ou même C++. 
</p>


	<a name='chapter_2'></a>
  <h2>Packages et objet statique</h2>
	
<p>
  Les packages Perl (<kbd>package</kbd>) permettaient déjà de créer des espaces de noms pouvant contenir des fonctions, des variables, exportées vers l'extérieur ou pas.
</p>
<p>
  Petit exemple classique, un hello world. Voyons tout d'abord le module qui contient notre package, notre "classe statique" :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://perldoc.perl.org/functions/package.html"><span class="kw3">package</span></a> HelloWorld<span class="sy0">;</span><br />
<span class="kw2">use</span> strict<span class="sy0">;</span><br />
<span class="kw2">use</span> warnings<span class="sy0">;</span><br />
<br />
<span class="kw1">my</span> <span class="re0">$messageBienvenue</span><span class="sy0">=</span><span class="st0">&quot;Hello&quot;</span><span class="sy0">;</span> <span class="co1"># &lt;-- variable statique, local au paquet</span><br />
<span class="kw1">our</span> <span class="re0">$destinataire</span><span class="sy0">;</span> <span class="co1"># &lt;-- variable statique, visible de l'extérieur</span><br />
<br />
<span class="kw2">sub</span> direBonjour <span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">my</span> <span class="re0">$message</span><span class="sy0">=</span><a target="blank" href="http://perldoc.perl.org/functions/shift.html"><span class="kw3">shift</span></a><span class="sy0">;</span><br />
&nbsp; <a target="blank" href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;$messageBienvenue $destinataire !!<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; <a target="blank" href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot; Message personnel : $message<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="nu0">1</span><span class="sy0">;</span> <span class="co1"># &lt;--- important !!</span>
  </div>
  <div class='caption'>module helloWorld.pm</div>
  </div>
</p>
<p>
  Maintenant le script qui va utiliser notre package :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co1">#!/usr/bin/perl</span><br />
<span class="kw2">use</span> strict<span class="sy0">;</span><br />
<span class="kw2">use</span> warnings<span class="sy0">;</span><br />
<span class="kw2">use</span> HelloWorld<span class="sy0">;</span> <span class="co1"># &lt;--- Utilisation de notre paquet</span><br />
<br />
<span class="re0">$HelloWorld</span><span class="sy0">::</span><span class="me2">destinataire</span><span class="sy0">=</span><span class="st0">&quot;gaston&quot;</span><span class="sy0">;</span><br />
HelloWorld<span class="sy0">::</span><span class="me2">direBonjour</span><span class="br0">&#40;</span><span class="st0">&quot;Coucou&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  <div class='caption'>scripte helloWorld.pl</div>
  </div>
</p>
<p>
  Enfin pour lancer l'ensemble :
  
  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>gaston$</span>chmod +x helloWorld.pl</div><div class='command'><span class='prompt'>gaston$</span>./helloWorld.pl</div><div class='result'>Hello gaston !!</div><div class='result'>Message personnel : Coucou</div><div class='command'><span class='prompt'>gaston$</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
  Cet espace de nom <kbd>HelloWorld</kbd> peut ainsi être vu comme un objet ne contenant que des méthodes et des champs (my, our) statiques. L'appel à ces éléments statiques se faisant par la syntaxe <kbd>::</kbd>. 
</p>


	<a name='chapter_3'></a>
  <h2>La Notation <kbd>-></kbd></h2>
	
<p>
  Pour permettre de transformer un paquet en classe, les concepteurs de Perl utilisent la notation <kbd>-></kbd>. Pour comprendre la différence entre <kbd>::</kbd> et <kbd>-></kbd>, rédigeons un petit exemple :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co1"># Ce bloc est une syntaxe à n'utiliser que pour un exemple <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/></span><br />
<span class="co1"># il permet d'éviter de faire un fichier module TestAppel.pm </span><br />
<span class="co1"># et de tout mettre dans le même fichier. </span><br />
<span class="br0">&#123;</span><br />
&nbsp; <a target="blank" href="http://perldoc.perl.org/functions/package.html"><span class="kw3">package</span></a> TestAppel<span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw2">sub</span> afficheArgument <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1"># lecture du 1ier argument</span><br />
&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$argument</span><span class="sy0">=</span><a target="blank" href="http://perldoc.perl.org/functions/shift.html"><span class="kw3">shift</span></a><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1"># Si l'argument n'existe pas...</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a target="blank" href="http://perldoc.perl.org/functions/defined.html"><span class="kw3">defined</span></a> <span class="re0">$argument</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;Il n'y a pas d'arguments<span class="es0">\n</span>&quot;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="co1"># si l'argument existe, on l'affiche</span><br />
&nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;L'argument est : &quot;</span>.<span class="re0">$argument</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<br />
<a target="blank" href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> TestAppel<span class="sy0">::</span><span class="me2">afficheArgument</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
<a target="blank" href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> TestAppel<span class="sy0">-&gt;</span><span class="me1">afficheArgument</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="sy0">;</span>
  </div>
  <div class='caption'>Test des différents appels - testAppel.pl</div>
  </div>
</p>
<p>
  Lançons maintenant notre test :
  
  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>gaston$</span>chmod +x testAppel.pl</div><div class='command'><span class='prompt'>gaston$</span>./testAppel.pl</div><div class='result'>Il n'y a pas d'arguments</div><div class='result'>L'argument est : HelloWorld</div><div class='command'><span class='prompt'>gaston$</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>  
</p>
<p>
  Le premier appel à <kbd>TestAppel::afficheArgument</kbd> indique très logiquement qu'il n'y a pas d'arguments. En revanche, surprise dans le second appel, <kbd>TestAppel->afficheArgument</kbd> indique qu'il y a, contre toute attente, un argument, qui se trouve être le nom du package.
</p>
<p>
 Ce que cela indique, c'est que la notation <kbd>PACKAGE->méthode</kbd> insère un premier argument, une chaîne de caractère; qui est le <strong>nom du paquet</strong> qui contient la fonction. En d'autres termes, la <kbd>classe</kbd> de notre futur objet. Et c'est cette propriété qui va nous permettre de fabriquer le constructeur de notre objet.
</p>


	<a name='chapter_4'></a>
  <h2>La sainte construction</h2>
	
<p>
  Nous allons donc rajouter une nouvelle méthode à <kbd>HelloWorld.pm</kbd> nommée <kbd>new</kbd>. Cette méthode va être le constructeur de notre classe <kbd>HelloWorld</kbd>. 
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw2">sub</span> <span class="kw2">new</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1"># 1. Récupération de la classe de l'objet</span><br />
&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$class</span><span class="sy0">=</span><a target="blank" href="http://perldoc.perl.org/functions/shift.html"><span class="kw3">shift</span></a><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1"># 2. Création de l'instance de l'objet, et oui, en Perl, une instance d'objet</span><br />
&nbsp; &nbsp; <span class="co1"># est une table de hash...</span><br />
&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$self</span><span class="sy0">=</span><span class="br0">&#123;</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1"># 3. Bénédiction de l'instance de la classe (table de hash) par le nom de la classe</span><br />
&nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/bless.html"><span class="kw3">bless</span></a><span class="br0">&#40;</span><span class="re0">$self</span><span class="sy0">,</span><span class="re0">$class</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1"># 4. On retourne l'instance béni de la classe, notre objet</span><br />
&nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/return.html"><span class="kw3">return</span></a> <span class="re0">$self</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
  </div>
  <div class='caption'>HelloWorld.pm - ajout de la fonction new</div>
  </div>
</p>
<p>
  La première étape est expliquée au chapitre précédent, on utilise la syntaxe <kbd>-></kbd> pour récupérer dans <kbd>$class</kbd> le nom du paquet, donc de la classe de notre futur objet.
</p>
<p>
  Deuxième étape, création d'une instance anonyme d'objet... En réalité il s'agit là d'une pauvre table de hash vide. En effet, pour Perl, un objet c'est une table de hash qui contient toutes les informations spécifiques à l'instance (les camps ou attributs).
</p>
<p>
  Étape 3, la partie mystique, on va bénir la variable <kbd>$self</kbd> avec le nom de la classe. C'est cette étape va concrètement créer notre objet. 
</p>
<p>
  Dernière étape enfin, la fonction <kbd>new</kbd> retourne la nouvelle instance de notre classe. Il ne nous reste plus qu'à l'utiliser en réécrivant notre script d'appel : 
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co1">#!/usr/bin/perl</span><br />
&nbsp; <span class="kw2">use</span> strict<span class="sy0">;</span><br />
&nbsp; <span class="kw2">use</span> warnings<span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw2">use</span> HelloWorld<span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">my</span> <span class="re0">$objet</span> <span class="sy0">=</span> HelloWorld<span class="sy0">-&gt;</span><span class="me1">new</span><span class="sy0">;</span><br />
&nbsp; <a target="blank" href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;Mon objet est :$objet<span class="es0">\n</span>&quot;</span><span class="sy0">;</span>
  </div>
  <div class='caption'>helloWorld.pl - création de l&#039;objet</div>
  </div>
</p>
<p>
  
  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>gaston$</span>./helloWorld.pl</div><div class='result'>Mon objet est :HelloWorld=HASH(0x804c180)</div><div class='command'><span class='prompt'>gaston$</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>    
</p>
<p>
  Nous voyons ici que nous avons bien, en retour de la fonction <kbd>new</kbd>, un objet avec le bon nom de classe représenté par une table de Hash. Notre premier objet. Champagne !
</p>
<div class='inline-box note'>
  La syntaxe <kbd>my $object=HelloWorld->new</kbd> peut être remplacée par une syntaxe plus naturelle équivalente <kbd>my $object=new HelloWorld</kbd>.
</div>
<div class='inline-box note'>
  La fonction <kbd>bless</kbd> renvoit l'objet bénit. Il est donc possible de contracter les deux dernières lignes :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://perldoc.perl.org/functions/return.html"><span class="kw3">return</span></a> <a target="blank" href="http://perldoc.perl.org/functions/bless.html"><span class="kw3">bless</span></a><span class="br0">&#40;</span><span class="re0">$self</span><span class="sy0">,</span> <span class="re0">$class</span><span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  
  </div>
</div>


	<a name='chapter_5'></a>
  <h2>Destructeur</h2>
	
<p>
  Qui dit construction, dit destruction. Normalement Perl utilise un concept de "ramasse-miettes" proche de celui présent en python, java ou .Net. L'idée est que le système trouve tout seul les objets non utilisés, et les détruit lui-même. Mais même si cette destruction est automatique, il peut être important que notre objet soit prévenu de cette destruction, par exemple pour libérer des ressources (descripteur de fichier, thread, etc.). 
</p>
<p>
  Comme en perl un objet n'est autre chose qu'un paquet, les mêmes mécanismes sont utilisables, dont la fonction <kbd>DESTROY</kbd>. La différence est que c'est ici une fonction d'instance qui est invoquée, et que le paramètre $self est donc disponible. Le destructeur aura donc la forme suivante :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  sub DESTROY {<br />
&nbsp; my $self = shift<SEMI><br />
&nbsp; print &quot;Destruction de $self&quot;<SEMI><br />
}
  </div>
  
  </div>
</p>

	<a name='chapter_6'></a>
  <h2>Les méthodes</h2>
	
<p>
   <kbD>new</kbD> est notre première méthode, mais une méthode un peu spécial, un constructeur. Ajoutons maintenant une méthode plus classique à <kbd>HelloWorld.pm</kbd> :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw2">sub</span> afficherClasseObjet <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$self</span><span class="sy0">=</span><a target="blank" href="http://perldoc.perl.org/functions/shift.html"><span class="kw3">shift</span></a><span class="sy0">;</span> <span class="co1"># &lt;--- paramètre inséré automatiquement par la syntaxe &quot;-&gt;&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;La classe de l'objet est '&quot;</span>.<a target="blank" href="http://perldoc.perl.org/functions/ref.html"><span class="kw3">ref</span></a><span class="br0">&#40;</span><span class="re0">$self</span><span class="br0">&#41;</span>.<span class="st0">&quot;'<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
  </div>
  <div class='caption'>HelloWorld.pm - Ajout d&#039;une méthode</div>
  </div>   
</p>
<p>
  la foncton Perl <kbd>ref()</kbd>, renvoie pour une instance donnée, la nom de classe associé. Ajoutons maintenant,juste après le constructeur un appel à la méthode créée, dans <kbd>helloWorld.pl</kbd>:
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="re0">$objet</span><span class="sy0">-&gt;</span><span class="me1">afficherClassObjet</span><span class="sy0">;</span>
  </div>
  <div class='caption'>helloWorld.pl - Appel à la méthode d&#039;instance</div>
  </div>
</p>
<p>
  Et relançons notre script :
  
  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>gaston$</span>./helloWorld.pl</div><div class='result'>Mon objet est :HelloWorld=HASH(0x804c180)</div><div class='result'>La classe de l'objet est 'HelloWorld'</div><div class='command'><span class='prompt'>gaston$</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
  Nous constatons ici que le fait d'utiliser la syntaxe <kbd>-></kbd> sur l'instance de l'objet créée par <kbd>new</kbd> insère elle aussi un argument à la méthode, mais cette fois il s'agit de l'instance de notre objet. C'est grâce à cela que notre méthode va savoir sur quel objet elle travaille. 
</p>


	<a name='chapter_7'></a>
  <h2>Champs et Attributs</h2>
	
<p>
  Alors un objet avec des méthodes sans attributs, ça manque quelque peu de sel... Le premier réflexe serait d'utiliser des <kbd>my</kbd> pour des champs privés et des <kbd>our</kbd> pour les publiques. Mais rien n'est moins faux car, comme nous l'avons vu au premier chapitre, ces variables appartiennent au paquet, ce sont donc des attributs statiques (accessibles par <kbd>HelloWorld::</kbd>). 
</p>
<p>
  Pour créer des champs manipulables par instance, il faut jouer avec notre table de Hash, celle-là même que nous avons bénit dans le constructeur. Nous allons donc modifier le module <kbd>HelloWorld.pm</kbd> pour déclarer deux champs. M'un "privé" (comprendre ici non-documenté), <kbd>messageBienvenue</kbd>, et l'autre "publique", <kbd>destinataire</kbd>. Nous allons aussi modifier notre fonction <kbd>direBonjour</kbd> pour en faire une méthode de l'objet et utiliser ces nouveaux attributs. 
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://perldoc.perl.org/functions/package.html"><span class="kw3">package</span></a> HelloWorld<span class="sy0">;</span><br />
<span class="kw2">use</span> strict<span class="sy0">;</span><br />
<span class="kw2">use</span> warnings<span class="sy0">;</span><br />
<br />
<span class="kw2">sub</span> <span class="kw2">new</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$class</span><span class="sy0">=</span><a target="blank" href="http://perldoc.perl.org/functions/shift.html"><span class="kw3">shift</span></a><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$self</span><span class="sy0">=</span><span class="br0">&#123;</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1"># Déclaration des champs</span><br />
&nbsp; &nbsp; <span class="re0">$self</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>messageBienvenue<span class="br0">&#125;</span> <span class="sy0">=</span> <span class="st0">&quot;Hello&quot;</span><span class="sy0">;</span> &nbsp;<span class="co1"># &lt;--- notre champ privé</span><br />
&nbsp; &nbsp; <span class="re0">$self</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>destinataire<span class="br0">&#125;</span> <span class="sy0">=</span> <a target="blank" href="http://perldoc.perl.org/functions/undef.html"><span class="kw3">undef</span></a><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1"># &lt;--- Notre champ publique sans valeur</span><br />
<br />
&nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/return.html"><span class="kw3">return</span></a> <a target="blank" href="http://perldoc.perl.org/functions/bless.html"><span class="kw3">bless</span></a><span class="br0">&#40;</span><span class="re0">$self</span><span class="sy0">,</span><span class="re0">$class</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw2">sub</span> direBonjour <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$self</span><span class="sy0">=</span><a target="blank" href="http://perldoc.perl.org/functions/shift.html"><span class="kw3">shift</span></a><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$message</span><span class="sy0">=</span><a target="blank" href="http://perldoc.perl.org/functions/shift.html"><span class="kw3">shift</span></a><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="re0">$self</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>messageBienvenue<span class="br0">&#125;</span>.<span class="st0">&quot; &quot;</span>.<span class="re0">$self</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>destinataire<span class="br0">&#125;</span>.<span class="st0">&quot; !!<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot; Message personnel : $message<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<br />
<span class="nu0">1</span><span class="sy0">;</span>
  </div>
  <div class='caption'>Module HelloWorld.pm - Ajout des champs</div>
  </div>
</p>
<p>
  Et maintenant modifions notre script :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co1">#!/usr/bin/perl</span><br />
&nbsp; <span class="kw2">use</span> strict<span class="sy0">;</span><br />
&nbsp; <span class="kw2">use</span> warnings<span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw2">use</span> HelloWorld<span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">my</span> <span class="re0">$objet</span> <span class="sy0">=</span> HelloWorld<span class="sy0">-&gt;</span><span class="me1">new</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$objet</span><span class="sy0">-&gt;</span><span class="me1">afficherClassObjet</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="co1"># écriture dans le champ</span><br />
&nbsp; <span class="re0">$objet</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>destinataire<span class="br0">&#125;</span><span class="sy0">=</span><span class="st0">&quot;gaston&quot;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="co1"># appel de la méthode d'instance</span><br />
&nbsp; <span class="re0">$objet</span><span class="sy0">-&gt;</span><span class="me1">direBonjour</span><span class="br0">&#40;</span><span class="st0">&quot;coucou&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  <div class='caption'>helloWorld.pl - Ajout des accès aux champs</div>
  </div>
</p>
<p>
  Alors le point nouveau ici est l'introduction de cette étrange syntaxe <kbd>$self->{attribut}</kbd> qui permet de stocker des associations nom/valeur dans la table de hash de l'instance, et de relire ces valeurs. A noter que toutes ces valeurs sont considérées comme des champs publiques. Le reste n'est pas bien compliqué. 
</p>
<div class='inline-box note'>
  Dans le cadre de l'initialisation des champs, il est possible de simplifier la syntaxe en remplaçant les lignes 9 à 15 par :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw1">my</span> <span class="re0">$self</span><span class="sy0">=</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; messageBienvenue<span class="sy0">=&gt;</span><span class="st0">&quot;Hello&quot;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; destinataire<span class="sy0">=&gt;</span>undef<br />
<span class="br0">&#125;</span><span class="sy0">;</span>
  </div>
  
  </div>
</div>


	<a name='chapter_8'></a>
  <h2>Les accesseurs de champ</h2>
	
<p>
  Maintenant, en programmation objet, donner ainsi l'accès aux champs sans contrôle n'est <strong>jamais</strong> une bonne idée. C'est pour cela que l'on a inventé les accesseurs, des méthodes permettant de lire et d'écrire les valeurs dans les champs, mais après contrôle. Les accesseurs permettent aussi de restreindre l'accès en lecture, en écriture, ou cacher purement le champ (s'il n'y a pas d'accesseur).
</p>
<p>
  Une méthode (personnelle) pour réaliser en Perl de tels accesseurs peut être la suivante :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co1"># Un getter et un setter en une seule fonction !!</span><br />
<span class="co1"># &nbsp; &nbsp;$objet-&gt;destinataire permet de lire la valeur</span><br />
<span class="co1"># &nbsp; &nbsp;$objet-&gt;destinataire(nouvelle_valeur) permet de la modifier</span><br />
<span class="kw2">sub</span> destinataire <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$self</span> <span class="sy0">=</span> <a target="blank" href="http://perldoc.perl.org/functions/shift.html"><span class="kw3">shift</span></a><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="co5">@_</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="re0">$self</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>destinataire<span class="br0">&#125;</span> <span class="sy0">=</span> <a target="blank" href="http://perldoc.perl.org/functions/shift.html"><span class="kw3">shift</span></a><span class="sy0">;</span> <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/return.html"><span class="kw3">return</span></a> <span class="re0">$self</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>destinataire<span class="br0">&#125;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw2">sub</span> direBonjour <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$self</span><span class="sy0">=</span><a target="blank" href="http://perldoc.perl.org/functions/shift.html"><span class="kw3">shift</span></a><span class="sy0">;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$message</span><span class="sy0">=</span><a target="blank" href="http://perldoc.perl.org/functions/shift.html"><span class="kw3">shift</span></a><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$self</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>messageBienvenue<span class="br0">&#125;</span>.<span class="st0">&quot; &quot;</span>.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$self</span><span class="sy0">-&gt;</span><span class="me1">destinataire</span> &nbsp;<span class="co1"># &lt;--- on utilise la méthode destinataire, plutôt que le champ {destinataire}</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.<span class="st0">&quot; !!<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot; Message personnel : $message<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
  </div>
  <div class='caption'>HelloWorld.pm modifié pour ajouter les accesseurs</div>
  </div>
</p>
<p>
  Maintenant modifions le fichier <kbd>helloWorld2.pl</kbd> pour utiliser notre accesseur :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw1">my</span> <span class="re0">$objet</span> <span class="sy0">=</span> HelloWorld<span class="sy0">-&gt;</span><span class="me1">new</span><span class="sy0">;</span><br />
<span class="re0">$objet</span><span class="sy0">-&gt;</span><span class="me1">destinataire</span> <span class="br0">&#40;</span><span class="st0">&quot;gaston&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp;<span class="co1"># &lt;--- utilisation de la méthode plutôt que d'écrire dans le champ</span><br />
<span class="re0">$objet</span><span class="sy0">-&gt;</span><span class="me1">direBonjour</span><span class="br0">&#40;</span><span class="st0">&quot;coucou&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  <div class='caption'>helloWorld.pl</div>
  </div>
</p>
<p>
  Du coup, nous disposons du <b>champ $self->{destinataire}</b>, utilisé en interne dans l'objet, relativement protégé de l'extérieur. Et la méthode <kdd>$self->destinataire</kdd> utilisable en lecture (sans paramètres), ou en écriture (avec paramètre). Il est ainsi possible de rendre l'attribut seulement lisible, ou seulement modifiable, ou quasi invisible en ne mettant pas de méthode du tout (cas du champ $self->{messageBienvenue}). 
</p>


	<a name='chapter_9'></a>
  <h2>Héritage</h2>
	
<p>
  Nous avons une classe, un constructeur, des instances, des méthodes statiques et d'instance, des champs statiques et d'instances, des accesseurs, bref, nous voilà presque complet. Il nous manque juste la notion d'héritage. 
</p>
<p>
  Faire hériter une classe d'une autre classe, se fait très simplement par l'utilisation de la syntaxe <kbd>use base</kbd> et une bidouille dans le constructeur. Pour tester cela, nous allons créer un nouveau module <kbd>HelloUniverse.pm</kbd> :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/package.html"><span class="kw3">package</span></a> HelloUniverse<span class="sy0">;</span><br />
<span class="kw2">use</span> strict<span class="sy0">;</span><br />
<span class="kw2">use</span> warnings<span class="sy0">;</span><br />
<br />
<span class="kw2">use</span> base <span class="st0">&quot;HelloWorld&quot;</span><span class="sy0">;</span> <span class="co1"># &lt;--- Héritage de la classe de base</span><br />
<br />
<span class="kw2">sub</span> <span class="kw2">new</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$class</span><span class="sy0">=</span><a target="blank" href="http://perldoc.perl.org/functions/shift.html"><span class="kw3">shift</span></a><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1"># 1. Le point important : on exécute le constructeur de la classe de base qui devient notre $self</span><br />
&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$self</span><span class="sy0">=</span>HelloWorld<span class="sy0">-&gt;</span><span class="me1">new</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1"># 2. utilisation de la méthode &quot;destinataire&quot; de HelloWorld</span><br />
&nbsp; &nbsp; <span class="re0">$self</span><span class="sy0">-&gt;</span><span class="me1">destinataire</span><span class="br0">&#40;</span><span class="st0">&quot;Universe&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1"># 3. Re-Bénédiction de l'instance de la classe HelloUniverse</span><br />
&nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/return.html"><span class="kw3">return</span></a> <a target="blank" href="http://perldoc.perl.org/functions/bless.html"><span class="kw3">bless</span></a><span class="br0">&#40;</span><span class="re0">$self</span><span class="sy0">,</span><span class="re0">$class</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="nu0">1</span><span class="sy0">;</span>
  </div>
  <div class='caption'>HelloUniverse.pm</div>
  </div>
</p>
<p>
  La seule partie un peu nouvelle est, mise à part l'utilisation naturelle de <kbd>use base</kbd>, le point 1 qui consiste à récupérer une instance de la classe de base à travers l'exécution constructeur. Comme il s'agit d'une instance déjà bénite, on peut utiliser la méthode héritée <kbd>destinataire</kbd> (point 2) pour définir un nom par défaut. Ensuite on re-bénit (point 3) l'instance avec la classe de l'objet courant <kbd>HelloUniverse</kbd>. Et c'est tout. Du coup, notre <kbd>helloUniverse.pl</kbd> va ressembler à cela :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co1">#!/usr/bin/perl</span><br />
&nbsp; &nbsp; <span class="kw2">use</span> strict<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">use</span> warnings<span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw2">use</span> HelloUniverse<span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$objet</span> <span class="sy0">=</span> HelloUniverse<span class="sy0">-&gt;</span><span class="me1">new</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$objet</span><span class="sy0">-&gt;</span><span class="me1">direBonjour</span><span class="br0">&#40;</span><span class="st0">&quot;coucou&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  <div class='caption'>helloUniverse.pl</div>
  </div>
</p>
<p>
  Il suffit de lancer ce script pour voir un convaincant <kbd>Hello Universe</kbd> apparaître. 
</p>


	<a name='chapter_10'></a>
  <h2>Héritage multiple</h2>
	
<p>
  Déjà, que l'on soit pour ou contre l'héritage multiple (plusieurs classes de base), ce dernier est disponible en Perl. Prenons l'exemple de l'ajout de constantes à notre classe <kbd>HelloUniverse</kbd>. Les constantes peuvent passer par un héritage à la classe Exporter qui permet de faire remonter des contantes dans l'espace de noms qui utilise le module. 
</p>
<p>
  Nous allons donc ajouter, <b>après</b> le <kbd>use base "HelloWorld"</kbd> le code suivante :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw2">use</span> base <span class="st0">&quot;Exporter&quot;</span><span class="sy0">;</span> <span class="co1"># &lt;--- Deuxième héritage</span><br />
<br />
<span class="kw2">use</span> constant PI <span class="sy0">=&gt;</span> <span class="nu0">3.14</span><span class="sy0">;</span><br />
<br />
<span class="kw1">our</span> <span class="re0">@EXPORT</span> <span class="sy0">=</span> <a target="blank" href="http://perldoc.perl.org/functions/qw.html"><span class="kw3">qw</span></a><span class="br0">&#40;</span>PI<span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  <div class='caption'>HelloUnivers.pm - Héritage multiple</div>
  </div>
</p>
<p>
  Pour utiliser notre constante dans <kbd>helloUniverse.pl</kbd> ajoutons avant le <kbd>new HelloUniverse</kbd> :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;...Et l'univers est &quot;</span>.PI.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="sy0">;</span>
  </div>
  
  </div>
</p>
<p>
  En relançant l'execution, nous voyons apparaître la valeur de PI. 
</p>


	<a name='chapter_11'></a>
  <h2>Surcharge de méthode</h2>
	
<p>
  Maintenant surchargeons le script <kbd>direBonjour</kbd> de sorte à modifier le comportement apporté par la classe <kbd>HelloWorld</kbd> :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  &nbsp; <span class="kw2">sub</span> direBonjour <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$self</span><span class="sy0">=</span><a target="blank" href="http://perldoc.perl.org/functions/shift.html"><span class="kw3">shift</span></a><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;Nous somme seul dans l'univers<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># Appel de la méthode parente en lui fournissant le paramètre restant</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$self</span><span class="sy0">-&gt;</span><span class="me1">SUPER</span><span class="sy0">::</span><span class="me2">direBonjour</span><span class="br0">&#40;</span><a target="blank" href="http://perldoc.perl.org/functions/shift.html"><span class="kw3">shift</span></a><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
  </div>
  <div class='caption'>HelloUniverse.pm - surcharge de la méthode direBonjour</div>
  </div>
</p>
<p>
 Toute la magie est dans la dernière ligne et la syntaxe <kbd>$self->SUPER::</kbd> qui permet de faire appel à la méthode de la classe de base. 
</p>



	<a name='chapter_12'></a>
  <h2>Faire un singleton</h2>
	
<p>
  Pour conclure, voyons comment utiliser tout cela pour fabriquer un objet singleton, c'est à dire un objet dont il ne peut y avoir qu'une seule instance. D'abord un code d'exemple :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://perldoc.perl.org/functions/package.html"><span class="kw3">package</span></a> Singleton<span class="sy0">;</span><br />
<span class="kw2">use</span> strict<span class="sy0">;</span><br />
<span class="kw2">use</span> warnings<span class="sy0">;</span><br />
<br />
<span class="kw1">my</span> <span class="re0">$instance</span><span class="sy0">;</span> <span class="co1"># &lt;--- La variable d'instance : un champ statique</span><br />
<br />
<span class="kw2">sub</span> Instance <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1"># on vérifie qu'une instance n'a pas déjà été crée</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a target="blank" href="http://perldoc.perl.org/functions/defined.html"><span class="kw3">defined</span></a> <span class="re0">$instance</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="co1"># Création de l'instance avec un champ &lt;kbd&gt;timestamp&lt;/kbd&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="co1"># pour nous servir de preuve de l'unicité de l'instance.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$instance</span><span class="sy0">=</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timestamp<span class="sy0">=&gt;</span>time<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="co1"># Bénédiction de l'instance de la classe Singleton</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="co1"># Comme la fonction peut être appelée par :: on ne peut pas</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="co1"># compter l'argument inséré par -&gt;. On utilise donc</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="co1"># la macro __PACKAGE__ ce qui revient au même;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<a target="blank" href="http://perldoc.perl.org/functions/bless.html"><span class="kw3">bless</span></a><span class="br0">&#40;</span><span class="re0">$instance</span><span class="sy0">,</span>__PACKAGE__<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="co1"># On retourne l'instance unique</span><br />
&nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/return.html"><span class="kw3">return</span></a> <span class="re0">$instance</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw2">sub</span> timestamp <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$self</span><span class="sy0">=</span><a target="blank" href="http://perldoc.perl.org/functions/shift.html"><span class="kw3">shift</span></a><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/return.html"><span class="kw3">return</span></a> <span class="re0">$self</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>timestamp<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
<span class="br0">&#125;</span><br />
<br />
<span class="nu0">1</span><span class="sy0">;</span>
  </div>
  <div class='caption'>Singleton.pm</div>
  </div>
</p>
<p>
  Et pour tester notre singleton :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co1">#!/usr/bin/perl</span><br />
&nbsp; &nbsp; <span class="kw2">use</span> strict<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">use</span> warnings<span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw2">use</span> Singleton<span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> Singleton<span class="sy0">::</span><span class="me2">Instance</span><span class="sy0">-&gt;</span><span class="me1">timestamp</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> Singleton<span class="sy0">-&gt;</span><span class="me1">Instance</span><span class="sy0">-&gt;</span><span class="me1">timestamp</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="sy0">;</span>
  </div>
  <div class='caption'>singleton.pl</div>
  </div>
</p>
<p>
  A l'exécution, vous constatez que les timestamp sont bien les mêmes, il s'agit donc du même objet à chaque appel, que ce soit par un <kbd>::</kbd> ou un <kbd>-></kbd>. 
</p>
<p>
  La seule chose un peu nouvelle là dedans est l'utilisation d'un champ statique (my $instance) et privé pour stocker notre instance bénite si elle ne l'est pas déjà (<kbd>!defined</kbd>). Ensuite, vu que l'on veut appeler la méthode <kbd>Instance</kbd> par les deux syntaxes (:: ou ->), on ne peut compter sur un classique <kbd>my $class=shift;</kbd> (voir les premiers chapitres). On utilise donc à la place la macro Perl <kbd>__PACKAGE__</kbd> qui est remplacée à la compilation par le nom complet du paquet. 
</p>


	<a name='chapter_13'></a>
  <h2>Conclusion</h2>
	
<p>
  Voilà, fin du petit tour sur les objets en Perl. Alors il faut être bien conscient qu'il doit y avoir autant de méthode d'implémentation d'objet en Perl que de développeur, c'est même une des grandes caractéristiques de ce langage. Celle-ci est la mienne et elle est bien sur critiquable, et tout critique est évidemment la bienvenue <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/smile.gif" title="Smiling" alt="Smiling" class="smiley-content"/>.
</p>

    ]]></content>
  </entry>
</feed>
