<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sukria.net &#187; Moose</title>
	<atom:link href="http://www.sukria.net/fr/archives/tag/moose/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sukria.net/fr</link>
	<description>I will press many keys on my keyboard causing an implementation to occur.</description>
	<lastBuildDate>Wed, 18 Jan 2012 17:11:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Tu sors pas sans ton manteau !</title>
		<link>http://www.sukria.net/fr/archives/2007/09/14/tu-sors-pas-sans-ton-manteau/</link>
		<comments>http://www.sukria.net/fr/archives/2007/09/14/tu-sors-pas-sans-ton-manteau/#comments</comments>
		<pubDate>Fri, 14 Sep 2007 16:53:19 +0000</pubDate>
		<dc:creator>sukria</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Coat]]></category>
		<category><![CDATA[Moose]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.sukria.net/fr/archives/2007/09/14/tu-sors-pas-sans-ton-manteau/</guid>
		<description><![CDATA[Voilà, le manteau collection automne-hiver 2007 est sorti, bientôt dans votre gallerie du CPAN. use Coat ! Tweet blog tools and plugins from www.zeitblog.comNo related posts.]]></description>
			<content:encoded><![CDATA[<p>Voilà, <a href="http://www.sukria.net/en/archives/2007/09/14/coat-my-answer-to-moose-dependencies/">le manteau collection automne-hiver 2007 est sorti</a>, bientôt dans votre gallerie du CPAN.</p>
<p><a href="http://www.sukria.net/perl/coat/">use Coat !</a></p>
<div id='teoShare' ><div id='teo2Google'>
		<!-- Place this tag where you want the +1 button to render -->
		<g:plusone size='tall' annotation='none'></g:plusone>

		<!-- Place this render call where appropriate -->
		<script type='text/javascript'>
		  (function() {
			var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
			po.src = 'https://apis.google.com/js/plusone.js';
			var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
		  })();
		</script>
		</div><div id="teoTweet" >
		<a href="http://twitter.com/share" class="twitter-share-button" data-count="none" data-via="sukria">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> </div></div><div style="height:0px; width:0px; overflow:hidden;"><a href="http://www.zeitblog.com/?in=plugin">blog tools and plugins from www.zeitblog.com</a></div><p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.sukria.net/fr/archives/2007/09/14/tu-sors-pas-sans-ton-manteau/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Présentation de Moose au YAPC 2007</title>
		<link>http://www.sukria.net/fr/archives/2007/08/30/presentation-de-moose-au-yapc-2007/</link>
		<comments>http://www.sukria.net/fr/archives/2007/08/30/presentation-de-moose-au-yapc-2007/#comments</comments>
		<pubDate>Thu, 30 Aug 2007 12:24:30 +0000</pubDate>
		<dc:creator>sukria</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Moose]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.sukria.net/fr/archives/2007/08/30/presentation-de-moose-au-yapc-2007/</guid>
		<description><![CDATA[Les slides de la présentation Moose de Stevan Little sont disponibles. Très bon à lire pour ceux qui veulent savoir ce qui se cache derrière ce caribou. Tweet blog tools and plugins from www.zeitblog.comRelated posts: Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 1 Cet article inaugure une série consacrée à Moose &#8230; <a href="http://www.sukria.net/fr/archives/2007/08/30/presentation-de-moose-au-yapc-2007/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.iinteractive.com/moose/yapc_eu_2007_slides/start.html">Les slides de la présentation Moose de Stevan Little</a> sont disponibles. Très bon à lire pour ceux qui veulent savoir ce qui se cache derrière ce <a href="http://www.iinteractive.com/moose/">caribou</a>.</p>
<div id='teoShare' ><div id='teo2Google'>
		<!-- Place this tag where you want the +1 button to render -->
		<g:plusone size='tall' annotation='none'></g:plusone>

		<!-- Place this render call where appropriate -->
		<script type='text/javascript'>
		  (function() {
			var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
			po.src = 'https://apis.google.com/js/plusone.js';
			var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
		  })();
		</script>
		</div><div id="teoTweet" >
		<a href="http://twitter.com/share" class="twitter-share-button" data-count="none" data-via="sukria">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> </div></div><div style="height:0px; width:0px; overflow:hidden;"><a href="http://www.zeitblog.com/?in=plugin">blog tools and plugins from www.zeitblog.com</a></div><p>Related posts:<ol>
<li><a href='http://www.sukria.net/fr/archives/2007/08/20/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet/' rel='bookmark' title='Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 1'>Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 1</a> <small>Cet article inaugure une série consacrée à Moose qui vise...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2007/08/21/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-2/' rel='bookmark' title='Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 2'>Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 2</a> <small>Cet article est la seconde partie d&#8217;une série consacrée à...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2007/08/24/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-4/' rel='bookmark' title='Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 4'>Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 4</a> <small>Cet article est la quatrième partie d&#8217;une série consacrée à...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.sukria.net/fr/archives/2007/08/30/presentation-de-moose-au-yapc-2007/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 4</title>
		<link>http://www.sukria.net/fr/archives/2007/08/24/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-4/</link>
		<comments>http://www.sukria.net/fr/archives/2007/08/24/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-4/#comments</comments>
		<pubDate>Fri, 24 Aug 2007 15:17:25 +0000</pubDate>
		<dc:creator>sukria</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Moose]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.sukria.net/fr/archives/2007/08/24/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-4/</guid>
		<description><![CDATA[Cet article est la quatrième partie d&#8217;une série consacrée à Moose qui vise à montrer comment écrire du Perl Objet moderne. Les exemples de code sont tous testés avec l&#8217;excellent shell Devel::REPL. Dans notre précédent article, nous avons vu comment utiliser les Moose::Role pour définir des armes. Ajourd&#8217;hui nous allons créer une nouvelle classe de &#8230; <a href="http://www.sukria.net/fr/archives/2007/08/24/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-4/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>Cet article est la quatrième partie d&#8217;une série consacrée à <a href="http://www.iinteractive.com/moose/">Moose</a> qui vise à montrer comment écrire du Perl Objet moderne. Les exemples de code sont tous testés avec l&#8217;excellent shell <a href="http://search.cpan.org/author/MSTROUT/Devel-REPL-1.001000/lib/Devel/REPL.pm">Devel::REPL</a>.</em></p>
<p><a href="http://www.sukria.net/fr/archives/2007/08/22/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-3/">Dans notre précédent article</a>, nous avons vu comment utiliser les Moose::Role pour définir des armes. Ajourd&#8217;hui nous allons créer une nouvelle classe de héros, les mages, qui vont nous servir à illustrer un concept tout aussi magique : la coercition (<em>coercion</em> en anglais). Cet article est dédicacé à Jérôme Bourgeois qui m&#8217;a donné l&#8217;idée de faire intervenir un mage dans cette série, merci à lui.</p>
<p>Nous allons aujourd&#8217;hui créer la classe « Mage » qui modélisera un nouveau type de héros. Pour commencer, et avant de s&#8217;attaquer à la coercition, nous allons spécialiser la classe Mage. Nous voulons qu&#8217;un mage soit un héros comme un autre à ceci prêt qu&#8217;il est plus chétif (c&#8217;est bien connu, les mages sont tous végétariens, ça facilite la circulation des fluides énergétiques, mais ça freine sensiblement le développement de la masse musculaire).</p>
<p>Bref. Un mage est un Héros disions-nous :</p>
<pre>
package Mage;
use Moose;
extends 'Heros';
</pre>
<p>Mais un mage est plus faible qu&#8217;un héros conventionnel, nous voulons donc altérer sa force et son endurance. Pour cela, Moose nous permet de modifier un attribut hérité en préfixant le nom dudit attribut par un &#8220;+&#8221; :</p>
<pre>
has '+force' => (default => 2);
has '+endurance' => (default => 2);
</pre>
<p>Les attributs force et endurance hérités de la classe Héros (<a href="http://www.sukria.net/fr/archives/2007/08/20/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet/">définie dans le permiet article de cette série</a>) vaudront donc 2 pour un Mage, au lieu de 3.</p>
<pre>
Perl> $merlin = new Mage name => "Merlin"
$Mage1 = Mage=HASH(0x8b082c4);

Perl> $merlin->force
2
</pre>
<p>Maintenant, nous allons enrichir le mage en le dottant d&#8217;un familier (pour nos amis non-rôliste, rapellons que les familiers sont des petites créatures qui accompagnent les mages). Pour cela, nous allons faire intervenir le mécanisme de coercition, en créant un attribut « familier ».</p>
<p>La coercition va nous permettre de donner à l&#8217;accesseur de l&#8217;attribut familier une chaîne en entrée et celui-ci se chargera de convertir la chaîne en un objet Heros.<br />
Pour cela, il nous faut définir un type de champ, et cela se fera grâce qu module <code>Moose::Util::TypeConstraints</code> :</p>
<pre>
package Mage;
use Moose;
use Moose::Util::TypeConstraints;

use Heros;
subtype 'Familier'
    => as 'Object'
    => where  {$_->isa('Heros')};
</pre>
<p>Maintenant nous disposons d&#8217;un type d&#8217;attribut nommé « Familier » qui cache un objet de la classe « Heros ».<br />
Nous allon à présent définir la coercition qui doit s&#8217;opérer lorsqu&#8217;un attribut de ce type est modifié avec une chaîne de caractères :</p>
<pre>
coerce 'Familier'
    => from 'Str'
        => via {new Heros
            name => $_,
            force => 1,
            endurance => 1};
</pre>
<p>Nous convertissons donc la chaîne donnée en Heros dont le nom est précisément la chaîne fournie. Au passage, comme le familier est une petite créature, nous écrasons les valeurs par défaut du Héros en force et endurance. Le lecteur comprendra ici que nous pourrions définir une classe Familier pour l&#8217;occasion.<br />
Maintenant, il nous reste à déclarer l&#8217;attribut à proprement parlé :</p>
<pre>
has 'familier' => (
    is => 'rw',
    isa => 'Familier',
    coerce => 1
);
</pre>
<p>On note la présence du mot-clef &#8220;coerce&#8221; ici qui active la coercition. Ce mécanisme étant désactivé par défaut pour éviter les mauvaises surprises.</p>
<p>Bien. Vérifions que tout se comporte comme prévu :</p>
<pre>
Perl> $merlin->familier('sarkopette')
$Heros1 = Heros=HASH(0x8b2bb8c);

$merlin->familier->force
1

$merlin->familier->name
sarkopette
</pre>
<p>Le coercition a bien eu lieu, lorsque l&#8217;accesseur familier() est utilisé, une instanciation de Heros a lieu, comme par magie. </p>
<div id='teoShare' ><div id='teo2Google'>
		<!-- Place this tag where you want the +1 button to render -->
		<g:plusone size='tall' annotation='none'></g:plusone>

		<!-- Place this render call where appropriate -->
		<script type='text/javascript'>
		  (function() {
			var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
			po.src = 'https://apis.google.com/js/plusone.js';
			var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
		  })();
		</script>
		</div><div id="teoTweet" >
		<a href="http://twitter.com/share" class="twitter-share-button" data-count="none" data-via="sukria">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> </div></div><div style="height:0px; width:0px; overflow:hidden;"><a href="http://www.zeitblog.com/?in=plugin">blog tools and plugins from www.zeitblog.com</a></div><p>Related posts:<ol>
<li><a href='http://www.sukria.net/fr/archives/2007/08/20/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet/' rel='bookmark' title='Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 1'>Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 1</a> <small>Cet article inaugure une série consacrée à Moose qui vise...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2007/08/22/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-3/' rel='bookmark' title='Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 3'>Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 3</a> <small>Cet article est la troisième partie d&#8217;une série consacrée à...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2007/08/21/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-2/' rel='bookmark' title='Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 2'>Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 2</a> <small>Cet article est la seconde partie d&#8217;une série consacrée à...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.sukria.net/fr/archives/2007/08/24/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-4/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 3</title>
		<link>http://www.sukria.net/fr/archives/2007/08/22/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-3/</link>
		<comments>http://www.sukria.net/fr/archives/2007/08/22/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-3/#comments</comments>
		<pubDate>Wed, 22 Aug 2007 09:12:26 +0000</pubDate>
		<dc:creator>sukria</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Moose]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.sukria.net/fr/archives/2007/08/22/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-3/</guid>
		<description><![CDATA[Cet article est la troisième partie d&#8217;une série consacrée à Moose qui vise à montrer comment écrire du Perl Objet moderne. Les exemples de code sont tous testés avec l&#8217;excellent shell Devel::REPL. Dans notre précédent article, nous avons vu comment spécialiser une classe en créant la classe Barbare à partir de la classe Heros. Aujourd&#8217;hui &#8230; <a href="http://www.sukria.net/fr/archives/2007/08/22/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-3/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>Cet article est la troisième partie d&#8217;une série consacrée à <a href="http://www.iinteractive.com/moose/">Moose</a> qui vise à montrer comment écrire du Perl Objet moderne. Les exemples de code sont tous testés avec l&#8217;excellent shell <a href="http://search.cpan.org/author/MSTROUT/Devel-REPL-1.001000/lib/Devel/REPL.pm">Devel::REPL</a>.</em></p>
<p><a href="http://www.sukria.net/fr/archives/2007/08/21/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-2/">Dans notre précédent article</a>, nous avons vu comment spécialiser une classe en créant la classe Barbare à partir de la classe Heros. Aujourd&#8217;hui nous allons découvrir un autre mécanisme important que Moose nous permet de réaliser : l&#8217;interfaçage. Aujourd&#8217;hui, nous allons jouer avec les Moose::Role.</p>
<p>Moose nous permet de définir des interfaces au moyen de la classe Moose::Role. Nous allons utiliser ce mécanisme pour armer Conan. Maintenant qu&#8217;il sait se battre, crier et encaisser des coups, il lui faut une arme ! Regardez-le avec son regard aggard, un barbare à mains nues ça ne ressemble à rien !</p>
<p>Un <em>rôle</em> en Moose est une classe particulière, qui ne peut pas être instanciée et qui spécifie un modèle. D&#8217;autres classe &#8211; instanciables &#8211; pourront implémenter ce rôle et devront par là-même respecter les restrictions de ce dernier.</p>
<p>Nous allons donc créer une rôle « Arme » qui imposera à toutes les armes dignes de ce nom (les classes <code>Moose</code> qui implémenteront le <code>Moose::Role</code> « Arme ») de fournir une méthode <code>degats()</code>.</p>
<p>Ensuite nous modifierons la classe Heros pour que chaque Heros (et pas uniquement les barbares) puisse disposer d&#8217;une arme.<br />
Commençons par la fin, et modifions la classe Heros (<a href="http://www.sukria.net/fr/archives/2007/08/20/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet/">définie dans le premier article de cette série</a>). Nous devons pouvoir prendre en compte la présence d&#8217;une arme, il nous faut donc un nouvel attribut pour stocker cet objet :</p>
<pre>
package Heros;
[...]

has 'arme' => (
    is => 'rw',
    does => 'Arme',
    predicate => 'has_arme'
);
</pre>
<p>Deux notions nouvelles ici : <code>does</code>, qui nous permet d&#8217;éxiger que l&#8217;objet contenu dans cet attribut implémente le role « Arme » et <code>predicate</code> qui nous laisse définir le nom d&#8217;une méthode dédiée à tester la présence de l&#8217;attribut (<code>$heros->has_arme</code> renverra vrai si une arme est définie, faux sinon).</p>
<p>Maintenant, nous voulons que notre arme soit prise en compte lors d&#8217;une attaque au cas où le héros en possède une. Nous allons pour cela utiliser la méthode définie dans le prédicat de l&#8217;attribut :</p>
<pre>
package Heros;
[...]

sub attaque
{
    my ($self) = @_;
    my $bonus = 0;
    if ($self->has_arme) {
        $bonus = $self->arme->degats;
    }
    return $self->force + $bonus + int(rand(10) + 1);
}
</pre>
<p>Bien, on constate que maintenant, l&#8217;attaque d&#8217;un héros prend en compte les dégâts de l&#8217;arme, si celui-ci en possède une. Ces dégâts sont obtenus en appelant la méthode degats() de l&#8217;arme. Il nous faut donc être certains que l&#8217;objet qui tient rôle d&#8217;arme implémente bien une méthode de ce nom. Et c&#8217;est là qu&#8217;intervient Moose::Role :</p>
<pre>
package Arme;

use Moose::Role;
requires 'degats';

1;
</pre>
<p>Tout simplement. Ici nous déclarons un Moose::Role nommé Arme qui spécifie une chose : <em>toutes les armes doivent proposer une méthode degats()</em>.</p>
<p>Il ne nous reste plus qu&#8217;à créer notre première arme. J&#8217;avais pensé commencer avec un gourdin mais quand j&#8217;ai vu la tête de Conan, j&#8217;ai compris que c&#8217;était une mauvaise idée&#8230; Hahem. Bref, créons un glaive donc.</p>
<pre>
package Glaive;
use Moose;
with ('Arme');

sub degats
{
    return 3;
}
1;
</pre>
<p>Ici, le mot-clef <code>with</code> permet de déclarer que notre classe implémente le role Arme. Cela nous impose donc de proposer une méthode degats (le lecteur pourra s&#8217;amuser à reproduire l&#8217;exemple sans la méthode en question pour voir ce qui se passe).</p>
<p>Bien, maintenant, tout semble en place. Jouons un peu avec toutes ces nouveautés. Comme nous avons modifié la classe Heros et que Barbare en hérite, nous devons avoir le support des armes avec un Barbare, vérifions cela avec conan :</p>
<pre>
Perl> my $conan = new Barbare name => 'Conan'
$Barbare1 = Barbare=HASH(0x8ada0a4);

Perl> $conan->has_arme
0
</pre>
<p>On a bien le prédicat <code>has_arme</code> ajouté par le nouvel attribut <code>arme</code> de la classe Heros. Maintenant, testons la validité de nos propos en essayant de faire une aberration en attribuant un Heros comme arme pour conan (bon d&#8217;accord, on pourrait y voir une certaine logique&#8230;)</p>
<pre>
Perl> $conan->arme(new Heros name => 'Bilbon')
Runtime error: Attribute (arme) does not pass the
type constraint (__ANON__) with Heros=HASH(0x8ae87d0)
</pre>
<p>En effet, dans notre modèle, un Heros n&#8217;est pas une arme (du moins pas encore, pauvre Bilbon) et l&#8217;attribut arme ne se laisse pas abuser aussi facilement. Conan n&#8217;aura qu&#8217;à bien se tenir et utiliser un glaive.</p>
<pre>
Perl> $conan->arme(new Glaive)
$Glaive1 = Glaive=HASH(0x8ada074);
</pre>
<p>C&#8217;est mieux. Les attaques de Conan vont maintenant être augmentées de 3 points grâce au glaive. Laissons le mot de la fin à Conan, fier qu&#8217;il est de sa nouvelle acquisition :</p>
<pre>
Perl> $conan->attaque
Ourgh!
14
Perl> $conan->attaque
Mabangaaa!
16
Perl> $conan->attaque
Yeeeeaaa!
13
</pre>
<p><a href="http://www.sukria.net/fr/archives/2007/08/24/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-4/">Dans notre prochain article</a>, nous découvrirons la puissance de la coercition d&#8217;attribut en créant la classe « Mage ».</p>
<div id='teoShare' ><div id='teo2Google'>
		<!-- Place this tag where you want the +1 button to render -->
		<g:plusone size='tall' annotation='none'></g:plusone>

		<!-- Place this render call where appropriate -->
		<script type='text/javascript'>
		  (function() {
			var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
			po.src = 'https://apis.google.com/js/plusone.js';
			var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
		  })();
		</script>
		</div><div id="teoTweet" >
		<a href="http://twitter.com/share" class="twitter-share-button" data-count="none" data-via="sukria">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> </div></div><div style="height:0px; width:0px; overflow:hidden;"><a href="http://www.zeitblog.com/?in=plugin">blog tools and plugins from www.zeitblog.com</a></div><p>Related posts:<ol>
<li><a href='http://www.sukria.net/fr/archives/2007/08/21/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-2/' rel='bookmark' title='Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 2'>Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 2</a> <small>Cet article est la seconde partie d&#8217;une série consacrée à...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2007/08/20/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet/' rel='bookmark' title='Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 1'>Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 1</a> <small>Cet article inaugure une série consacrée à Moose qui vise...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2007/08/24/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-4/' rel='bookmark' title='Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 4'>Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 4</a> <small>Cet article est la quatrième partie d&#8217;une série consacrée à...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.sukria.net/fr/archives/2007/08/22/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 2</title>
		<link>http://www.sukria.net/fr/archives/2007/08/21/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-2/</link>
		<comments>http://www.sukria.net/fr/archives/2007/08/21/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-2/#comments</comments>
		<pubDate>Tue, 21 Aug 2007 08:36:52 +0000</pubDate>
		<dc:creator>sukria</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Moose]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.sukria.net/fr/archives/2007/08/21/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-2/</guid>
		<description><![CDATA[Cet article est la seconde partie d&#8217;une série consacrée à Moose qui vise à montrer comment écrire du Perl Objet moderne. Les exemples de code sont tous testés avec l&#8217;excellent shell Devel::REPL. Dans notre précédent article, nous avons vu comment créer une classe &#8220;Heros&#8221; et nous avons joué avec Conan et lui attribuant un nom &#8230; <a href="http://www.sukria.net/fr/archives/2007/08/21/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>Cet article est la seconde partie d&#8217;une série consacrée à <a href="http://www.iinteractive.com/moose/">Moose</a> qui vise à montrer comment écrire du Perl Objet moderne. Les exemples de code sont tous testés avec l&#8217;excellent shell <a href="http://search.cpan.org/author/MSTROUT/Devel-REPL-1.001000/lib/Devel/REPL.pm">Devel::REPL</a>.</em></p>
<p><a href="http://www.sukria.net/fr/archives/2007/08/20/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet/">Dans notre précédent article</a>, nous avons vu comment créer une classe &#8220;Heros&#8221; et nous avons joué avec Conan et lui attribuant un nom et en le torturant un peu. Nous allons voir dans cet article comment le spécialiser en &#8220;Barbare&#8221; afin de lui donner plus de relief.</p>
<p>Nous voulons que la classe &#8220;Barbare&#8221; soit une spécialisation de la classe &#8220;Heros&#8221; et qu&#8217;elle présente les particularités suivantes :</p>
<ul>
<li>un Barbare peut posséder une armure</li>
<li>un Barbare pousse un crie de guerre à chaque attaque</li>
</ul>
<p>Mais avant tout, il nous faut dire ce qu&#8217;est un Barbare, il s&#8217;agit d&#8217;un Heros :</p>
<pre>
package Barbare;

use Moose;
extends (qw(Heros));
</pre>
<p>Le mot-clef <code>extends</code> est exporté par Moose dans notre espace de noms, il permet de déclarer l&#8217;héritage d&#8217;une classe envers une autre. Ici, vous l&#8217;avez compris, &#8220;Barbare&#8221; hérite de &#8220;Heros&#8221;. Vérifions de suite que l&#8217;héritage a bien eu lieu:</p>
<pre>
Perl> my $conan = new Barbare name => 'Conan';
$Barbare1 = Barbare=HASH(0x8acb7b0);
Perl> $conan->name
Conan
Perl> $conan->pv
20
Perl>
</pre>
<p>Nous avons bien les attributs d&#8217;un Héros, tout va bien.</p>
<p>Nous voulons qu&#8217;un barbare puisse posséder une armure, et ainsi amortir encore davantage les coups qu&#8217;il reçoie. Cela se fera en deux étapes : ajouter l&#8217;attribut &#8220;armure&#8221; pour stocker la valeur de ladite protection, et subtilement altérer le comportement de la méthode blessure() héritée de la classe Heros.</p>
<pre>
has 'armure' => (
    is => 'rw',
    isa => 'Int',
    default => 0
);
</pre>
<p>Rien de bien compliqué ici, un nouvel attribut. Maintenant, la partie intéressante :</p>
<pre>
around 'blessure' => sub {
    my $orig = shift;
    my ($self, $degats) = @_;
    if ($self->armure) {
        $degats = $degats - $self->armure;
        $degats = 0 if $degats < 0;
    }
    $self->$orig($degats);
};
</pre>
<p>Le mot-clef &#8220;around&#8221; nous permet d&#8217;envelopper l&#8217;appel d&#8217;une méthode (ici &#8220;blessure&#8221;) afin d&#8217;en modifier le comportement pour la classe que nous décrivons. Nous définissons donc une méthode (<code> => sub {} </code>) qui reçoit en argument respectivement : la référence vers la méthode originelle (<code>$orig</code>), la référence de l&#8217;instance en cours (<code>$self</code>) puis les arguments passés lors de l&#8217;appel (<code>$degats</code>). Il nous convient ensuite de faire ce que bon nous semble avec cela.</p>
<p>On constate que la dernière instruction de notre encapsulation est l&#8217;appel de la méthode originelle (celle de Heros donc) : <code><br />
$self->$orig($degats);</code>. Si nous enlevons cette ligne, l&#8217;appel de la méthode originelle n&#8217;aura tout simplement pas lieu.</p>
<p>Nous avons juste pris soin de modifier <code>$degats</code> dans notre encapsulation, et <em>voilà</em>. Si le barbare dispose d&#8217;une armure (<code>if ($self->armure)</code>) les dégâts sont amortis d&#8217;autant. Testons cela :</p>
<pre>
Perl> $conan->pv
20
Perl> $conan->blessure(4)
19
Perl> $conan->armure(1)
1
Perl> $conan->blessure(4)
19
</pre>
<p>Avec son endurance de 3 et son armure de 1, Conan amortit maintenant totalement les blessures de 4 ! Mais quel homme ce Conan !</p>
<p>Nous allons maintenant doter Conan de cris de guerre, en commençant par l&#8217;attribut &#8220;cris&#8221; qui sera d&#8217;un nouveau type : &#8216;ArrayRef&#8217; :</p>
<pre>
has 'cris' => (
    is => 'rw',
    isa => 'ArrayRef',
    default => sub {[qw(Yeeeeaaa! Ourgh! Mabangaaa!)]},
);
</pre>
<p>La seule particularité ici est l&#8217;encapsulation de la liste dans une fonction, cela est nécessaire pour le bon fonctionnement des accesseurs.<br />
Maintenant que les cris sont définis (et le barbare pourra en apprendre de nouveaux, car nous déclarons l&#8217;attribut en read/write), il nous faut une méthode pour crier :</p>
<pre>
sub crie
{
    my ($self) = @_;
    return $self->cris->[int(rand(@{$self->cris}))];
}
</pre>
<p>Voyons-voir si cela se comporte comme prévu :</p>
<pre>
Perl> $conan->cris
$ARRAY1 = [
            'Yeeeeaaa!',
            'Ourgh!',
            'Mabangaaa!'
          ];
Perl> $conan->crie
Mabangaaa!
Perl> $conan->crie
Ourgh!
Perl>
</pre>
<p>Il nous reste à venir intercepter l&#8217;appel à la méthode &#8220;attaque&#8221; pour pousser un cri <em>avant</em> que celle-ci s&#8217;éxecute ; cela se fera au moyen d&#8217;une structure similaire à celle vue ci-dessus avec &#8216;around&#8217; mais avec un autre corchet : &#8220;before&#8221; (on dispose évidemment de son pendant &#8220;after&#8221; également) :</p>
<pre>
before 'attaque' => sub {
    my ($self) = @_;
    print $self->crie."\n";
};
</pre>
<p>Maintenant, vérifions que Conan pousse la chansonette à chaque attaque :</p>
<pre>
Perl> $conan->attaque
Mabangaaa!
11
Perl> $conan->attaque
Ourgh!
12
</pre>
<p>Conan est désormais un barbare digne de ce nom, et il peut snober les petits héros de pacotille si communs lorsqu&#8217;il les croise dans une taverne. Sacré Conan.</p>
<p><a href="http://www.sukria.net/fr/archives/2007/08/22/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-3/">Dans notre article suivant</a>, nous utiliserons Moose::Role afin d&#8217;ajouter une arme à notre classe Heros. Conan poura donc brandir un glaive, sacré Conan !</p>
<div id='teoShare' ><div id='teo2Google'>
		<!-- Place this tag where you want the +1 button to render -->
		<g:plusone size='tall' annotation='none'></g:plusone>

		<!-- Place this render call where appropriate -->
		<script type='text/javascript'>
		  (function() {
			var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
			po.src = 'https://apis.google.com/js/plusone.js';
			var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
		  })();
		</script>
		</div><div id="teoTweet" >
		<a href="http://twitter.com/share" class="twitter-share-button" data-count="none" data-via="sukria">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> </div></div><div style="height:0px; width:0px; overflow:hidden;"><a href="http://www.zeitblog.com/?in=plugin">blog tools and plugins from www.zeitblog.com</a></div><p>Related posts:<ol>
<li><a href='http://www.sukria.net/fr/archives/2007/08/22/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-3/' rel='bookmark' title='Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 3'>Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 3</a> <small>Cet article est la troisième partie d&#8217;une série consacrée à...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2007/08/20/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet/' rel='bookmark' title='Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 1'>Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 1</a> <small>Cet article inaugure une série consacrée à Moose qui vise...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2007/08/24/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-4/' rel='bookmark' title='Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 4'>Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 4</a> <small>Cet article est la quatrième partie d&#8217;une série consacrée à...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.sukria.net/fr/archives/2007/08/21/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 1</title>
		<link>http://www.sukria.net/fr/archives/2007/08/20/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet/</link>
		<comments>http://www.sukria.net/fr/archives/2007/08/20/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet/#comments</comments>
		<pubDate>Mon, 20 Aug 2007 12:27:29 +0000</pubDate>
		<dc:creator>sukria</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Moose]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.sukria.net/fr/archives/2007/08/20/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet/</guid>
		<description><![CDATA[Cet article inaugure une série consacrée à Moose qui vise à montrer comment écrire du Perl Objet moderne. Les exemples de code sont tous testés avec l&#8217;excellent shell Devel::REPL. Jusqu&#8217;à hier, je croyais connaître Perl. Hier j&#8217;ai découvert Moose. Il s&#8217;agit d&#8217;une extension du système objet de Perl. Au début je dois avouer que j&#8217;étais &#8230; <a href="http://www.sukria.net/fr/archives/2007/08/20/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>Cet article inaugure une série consacrée à <a href="http://www.iinteractive.com/moose/">Moose</a> qui vise à montrer comment écrire du Perl Objet moderne. Les exemples de code sont tous testés avec l&#8217;excellent shell <a href="http://search.cpan.org/author/MSTROUT/Devel-REPL-1.001000/lib/Devel/REPL.pm">Devel::REPL</a>.</em></p>
<p>Jusqu&#8217;à hier, je croyais connaître Perl.  Hier j&#8217;ai découvert Moose. Il s&#8217;agit d&#8217;une extension du système objet de Perl.  Au début je dois avouer que j&#8217;étais scéptique. J&#8217;avais tort.</p>
<p>Moose est une extension qui enrichi le système objet de Perl5 d&#8217;une façon profonde.</p>
<p>C&#8217;est à dire :</p>
<ul>
<li>une syntaxe élégante (avec des mot-clef qui ont du sens)</li>
<li>une meta-classe digne de ce nom (constructeur et accesseurs par défaut)</li>
<li>un système d&#8217;interface</li>
<li>un système d&#8217;héritage propre</li>
<li>une gestion fine des attributs des objets.</li>
</ul>
<p>Au lieu de vanter ses mérites en long en large et en travers, je propose à ceux qui en ont envie de me suivre au travers d&#8217;un exemple concret : nous allons découvrir ensemble Moose en modélisant Conan le Barbare ! (quoi de plus épique, sans déconner ?).</p>
<p>Notre premier objectif est de disposer d&#8217;une classe Heros qui décrive un héros de base.<br />
Pour commencer, ce héros devra avoir un nom :</p>
<pre>
package Heros;
use Moose;

has 'name' => (
    is => 'ro',
    required => 1,
    isa => 'Str'
);
</pre>
<p>Avec ces quelques lignes, nous venons de dire beaucoup de choses. Tout d&#8217;abord, Heros est un objet Moose, ce qui nous fournit un constructeur par défaut et tout un jeu d&#8217;accesseurs évolués.  Nous disons également que les objets de la classe Heros ont impérativement un attribut &#8220;name&#8221; et que cet attribut n&#8217;est pas modifiable.</p>
<p>Regardons ce que cela donne:</p>
<pre>
Perl> $perso = new Heros name => 'Conan'
$Heros1 = Heros=HASH(0x8abe7d8);

Perl> $perso->name
Conan

Perl> $perso->name('Merlin')
Runtime error: Cannot assign a value to a
read-only accessor at (eval 62) line 1
</pre>
<p>Très bien, tout ça est parfait. Nous assignons un nom lors de l&#8217;instanciation, mais ne pouvons pas le modifier par la suite.  C&#8217;est bien ce que nous avons décrit.</p>
<p>Nous voulons maintenant donner de la vie (et de la mort !) à notre héros, pour cela il nous faut deux nouveaux attributs : un nombre de points de vie et un score en endurance (qui nous permettra d&#8217;amortir les dégâts pris lors d&#8217;une attaque).</p>
<pre>
has 'pv' => (
    is => 'rw', required => 1, isa => 'Int',
    default => 20,
);

has 'endurance' => (
    is => 'rw', required => 1, isa => 'Int',
    default => 3
);
</pre>
<p>Notre personnage aura donc 20 points de vie lors de sa naissance, et amortira 3 points de dégâts lors d&#8217;un choc reçu.<br />
C&#8217;est très bien, mais il nous faut détecter la mort du personnage lorsque ses points de vie atteindront 0&#8230;</p>
<p>Pour cela Moose nous permet d&#8217;attacher des déclencheurs (trigger) à des attributs. C&#8217;est ce que nous allons faire pour l&#8217;attribut &#8220;pv&#8221; :</p>
<pre>
has 'pv' => (
    is => 'rw', required => 1, isa => 'Int',
    default => 20,
    trigger => sub {
            my ($self, $pv, @args) = @_;
            $self->meurt if $pv == 0;
        }
);
</pre>
<p>Maintnant, lorsque les point de vie arrivent à zéro, la méthode meurt() est appelée. Il nous reste donc à la définir :</p>
<pre>
sub meurt
{
    my ($self) = @_;
    $self->endurance(0);
    print $self->name . " est mort !\n";
}
</pre>
<p>Très bien, amusons-nous cruellement à tuer Conan maintenant :</p>
<pre>
Perl> $perso->pv
20
Perl> $perso->pv(0)
Conan est mort !
0
Perl>
</pre>
<p>C&#8217;est bien ce que nous voulons, lorsque les PV sont nul, le personnage meurt.  Mais cette façon arbitraire de faire perdre des points de vie au personnage n&#8217;est pas très orthodoxe pour les rôlistes que nous sommes. Il nous faut une méthode blessure() qui sera dédiée à encaisser les coups, et ce de la bonne façon (en amortissant les dégâts avec l&#8217;endurance) :</p>
<pre>
sub blessure
{
    my ($self, $degats) = @_;
    $degats = $degats - $self->endurance;
    $degats = 0 if $degats < 0;
    my $pv = $self->pv - $degats;
    $pv = 0 if $pv < 0;
    $self->pv($pv);
}
</pre>
<p>Très bien, nous pouvons désormais blesser Conan en prenant en compte son endurance :</p>
<pre>
Perl> $perso->pv
20
Perl> $perso->blessure(4)
19
Perl>
</pre>
<p>Pour terminer (et surtout pour être honnète vis à vis de Conan), il nous faut donner à notre héros la possibilité de causer des dégâts. Pour cela il a besoin naturellement d&#8217;un score en force et d&#8217;une méthode pour frapper.</p>
<pre>
has 'force' => (
    is => 'rw', required => 1, isa => 'Int',
    default => 3
);

sub attaque
{
    my ($self) = @_;
    return $self->force + int(rand(10) + 1);
}
</pre>
<p>Voici donc une attaque qui prend la force et y ajoute un score compris entre 1 et 10 :</p>
<pre>
Perl> $perso->attaque
7
Perl> $perso->attaque
9
Perl>
</pre>
<p>Voilà, notre héros est désormais armé pour arpenter les chemins de terre et y pourfendre bêtes et immondices.</p>
<p><a href="http://www.sukria.net/fr/archives/2007/08/21/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-2/">Dans notre prochain article</a> nous verrons comment étendre la classe &#8220;Heros&#8221; en classe &#8220;Barbare&#8221;, afin de spécialiser Conan, et lui donner encore plus de prestence (il va être content le Conan).</p>
<div id='teoShare' ><div id='teo2Google'>
		<!-- Place this tag where you want the +1 button to render -->
		<g:plusone size='tall' annotation='none'></g:plusone>

		<!-- Place this render call where appropriate -->
		<script type='text/javascript'>
		  (function() {
			var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
			po.src = 'https://apis.google.com/js/plusone.js';
			var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
		  })();
		</script>
		</div><div id="teoTweet" >
		<a href="http://twitter.com/share" class="twitter-share-button" data-count="none" data-via="sukria">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> </div></div><div style="height:0px; width:0px; overflow:hidden;"><a href="http://www.zeitblog.com/?in=plugin">blog tools and plugins from www.zeitblog.com</a></div><p>Related posts:<ol>
<li><a href='http://www.sukria.net/fr/archives/2007/08/21/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-2/' rel='bookmark' title='Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 2'>Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 2</a> <small>Cet article est la seconde partie d&#8217;une série consacrée à...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2007/08/22/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-3/' rel='bookmark' title='Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 3'>Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 3</a> <small>Cet article est la troisième partie d&#8217;une série consacrée à...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2007/08/24/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet-partie-4/' rel='bookmark' title='Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 4'>Jouons avec Moose (ou comment réapprendre le Perl Objet) &#8211; partie 4</a> <small>Cet article est la quatrième partie d&#8217;une série consacrée à...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.sukria.net/fr/archives/2007/08/20/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

