[SP-pm] Data::Manager, alguém utiliza este troço ?!

Blabos de Blebe blabos at gmail.com
Thu Sep 5 12:32:36 PDT 2013


Opa,

Tá no radar :)


2013/9/5 Lucas Oliveira <lucasmateus.oliveira em gmail.com>

>
> Solli e a quem interessar, fiz um cadastro e login completo para
> exemplificar o uso do Data::Manager + I18N que quiser dar uma olhada ta ai.
>
> https://github.com/luma777/catalyst-data-manager-i18n
>
>  Não fiz o README ainda mas os agradecimentos vai para o Eden que me
> ensinou boa parte do que está ai :D
>
>
> Em 04/09/2013, às 01:15, Hernan Lopes <hernanlopes em gmail.com> escreveu:
>
> Eu prefiro deixar minhas validacoes juntos com as definicoes dos atributos
> dos meus objetos, pois provavelmente eu vou validar um objeto antes de
> fazer algo com ele.
> Então eu faco o seguinte (o exemplo abaixo é para exemplificar atraves da
> analise do mesmo, ele não irá compilar):
>
> Em resumo:
> 1. defino os campos dentro de um hash, juntos com as validacoes
> 2. faco um loop para adicionar (com moose) cada campo na classe
> 3. defino um metodo salvar e esse metodo salvar vai verificar se o
> atributo tem alguma validacao que deve ser executada
>
> Entao eu termino com algo assim:
>
> package My::Class;
> use Moose;
>
> #meta definicao dos meus atributos.. fica dentro de um hash... os
> atributos ainda nao foram declarados
> #nelas residem as validacoes, coerce, sql etc tudo que é simples e
> relacionado a esse campo
> #consigo incluir por exemplo um array com items para eu validar antes de
> salvar, etc
> #ex
> my $attrs = {
>     'preco' => {
>         # isa => 'Int', #opcional
>         req => 1,
>         validation_regex => '(\d+)', # vou usar isso antes do metodo save
>         coerce => sub { #   Vai executar tambem isso antes do save
>             my ( $self, $value ) = @_;
>             $value =~ s|^ +| +\$|g;
>             $value =~ s|(.+)(,\|\.)00\$|$1|gi;
>             $value =~ s|\D||gi;
>             return $value;
>         },
>         sql =>
>           {
>             "type"       => "integer",
>             "null_value" => 0
>           },
>         validacao_extra => [
>           {
>             rotulo => 'Verifica se contem numeros na mensagem',
>             validacao => sub {
>               my ( $campo ) = @_;
>               return 1 if "valido" eq "valido";
>               return 0;
>             },
>             msg_erro => "Tem erro nesse campo"
>           }
>           ,
>           .... e depois adicionar o "validacao_extra" la ao final no
> before_save
>           ... e pronto...
>
>         ]
>     },
>     'url' => {
>         req              => 1,
>         validation_regex => '^http',
>         sql          => {
>             type    => 'string',
>             "index" => 'not_analyzed',
>         }
>     },
>
>     'idade' => {
>         req              => 1,
>         validation_regex => '(\d+)',
>         sql          => {
>             "type"       => "integer",
>             "null_value" => 0
>         },
>     },
> };
>
> # declara cada atributo para esta classe
> foreach my $attr ( keys $attrs ) {
>     #Mete o has dentro do foreach pra declarar cada chave dos meus $attrs
>     has $attr => (
>         is => 'rw', #podia vir do meu config la de cima ne...
>         ( exists $attrs->{$attr}->{default} )
>         ? (
>             default => $attrs->{$attr}->{default}
>           )
>         : (),
>     );
> }
>
> #coerce nos valores, é usado antes do metodo save... mas pode muito bem
> usar o coerce do moo(u|se)
> sub coerce {
>     my ($self) = @_;
>     foreach my $attr ( keys %$attrs ) {
>         if ( exists $attrs->{$attr}->{coerce} && defined $self->$attr ) {
>             $self->$attr(
>                 $attrs->{$attr}->{coerce}->( $self, $self->$attr ) );
>         }
>     }
> }
>
> #valida antes de salvar
> #pode por exemplo verificar se foi setado e executar o $attrs->{ $attr
> }->{ validation_regex }, etc
> sub validate {
>     my ($self) = @_;
>     foreach my $attr ( keys $attrs ) {
>         return 0
>           if exists $attrs->{$attr}->{req}
>               and $attrs->{$attr}->{req} == 1
>               and !defined $self->$attr;
>          if ( exists $attrs->{ $attr }->{ validation_regex } ) {
>             //valida a bagaca
>             //pode ler de $self, ou receber o valor como parametro da sub
> validate, etc
>          }
>     }
>     return 1;
> }
>
> #before save...
> before 'save' => sub {
>     my ($self) = @_;
>     $self->coerce();
> };
>
> #save somente se validate
> sub save {
>     my ($self) = @_;
>     next unless $self->validate();
> }
>
>
>
> abs,
>
> Hernan
>
>
>
>
>
>
>
>
>
>
> 2013/9/3 Blabos de Blebe <blabos em gmail.com>
>
>> Na verdade foi até coincidência o Solli tocar no assunto, pq assim como
>> mapas, eu ia perguntar isso pra vcs em breve.
>>
>>
>> 2013/9/3 Blabos de Blebe <blabos em gmail.com>
>>
>>> > Blabos, e se você tiver 2 formulários na mesma página, por exemplo, um
>>> de login e um de cadastro ? Vai ter que melhorar na gambi né ? heheheheheh
>>>
>>> Correto.
>>>
>>> > Se mudar o nome do campo entao… chora hehehe
>>>
>>> Correto denovo.
>>>
>>> > Marcar o campo errado em vermelho vai precisar de mais gambi :D
>>>
>>> Mais ou menos. Eu uso uma alternativa, no exemplo. Mas sim, é melhor
>>> marcar o campo com vermelho.
>>>
>>> > Tem muitas vantagens usar o Data::Manager
>>>
>>> Correto denovo.
>>>
>>> O porém é que o meu exemplo é exatamente específico. Um form, quatro
>>> campos.
>>>
>>> Não to dizendo que nao vou usar o Data::Manager, ou alguma solução
>>> parecida. Só nao vou usar nessa semana :)
>>>
>>> As soluções apresentadas são apenas o mais pá-pow que dá pra fazer com
>>> *a* hard-restriction desse sprint: tempo; e uma soft-restriction:
>>> Data::Manager é novo pra mim.
>>>
>>> Depois eu refatoro. Tá previsto isso.
>>>
>>> Tá pronto x Tá bom.
>>>
>>> No meu caso nesse momento, tá pronto é mandatório. Quem me conhece sabe
>>> o quanto eu gosto de gambiarra e o quanto tá custando esse tá pronto.
>>>
>>> :)
>>>
>>> []'s
>>>
>>>
>>>
>>>
>>>
>>> 2013/9/3 Lucas Oliveira <lucasmateus.oliveira em gmail.com>
>>>
>>>>
>>>> Blabos, e se você tiver 2 formulários na mesma página, por exemplo, um
>>>> de login e um de cadastro ? Vai ter que melhorar na gambi né ? heheheheheh
>>>>
>>>> Se mudar o nome do campo entao… chora hehehe
>>>>
>>>> Se precisar fazer um "pirulito" para importar para a base a validação
>>>> não é aproveitável… esqueçe
>>>>
>>>> Marcar o campo errado em vermelho vai precisar de mais gambi :D
>>>>
>>>> Tem muitas vantagens usar o Data::Manager
>>>>
>>>>
>>>> Em 03/09/2013, às 18:30, Blabos de Blebe <blabos em gmail.com> escreveu:
>>>>
>>>> Opa,
>>>>
>>>> O meu caso é muito simples (pequeno) e o meu tempo é curto. O que foi
>>>> mais rápido pra mim foi essa tosqueria aqui:
>>>>
>>>> No controller:
>>>>
>>>> ...
>>>> my $errors  = [];
>>>>
>>>> ## not null
>>>> foreach my $field ( keys %{$fields} ) {
>>>>     push @{$errors}, 'empty_' . $field
>>>>       unless $fields->{$field};
>>>> }
>>>>
>>>> ## unique
>>>> foreach my $field (qw{ username email }) {
>>>>     push @{$errors}, 'already_' . $field
>>>>       if $rs_user->find( { $field => $fields->{$field} } );
>>>> }
>>>>
>>>> ## invalid email
>>>> push @{$errors}, 'invalid_email'
>>>>   unless Email::Valid->address( $fields->{email} );
>>>>
>>>> if ( @{$errors} > 0 ) {
>>>>     $c->stash->{user}   = $fields;
>>>>     $c->stash->{errors} = $errors;
>>>>     return;
>>>> }
>>>> ...
>>>>
>>>> No template:
>>>>
>>>>     [% IF errors.size > 0 %]
>>>>         <div data-alert class="alert-box alert">
>>>>             [% FOREACH error IN errors %]
>>>>                 [% msg_block = 'msg_' _ error %]
>>>>                 [% PROCESS $msg_block %]<br>
>>>>             [% END %]
>>>>             <a href="#" class="close">×</a>
>>>>         </div>
>>>>     [% END %]
>>>> ...
>>>>
>>>> [% BLOCK msg_empty_full_name %]
>>>>     Você precisa preencher o seu nome completo.
>>>> [% END %]
>>>>
>>>> [% BLOCK msg_empty_username %]
>>>>     Você precisa preencher o seu username.
>>>> [% END %]
>>>> ...
>>>>
>>>>
>>>>
>>>> Deve ter formas mais inteligentes de fazer isso, mas no momento, a mais
>>>> inteligente pra mim, é a que eu consigo fazer mais rápido. Esse é meu
>>>> "único" form.
>>>>
>>>> []'s
>>>>
>>>>
>>>> 2013/9/3 Solli Honorio <shonorio em gmail.com>
>>>>
>>>>> Blabos, o que você está imaginando para validar ? Estilo old-school
>>>>> com um encadeamento de if ? Dispatch table ? NDA ?
>>>>>
>>>>> Abraços,
>>>>>
>>>>> Solli Honorio
>>>>>
>>>>>
>>>>> Em 3 de setembro de 2013 16:35, Blabos de Blebe <blabos em gmail.com>escreveu:
>>>>>
>>>>> Em alguns casos, complexidade é um pouco ponto de vista.
>>>>>>
>>>>>> Acho que entendi a abordagem do mantovani, mas pro meu caso
>>>>>> específico, acho que é também o overhead, já que eu só valido 4 campos em
>>>>>> uma situação eventual. Estou cogitando nem usar o Data::Manager.
>>>>>>
>>>>>> Se fosse um cazilhao de campos sendo validados constantemente, acho
>>>>>> que valeira a pena.
>>>>>>
>>>>>> Mantovani, cuidado pra não ficar aparafusando pregos, certo!?
>>>>>>
>>>>>> []'s
>>>>>>
>>>>>>
>>>>>> 2013/9/3 Solli Honorio <shonorio em gmail.com>
>>>>>>
>>>>>>> Sério mesmo Mantovani que vc acha que um sistema de fila é a solução
>>>>>>> para eu validar se todos os campos de um formulário estão dentro do
>>>>>>> aguardado para trabalhar no  banco de dados ?
>>>>>>>
>>>>>>> Mantovani, só posso dizer que estou orgulhoso de você... vejo que
>>>>>>> você terá um excelente futuro na industria de tecnologia (coisa que eu não
>>>>>>> tive), pois este é bem o comportamento dos vendedores de TI. Você está
>>>>>>> agregando complexidade numa lugar que estou tentando agregar simplicidade
>>>>>>> :D !!!
>>>>>>>
>>>>>>> Abraços,
>>>>>>>
>>>>>>> Solli Honorio
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Em 3 de setembro de 2013 14:58, Daniel de Oliveira Mantovani <
>>>>>>> daniel.oliveira.mantovani em gmail.com> escreveu:
>>>>>>>
>>>>>>> 2013/9/3 Solli Honorio <shonorio em gmail.com>:
>>>>>>>> > Lucas,
>>>>>>>> >
>>>>>>>> > Obrigado pelo retorno. Ontem a noite estudei o código do
>>>>>>>> Data::Manager e ví
>>>>>>>> > que realmente não rola fazer o que eu estava querendo fazer
>>>>>>>> (passar uma
>>>>>>>> > pilha de mensagem e receber de acordo com o contexto) e ai estou
>>>>>>>> > encaminhando para a mesma solução que você.
>>>>>>>>
>>>>>>>> " o que eu estava querendo fazer (passar uma pilha de mensagem e
>>>>>>>> receber de acordo com o contexto)"
>>>>>>>>
>>>>>>>> Shonorio, repetindo o AMQP se encaixa perfeitamente. Eu sugiro que
>>>>>>>> você leia o link que eu te enviei. Se um serviço na sua máquina vai
>>>>>>>> te
>>>>>>>> poupar centenas de linhas de código, talvez nessa situação, nesse
>>>>>>>> contexto obscuro no qual não foi definido pelo interlocutor seja uma
>>>>>>>> boa.
>>>>>>>>
>>>>>>>> Se você acha que isso é demais para você, eu sinto muito que alguém
>>>>>>>> com pelo menos 15/20 anos de experiência ainda não saiba formular
>>>>>>>> uma
>>>>>>>> pergunta. Perguntas genéricas, respostas genéricas. E ainda acho
>>>>>>>> extremamente desnecessário o seu ataque gratuito, mas se você ainda
>>>>>>>> não percebeu isso afasta as pessoas da lista.
>>>>>>>>
>>>>>>>> >
>>>>>>>> > Como vc faz com o I18N ?
>>>>>>>> >
>>>>>>>> > O Renato Cron publicou um 'template'  (
>>>>>>>> https://github.com/AwareTI/MyApp )
>>>>>>>> > de como eles estão utilizando o Data::Manager. Estudei o código e
>>>>>>>> achei
>>>>>>>> > engenhoso, mas ainda quero manter um melhor controle do ResultSet
>>>>>>>> porquê
>>>>>>>> > quero devolver uma estrutura mais complexa de informação.
>>>>>>>> >
>>>>>>>> > Abraços,
>>>>>>>> >
>>>>>>>> > Solli Honorio
>>>>>>>> >
>>>>>>>> >
>>>>>>>> >
>>>>>>>> > 2013/9/3 Lucas Oliveira <lucasmateus.oliveira em gmail.com>
>>>>>>>> >>
>>>>>>>> >>
>>>>>>>> >> Normalmente eu uso sempre com I18N mas da pra quebrar o galho
>>>>>>>> assim
>>>>>>>> >>
>>>>>>>> >> <code>
>>>>>>>> >> #!/usr/bin/env perl
>>>>>>>> >>
>>>>>>>> >> use common::sense;
>>>>>>>> >> use Data::Manager;
>>>>>>>> >> use Data::Verifier;
>>>>>>>> >>
>>>>>>>> >> my %msg_data = (
>>>>>>>> >>    missing_name_last => 'Nao foi informado o campo name_last,
>>>>>>>> seu idiota
>>>>>>>> >> !',
>>>>>>>> >> );
>>>>>>>> >>
>>>>>>>> >> sub messages { $msg_data{$_[0]} || $_[0] }
>>>>>>>> >>
>>>>>>>> >> my $dm = Data::Manager->new;
>>>>>>>> >> my $dv = Data::Verifier->new(
>>>>>>>> >>     filters => [ qw(trim) ],
>>>>>>>> >>         profile => {
>>>>>>>> >>             name_first => {
>>>>>>>> >>                 required => 1,
>>>>>>>> >>                 type     => 'Str',
>>>>>>>> >>                 filters  => [ qw(collapse) ]
>>>>>>>> >>             },
>>>>>>>> >>             name_last => {
>>>>>>>> >>                 required => 1,
>>>>>>>> >>                 type     => 'Str',
>>>>>>>> >>                 filters  => [ qw(collapse) ]
>>>>>>>> >>             },
>>>>>>>> >>             age  => {
>>>>>>>> >>                 type        => 'Int'
>>>>>>>> >>             },
>>>>>>>> >>             sign => {
>>>>>>>> >>                 required    => 1,
>>>>>>>> >>                 type        => 'Str'
>>>>>>>> >>             }
>>>>>>>> >>         }
>>>>>>>> >>     );
>>>>>>>> >>
>>>>>>>> >> $dm->set_verifier( name => $dv );
>>>>>>>> >> $dm->verify( name => { name_first => 'Solli' });
>>>>>>>> >>
>>>>>>>> >> if (!$dm->success) {
>>>>>>>> >>    print &messages( $_->msgid ).$/
>>>>>>>> >>       foreach (@{ $dm->messages->messages });
>>>>>>>> >> }
>>>>>>>> >> </code>
>>>>>>>> >>
>>>>>>>> >>
>>>>>>>> >> Em 02/09/2013, às 11:10, Solli Honorio <shonorio em gmail.com>
>>>>>>>> escreveu:
>>>>>>>> >>
>>>>>>>> >> Pessoal,
>>>>>>>> >>
>>>>>>>> >> Estou tentando configurar uma mensagem padronização no
>>>>>>>> Data::Manager, mas
>>>>>>>> >> não está funcionando. Alguém aqui já utilizou o Data::Manager
>>>>>>>> para saber se
>>>>>>>> >> é possível fazer isto que eu quero ?
>>>>>>>> >>
>>>>>>>> >> O código abaixo, estou criando uma mensagem e adicionando no
>>>>>>>> Data::Manger,
>>>>>>>> >> porquê eu imaginei que quando ocorrer o problema dentro do
>>>>>>>> escopo e msgid,
>>>>>>>> >> eu teria o texto padronizado, mas o que estou recebendo é mais
>>>>>>>> uma pilha de
>>>>>>>> >> mensagem, mesmo quando não existe o erro.
>>>>>>>> >>
>>>>>>>> >> <code>
>>>>>>>> >> #!/usr/bin/env perl
>>>>>>>> >> use common::sense;
>>>>>>>> >> use Data::Manager;
>>>>>>>> >> use Data::Verifier;
>>>>>>>> >> use Data::Printer;
>>>>>>>> >>
>>>>>>>> >> my $msg = Message::Stack->new;
>>>>>>>> >> $msg->add({
>>>>>>>> >>     msgid   => 'missing_name_last',
>>>>>>>> >>     level   => 'error',
>>>>>>>> >>     scope   => 'name1',
>>>>>>>> >>     subject => 'name_last',
>>>>>>>> >>     text    => 'Não foi informado o campo name_last, seu idiota
>>>>>>>> !'} );
>>>>>>>> >>
>>>>>>>> >> my $dm = Data::Manager->new( { messages => $msg } );
>>>>>>>> >> my $dv = Data::Verifier->new(
>>>>>>>> >>     filters => [ qw(trim) ],
>>>>>>>> >>         profile => {
>>>>>>>> >>             name => {
>>>>>>>> >>                 required => 1,
>>>>>>>> >>                 type     => 'Str',
>>>>>>>> >>                 filters  => [ qw(collapse) ]
>>>>>>>> >>             },
>>>>>>>> >>             age  => {
>>>>>>>> >>                 type        => 'Int'
>>>>>>>> >>             },
>>>>>>>> >>             sign => {
>>>>>>>> >>                 required    => 1,
>>>>>>>> >>                 type        => 'Str'
>>>>>>>> >>             }
>>>>>>>> >>         }
>>>>>>>> >>     );
>>>>>>>> >>
>>>>>>>> >>
>>>>>>>> >> };
>>>>>>>> >>
>>>>>>>> >>
>>>>>>>> >> $dm->set_verifier('name1', $verifier);
>>>>>>>> >> $dm->verify('name1', { name_last => 'Honorio', name_first =>
>>>>>>>> 'Solli' });
>>>>>>>> >>
>>>>>>>> >> my $results = $dm->get_results('name1');
>>>>>>>> >> my $stack   = $dm->messages_for_scope('name1');
>>>>>>>> >>
>>>>>>>> >> say $results->success;
>>>>>>>> >>
>>>>>>>> >> say "Is invalid name_first ", $results->is_invalid('name_first');
>>>>>>>> >> say "Is invalid name_last ",  $results->is_invalid('name_last');
>>>>>>>>  # yes
>>>>>>>> >>
>>>>>>>> >> say "Is missing name_first ",
>>>>>>>> $results->is_missing('name_first'); # no
>>>>>>>> >> say "Is missing is_missing ", $results->is_missing('name_last');
>>>>>>>> # yes
>>>>>>>> >>
>>>>>>>> >> say "Missing count ", $results->missing_count;
>>>>>>>> >>
>>>>>>>> >> say "Count : ",  $stack->count ;
>>>>>>>> >> p $stack->get_message( 0 );
>>>>>>>> >> p $stack->get_message( 1 );
>>>>>>>> >>
>>>>>>>> >> </code>
>>>>>>>> >>
>>>>>>>> >>
>>>>>>>> >> --
>>>>>>>> >> "o animal satisfeito dorme". - Guimarães Rosa
>>>>>>>> >> =begin disclaimer
>>>>>>>> >>   Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>>>>>> >> SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>>>>>>>> >> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>>>>>>> >> =end disclaimer
>>>>>>>> >>
>>>>>>>> >>
>>>>>>>> >>
>>>>>>>> >> =begin disclaimer
>>>>>>>> >>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>>>>>> >>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>>>>>>>> >>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>>>>>>> >> =end disclaimer
>>>>>>>> >>
>>>>>>>> >
>>>>>>>> >
>>>>>>>> >
>>>>>>>> > --
>>>>>>>> > "o animal satisfeito dorme". - Guimarães Rosa
>>>>>>>> >
>>>>>>>> > =begin disclaimer
>>>>>>>> >    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>>>>>> >  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>>>>>>>> >  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>>>>>>> > =end disclaimer
>>>>>>>> >
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>>
>>>>>>>> -dom
>>>>>>>>
>>>>>>>> --
>>>>>>>>
>>>>>>>> Daniel de Oliveira Mantovani
>>>>>>>> Business Analytic Specialist
>>>>>>>> Perl Evangelist /Astrophysics hobbyist.
>>>>>>>> +55 11 9 8538-9897
>>>>>>>> XOXO
>>>>>>>> =begin disclaimer
>>>>>>>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>>>>>>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>>>>>>>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>>>>>>> =end disclaimer
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> "o animal satisfeito dorme". - Guimarães Rosa
>>>>>>>
>>>>>>> =begin disclaimer
>>>>>>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>>>>>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>>>>>>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>>>>>> =end disclaimer
>>>>>>>
>>>>>>>
>>>>>>
>>>>>> =begin disclaimer
>>>>>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>>>>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>>>>>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>>>>> =end disclaimer
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> "o animal satisfeito dorme". - Guimarães Rosa
>>>>>
>>>>> =begin disclaimer
>>>>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>>>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>>>>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>>>> =end disclaimer
>>>>>
>>>>>
>>>> =begin disclaimer
>>>>   Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>> SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>>>> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>>> =end disclaimer
>>>>
>>>>
>>>>
>>>> =begin disclaimer
>>>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>>>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>>> =end disclaimer
>>>>
>>>>
>>>
>>
>> =begin disclaimer
>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>> =end disclaimer
>>
>>
> =begin disclaimer
>   Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
> SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
>
>
> =begin disclaimer
>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
>
-------------- Pr�xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130905/24515c4d/attachment-0001.html>


More information about the SaoPaulo-pm mailing list